MapKit 中的沿途注释

问题描述 投票:0回答:6

我正在使用 MapKit 显示位置之间的方向,并且我正在寻找一种添加注释的方法,其工作方式类似于 Apple 地图应用程序中的路线注释,其中注释显示每条路线的旅行时间(如下图)。我已经正确绘制了方向,当前的问题是如何计算沿路线的一对坐标。即放置注释的位置。

我考虑过以某种方式使用

MKDirection
(其中包含完整的说明,一步一步),但我不确定如何生成一对位于路线中间某处的坐标。

我在 MapKit 文档中找不到对此的任何支持。有什么想法吗?

enter image description here

这就是我生成路线并显示它的方式。

- (void)generateRoute {
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.source = [MKMapItem mapItemForCurrentLocation];
    request.destination = self.destinationMapItem;
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];

    [directions calculateDirectionsWithCompletionHandler:
     ^(MKDirectionsResponse *response, NSError *error) {
         if (error) {
             // Handle Error
         } else {
             [self showRoute:response];
         }
     }];
}

- (void)showRoute:(MKDirectionsResponse *)response {
    [self.mapView removeOverlays:self.mapView.overlays];
    for (MKRoute *route in response.routes)
    {
        [self.mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
    }
    [self fitRegionToRoute];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id < MKOverlay >)overlay
{
    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    renderer.strokeColor = [UIColor blueColor];
    renderer.alpha = 0.7;
    renderer.lineWidth = 4.0;

    return renderer;
}
ios iphone ios7 mkmapview mapkit
6个回答
8
投票

提问者编辑:

终于在这个答案的帮助下成功了。我将其添加到下面的代码中,其中显示 Here do the magic:

MKMapPoint middlePoint = route.polyline.points[route.polyline.pointCount/2];
[self createAndAddAnnotationForCoordinate:MKCoordinateForMapPoint(middlePoint)];

原答案:

我不知道这是否有效。只是我对你的问题的想法。

我猜你会创建如下所示的路线 (查看我的内嵌评论)

MKDirectionsRequest *request = 
       [[MKDirectionsRequest alloc] init];
request.source = [MKMapItem mapItemForCurrentLocation];
request.destination = _destination;
request.requestsAlternateRoutes = NO;
MKDirections *directions = 
       [[MKDirections alloc] initWithRequest:request];

    [directions calculateDirectionsWithCompletionHandler:
 ^(MKDirectionsResponse *response, NSError *error) {
     if (error) {
         // Handle error
     } else {
         for (MKRoute *route in response.routes)
         {
             [_routeMap addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
             //Here do the magic
             //MKPolyline confronts to MKOverlay so you can get the coordinate like 
             //route.polyline.coordinate once you get the coordinate then you can build
             //a annotation. A annotation is nothing but a coordinate with some title.
             //According to MKOverlay coordinate property it justs gives you the 
             //center point of the overlay area
             [self createAndAddAnnotationForCoordinate:route.polyline.coordinate]
         }
     }
 }];

添加注释

-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D) coordinate{
    MyAnnotation* annotation= [[MyAnnotation alloc] init];
    annotation.coordinate = coordinate;

    annotation.title = @"Any Title";
    annotation.subtitle = @"Any Subtitle";

   [yourMap addAnnotation: annotation];

}

1
投票

如果你想了解 swift 的中间部分,可以使用以下代码:

MKCoordinateForMapPoint(route.polyline.points()[route.polyline.pointCount/2])

使用示例:

directions.calculateDirectionsWithCompletionHandler ({
     (response: MKDirectionsResponse?, error: NSError?) in

     if error == nil {
        self.showRoute(response!)
     }
     else{
        print("some error")    
     }
})

func showRoute(response:MKDirectionsResponse){
    for route in response.routes {
        self.map.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads)
        self.map.setCenterCoordinate(route.polyline.coordinate, animated: true)
        self.map.setRegion(MKCoordinateRegionMakeWithDistance(route.polyline.coordinate, route.distance*0.75, route.distance*0.75), animated: true)

        let routeAnnotation = MKPointAnnotation()
        routeAnnotation.coordinate = MKCoordinateForMapPoint(route.polyline.points()[route.polyline.pointCount/2])
        map.addAnnotation(routeAnnotation)
    }
}

0
投票

也许不是最有效的方法,但仍然可能很快,那就是计算起点和终点的中点(即,平均它们的纬度和经度)。然后,迭代折线点,检查每个点到该中点的距离。采取最接近的匹配。

即使线非常弯曲,中点也将直接位于两端之间。野生曲线上的某个点最接近外部中点,并且可能是放置注释的好地方。


0
投票

一旦有了

MKRoute
,就可以使用以下方法找到近似中心点:

route.polyline.coordinate

这会返回一个

CLLocationCoordinate2D
,您可以使用它来居中注释。

感谢这是一个老问题,但我一直在寻找类似的东西一段时间,最终手动计算了中心。事实证明,从 iOS 8 开始就非常简单了。


0
投票

对于 iOS 18.1 和 macOS 15 SwiftUI 地图,您现在可以通过以下方式获取中间点的坐标:

let middleCoord = 路线!.polyline.points()[路线!.polyline.pointCount/2].coordinate


-2
投票

我建议你看这个,与路由集成。

© www.soinside.com 2019 - 2024. All rights reserved.