【问题标题】:How to create a path using MKOverlayPathView?如何使用 MKOverlayPathView 创建路径?
【发布时间】:2011-01-25 16:11:58
【问题描述】:

我一直在查看 Apple 的 iOS 类参考文档,但不幸的是,我并不明智。我已经下载了他们的示例代码KMLViewer,但是他们把它复杂化了......我真正想知道的是如何生成路径并将其添加到MKMapView。文档谈到使用CGPathRef,但并没有真正解释如何使用。

【问题讨论】:

  • MKOverlayPathView 有一个 -path 属性,您可以直接使用 CGPathRef 设置该属性。您是否对如何创建 CGPathRef 感到困惑?

标签: ios mapkit mkmapview cgpath


【解决方案1】:

以下是生成路径并将其作为覆盖添加到MKMapView 的方法。我将使用MKPolylineView,它是MKOverlayPathView 的子类,并且可以让您不必引用任何CGPath,因为您改为创建MKPolyline(包含路径的数据)并使用它创建MKPolylineView(地图上数据的可视化表示)。

MKPolyline 必须使用 C 点数组 (MKMapPoint) 或 C 坐标数组 (CLLocationCoordinate2D) 创建。遗憾的是 MapKit 没有使用更高级的数据结构,例如 NSArray,但就这样吧!我将假设您有一个CLLocation 对象的NSArrayNSMutableArray 来演示如何转换为适合MKPolyline 的C 数据数组。这个数组被称为locations,你如何填充它将由你的应用程序决定——例如通过处理用户的触摸位置来填充,或者填充从网络服务下载的数据等。

在负责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 复制到其中,然后释放内存缓冲区。

【讨论】:

  • 非常好的解释...你拯救了我的一天...非常感谢。
  • 不起作用。设置折线(视图)的视觉属性的委托方法在哪里调用?我在里面放了一个日志,我观察到它永远不会被调用。我做错了吗?
  • 您是否将视图控制器设为MKMapViewDelegate?这将导致 mapView:viewForOverlay 被调用。
  • mapView:viewForOverlay 可能不会被调用的一个原因是您没有在视图控制器中设置 mapView.delete = self。 OP 省略了该步骤。
  • 哎呀,我的评论有错字。它应该说 mapView.delegate = self. self 将是视图控制器。 MKPolyline 没有委托属性,所以我不确定你为什么要设置它。它是 MKMapView 对象,需要设置它的委托才能调用 mapView:viewForOverlay:。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 2022-08-16
  • 2021-11-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多