2

这让我发疯了。我已经浏览了 stackoveflow 上的所有帖子,但没有任何内容符合要求。我正在尝试添加一个简单的折线(即不是自定义叠加)作为我的MKMapView. viewForOverlay委托上的方法永远不会被调用。地图委托被正确地为所有其他委托函数调用。以下是该viewForOverlay方法的代码:

//maanges the overlay
- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay{

    NSLog(@"does it ask for the overlay view?");

    MKOverlayView *overlayView = nil;

    return overlayView;
}

这是我构造折线并将其添加到地图的代码:

    MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];

    [thePolyline setTitle:@"line"];

    [mapView addOverlay:thePolyline];

折线实际上确实有我的点集合(大约 1000 个),所以我认为问题不存在。我是否缺少地图视图上的一些必需属性或其他一些实现?

编辑显示折线MKMapPoint生成的代码:

我使用一个包含大约 1100 个点的 xml 文件来生成折线,作为 appConfig 过程的一部分。NSXMLParser我分别用和读取和解析文件NSXMLParserDelegate。这是生成点的代码(来自协议foundCharacters中的方法NSXMLParserDelegate):

//NSXMLParserDelegate methods...
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    if(POINT){
        NSArray *arr = [string componentsSeparatedByString:@","];

        MKMapPoint pt = MKMapPointMake([[arr objectAtIndex:1]doubleValue], [[arr objectAtIndex:0]doubleValue]);

        MapPointObject *thePoint = [[MapPointObject alloc] init];
        thePoint.mapPoint = pt;

        //gives the mkmappoint to the array of points.
        [arrOfPoints addObject:thePoint];

        [thePoint release];
    }
}

这是点实际生成MKPolyline并将其提供给 mapView 的位置(来自协议didEndElement上的方法NSXMLParserDelegate):

   if([elementName isEqualToString:@"appConfig"]){
        MKMapPoint *pts = malloc([arrOfPoints count] * sizeof(MKMapPoint));

        for(int i = 0; i <= [arrOfPoints count] - 1; i++){
            MapPointObject *pointObject = [arrOfPoints objectAtIndex:i];
            pts[i] = pointObject.mapPoint;
        }

        MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];
        [thePolyline setTitle:@"line"];

        //adding the polyline to the model's mapview
        Model *theModel = [Model sharedModel];

        [theModel.mapView setVisibleMapRect:thePolyline.boundingMapRect animated:YES];
        [theModel.mapView addOverlay:thePolyline];

        free(pts);
    }

上的点数属性MKPolyline实际上表示其中有 1100 个点。

编辑:示例 XML 值:

<appConfig>
<point>-94.847587,38.977967</point>
<point>-94.844111,38.977978</point>
<point>-94.844108,38.977369</point>
<point>-94.844003,38.977369</point>
<point>-94.843955,38.974886</point>
4

3 回答 3

2

xml 文件包含坐标(纬度和经度)值。这些坐标值与MKMapPoint值(这是地图视图的纬度/经度在平面地图上的 x、y 投影)不同。

你应该存储坐标而不是MKMapPoint值(你是)。

因此,不要使用MKMapPointand polylineWithPoints,而是使用CLLocationCoordinate2Dand polylineWithCoordinates

在 xml 解析器方法中,创建并存储一个CLLocationCoordinate2Dusing CLLocationCoordinate2DMake.

pts数组应该是类型,CLLocationCoordinate2D *并且在执行 时malloc,使用sizeof(CLLocationCoordinate2D).

然后调用polylineWithCoordinates而不是polylineWithPoints.


viewForOverlay顺便说一句,在进行上述更改后 ,您还需要实际返回一个非零覆盖视图,否则您仍然看不到该行:

MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
polylineView.strokeColor = [UIColor redColor];
polylineView.lineWidth = 2.0;
return polylineView;
于 2012-05-31T13:58:00.400 回答
1

我解决了问题,但鉴于@AnnaKarenina 的原始解决方案解决了问题,我将其标记为答案。我只是发布此信息,以便为遇到它的任何其他人提供更多信息。

当我最初编写代码时,MKMapPointMake 采用如下参数:MKMapPointMake(x,y). 当我切换它时,CLLocationCoordinate2DMake采用如下参数:CLLocationCoordinate2DMake(lat,lng),或者用笛卡尔术语,CLLocationCoordinate2DMake(y,x). 对于我的特定坐标对集,这不存在,因此它从未调用 viewForOverlay 委托方法。我更改了 CLLocationCoordinate2DMake 构造函数的参数顺序,现在一切正常。

于 2012-06-01T13:28:06.387 回答
1
[self.mapView addOverlay:polyline];
[self.mapView setNeedsDisplay];

通过调用 setNeedsDisplay 强制刷新 mapView :)

于 2015-05-04T13:38:56.950 回答