我一直在关注Apple的iOS类参考文档,不幸的是,没有人更明智。我已经下载了他们的示例代码KMLViewer
,但他们过于复杂了......我真正想知道的是如何生成路径并将其添加到MKMapView
。文档讨论了使用CGPathRef
,但没有真正解释如何。
答案 0 :(得分:20)
以下是如何生成路径并将其添加为MKMapView
的叠加层。我将使用MKPolylineView
,它是MKOverlayPathView
的子类,并且您不必引用任何CGPath
,因为您改为创建MKPolyline
(包含路径数据)并使用它来创建MKPolylineView
(地图上数据的直观表示)。
必须使用C数组点(MKPolyline
)或C数组坐标(MKMapPoint
)创建CLLocationCoordinate2D
。令人遗憾的是,MapKit不使用更高级的数据结构,例如NSArray
,但它也是如此!我将假设您有一个NSArray
或NSMutableArray
个CLLocation
个对象来演示如何转换为适合MKPolyline
的C数据数组。此数组称为locations
,您填写的方式将由您的应用确定 - 例如通过用户处理触摸位置填写,或填充从Web服务等下载的数据。
在负责MKMapView
:
int numPoints = [locations count];
if (numPoints > 1)
{
CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D));
for (int i = 0; i < numPoints; i++)
{
CLLocation* current = [locations objectAtIndex:i];
coords[i] = current.coordinate;
}
self.polyline = [MKPolyline polylineWithCoordinates:coords count:numPoints];
free(coords);
[mapView addOverlay:self.polyline];
[mapView setNeedsDisplay];
}
请注意,self.polyline在.h中声明为:
@property (nonatomic, retain) MKPolyline* polyline;
此视图控制器还应实现MKMapViewDelegate
方法:
- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease];
lineView.fillColor = [UIColor whiteColor];
lineView.strokeColor = [UIColor whiteColor];
lineView.lineWidth = 4;
return lineView;
}
您可以使用fillColor,strokeColor和lineWidth属性来确保它们适合您的应用。我刚刚带着一条简单,适度宽的纯白线。
如果您想从地图中删除路径,例如要用一些新坐标更新它,那么你会这样做:
[mapView removeOverlay:self.polyline];
self.polyline = nil;
然后重复上述过程以创建新的MKPolyline并将其添加到地图中。
虽然乍一看MapKit看起来有点可怕和复杂,但可以很容易地做一些事情,如本例所示。对于非C程序员来说,唯一可怕的一点是使用malloc创建缓冲区,使用数组语法将CLLocationCoordinates复制到其中,然后释放内存缓冲区。