Anotación a lo largo de la ruta en MapKit

Estoy usando MapKit para mostrar las direcciones entre las ubicaciones, y estoy buscando una manera de agregar una anotación que funcione de manera similar a la anotación de la ruta en la aplicación Apple Maps, donde las annotations muestran el time de viaje de cada ruta (como se muestra en la image abajo). Ya estoy dibujando las instrucciones correctamente, el problema es cómo calcular un par de coorderadas a lo largo de la ruta. Es decir, dónde colocar la anotación.

Pensé en utilizar la MKDirection (que contiene instrucciones completas, paso a paso), pero no estoy seguro de cómo generaría un par de coorderadas en algún punto del medio de la ruta.

No he podido encontrar ningún tipo de soporte para esto en la documentation de MapKit. ¿Algunas ideas?

introduzca la descripción de la imagen aquí

Así es como genero la ruta y la muestro.

 - (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; } 

Edición del interrogador:

Finalmente, funcionó con la ayuda de esta respuesta. Agregué esto al código siguiente, donde dice " Aquí hacer la magia :

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

Respuesta original:

No sé si esto funcionará o no. Solo mi idea sobre tu pregunta.

Supongo que habrías creado las routes de la siguiente manera (revisa mis comentarios en línea)

 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] } } }]; 

Agregar anotación

 -(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D) coordinate{ MyAnnotation* annotation= [[MyAnnotation alloc] init]; annotation.coordinate = coordinate; annotation.title = @"Any Title"; annotation.subtitle = @"Any Subtitle"; [yourMap addAnnotation: annotation]; } 

Tal vez no sea la forma más eficiente, pero aún debería ser rápido, sería calcular el punto medio de los puntos de inicio y finalización (es decir, promedio de latigazos y longs). Luego, itera a través de sus puntos de polilínea comprobando la distancia de cada uno a ese punto medio. Toma la pareja más cercana.

Incluso si la línea está muy curvada, el punto medio estará directamente entre los extremos. Algún punto en la curva salvaje es el más cercano a ese punto medio externo y es probable que sea un buen lugar para poner la anotación.

Una vez que tenga un MKRoute , el punto central aproximado se puede encontrar usando:

 route.polyline.coordinate 

Esto devuelve un CLLocationCoordinate2D que puede usar para centrar su anotación.

Aprecio que esta es una vieja pregunta, pero había estado buscando algo así por un time y terminé calculando manualmente el centro. Resulta que es muy sencillo desde iOS 8.

Si quieres saber el medio para swift puedes usar el siguiente código:

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

Ejemplo de uso:

 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) } } 

Sugiero que vea esto , Integrado con routing.