在MapView上的点之间画一条线

时间:2014-07-29 21:56:10

标签: ios objective-c mkmapview

我正在尝试绘制一条跟随从KML文件中给出的坐标的线。我尝试使用几个KML解析器,但它们似乎都没有工作,所以我手动解析数据。您可以在此问题here中查看我正在使用的KML文件。

我可以通过将它们添加为Annotations来获取坐标并验证它们是否正确。它看起来像这样:

Points on a map

所以我看了一些制作折线的例子,但我无法弄明白。看看this教程,我尝试了这个:

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    for (NSDictionary * c in points) {
        double x = [[c valueForKey:@"x"] doubleValue];
        double y = [[c valueForKey:@"y"] doubleValue];
        CLLocationCoordinate2D coordinate;
        coordinate.latitude = y;
        coordinate.longitude     = x;
        MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinate count:points.count];
    }
}

points是一个NSArray,它包含带有坐标的 x y 键的NSDictionaries。

然而,xcode给我一个错误说:

  

将'CLLocationCoordinate2D'发送到不兼容类型'CLLocationCoordinate2D *'的参数;用&

取地址

如果我尝试添加&在coordinate之前,它在运行时出现了 BAD_ACCESS 错误。

我希望有一种更简单的方法可以帮助我理解这一点。

1 个答案:

答案 0 :(得分:2)

polylineWithCoordinates方法需要一个指向CLLocationCoordinate2D结构的C 数组的指针。

如果只放置coordinate CLLocationCoordinate2D,则编译器会发出警告。

当您发送&coordinate发送指针时,编译器警告会消失,但coordinate本身仍然是单个CLLocationCoordinate2D结构。在运行时,该方法假定您指定的指针指向CLLocationCoordinate2D结构数组,尝试在单coordinate之后解释内存的内容(你还没有分配)导致错误的访问"。

for循环中,您需要将points NSArray中的所有坐标添加到循环前分配的C数组中。 循环之后,在C数组准备好所有坐标之后,然后创建折线并将其添加到地图视图中。例如:

//Declare C array big enough to hold the number of coordinates in points...
CLLocationCoordinate2D coordinates[points.count];

int coordinatesIndex = 0;

for (NSDictionary * c in points) {
    double x = [[c valueForKey:@"x"] doubleValue];
    double y = [[c valueForKey:@"y"] doubleValue];

    CLLocationCoordinate2D coordinate;
    coordinate.latitude = y;
    coordinate.longitude = x;

    //Put this coordinate in the C array...     
    coordinates[coordinatesIndex] = coordinate;

    coordinatesIndex++;
}

//C array is ready, create the polyline...
MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:points.count];

//Add the polyline to the map...
[self.mapView addOverlay:polyline];

不要忘记实施rendererForOverlay委托方法:

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolylineRenderer *pr = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
        pr.strokeColor = [UIColor redColor];
        pr.lineWidth = 5;
        return pr;
    }

    return nil;
}