【问题标题】:MKOverlays Combining Image Tiles And KMLMKOverlays 结合图像瓦片和 KML
【发布时间】:2012-07-31 20:51:53
【问题描述】:

我正在尝试在平铺图像顶部显示带有 kml 叠加层的平铺图像(下面的代码)并且收到以下错误:

'NSInvalidArgumentException',原因:'-[MKPolyline tilesInMapRect:zoomScale:]:发送到实例的选择器无法识别

是否有人对我是否正确接近多个叠加层或为什么会收到此错误有任何建议?

提前致谢!

(void)viewDidLoad
{
    [super viewDidLoad];
    // Initialize the map overlay with tiles in the app's bundle.
    NSString *tileDirectory = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Tiles"];

    MapOverlay *overlay1 = [[MapOverlay alloc] initWithDirectory:tileDirectory];

    // Locate the path to the route.kml file in the application's bundle
    // and parse it with the KMLParser.

    NSString *path = [[NSBundle mainBundle] pathForResource:@"route" ofType:@"kml"];
    NSURL *url = [NSURL fileURLWithPath:path];
    kmlParser = [[KMLParser alloc] initWithURL:url];
    [kmlParser parseKML];

    // Add all of the MKOverlay objects parsed from the KML file to the map.
    NSArray *overlay2 = [kmlParser overlays];

    [map addOverlay:overlay1];
    [map addOverlays:overlay2];

    // Set the starting location.
    CLLocationCoordinate2D startingLocation;
    startingLocation.latitude = 0.00;
    startingLocation.longitude =-0.00;

    map.region = MKCoordinateRegionMakeWithDistance(startingLocation, 4600, 4600);
    [map setCenterCoordinate:startingLocation];       
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay1
{
    MapOverlayView *view = [[MapOverlayView alloc] initWithOverlay:overlay1];
    view.overlayAlpha = 1.0;
    return view;
}


- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay2:(id <MKOverlay>)overlay2
{
    return [kmlParser viewForOverlay:overlay2];
}

@end

【问题讨论】:

    标签: ios kml mkoverlay


    【解决方案1】:

    至少viewForOverlay委托方法没有正确实现。

    您编写了两种方法:mapView:viewForOverlay:mapView:viewForOverlay2:

    但是地图视图只会调用mapView:viewForOverlay:,因为这是MKMapViewDelegate协议定义的方法名。

    mapView:viewForOverlay2: 方法将被忽略,不会被地图视图调用。

    所以当overlay2 叠加数组添加到地图时,它会调用mapView:viewForOverlay: 方法,该方法为叠加创建MapOverlayView(而不是从kmlParser 获取叠加视图)。这可能会导致问题(可能MapOverlayView 只处理MapOverlay 类型的覆盖)。


    所有覆盖都应在mapView:viewForOverlay: 方法中处理。
    要处理多种类型的叠加层,请检查overlay 类并进行相应处理:

    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
    {
        if ([overlay isKindOfClass:[MapOverlay class]])
        {
            MapOverlayView *view = [[MapOverlayView alloc] initWithOverlay:overlay];
            view.overlayAlpha = 1.0;
            return view;
        }
    
        //if not a MapOverlay, get from kmlParser...
        return [kmlParser viewForOverlay:overlay];
    }
    

    删除mapView:viewForOverlay2: 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 2015-03-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2017-04-22
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多