我正在尝试绘制一条跟随从KML文件中给出的坐标的线。我尝试使用几个KML解析器,但它们似乎都没有工作,所以我手动解析数据。您可以在此问题here中查看我正在使用的KML文件。
我可以通过将它们添加为Annotations来获取坐标并验证它们是否正确。它看起来像这样:
所以我看了一些制作折线的例子,但我无法弄明白。看看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 错误。
我希望有一种更简单的方法可以帮助我理解这一点。
答案 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;
}