MKOverlays结合图像平铺和KML

时间:2012-07-31 20:51:53

标签: ios kml mkoverlay

我正在尝试在平铺图像(下面的代码)顶部显示带有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

1 个答案:

答案 0 :(得分:0)

至少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:方法。