¿Hay alguna manera de obtener direcciones en mkmapview usando una API incorporada?

Sé que los mapas de Google son conocidos por ser los mejores que hay, pero no quiero tener que descargar muchas librerías adicionales y todo eso. Preferiría hacer algo rápido y simple para obtener una ruta rápida del punto A al B y terminar con eso. ¿Hay alguna manera de hacer esto con las funciones / bibliotecas incorporadas? ¿Puede alguien señalarme en la dirección correcta?

EDITAR

No estoy tratando de obtener instrucciones giro por giro ni nada en mi caso, solo quiero trazar una línea de principio a fin. tal vez dar opciones sobre qué rutas tomar. ¿Hay alguna manera de hacerlo o no?

En iOS 7, puedes obtener y mostrar indicaciones usando MKDirectionsRequest .

Aquí hay un código de muestra para mostrar las direcciones desde la ubicación actual a otro elemento del mapa:

 MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; [request setSource:[MKMapItem mapItemForCurrentLocation]]; [request setDestination:myMapItem]; [request setTransportType:MKDirectionsTransportTypeAny]; // This can be limited to automobile and walking directions. [request setRequestsAlternateRoutes:YES]; // Gives you several route options. MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { if (!error) { for (MKRoute *route in [response routes]) { [myMapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels. // You can also get turn-by-turn steps, distance, advisory notices, ETA, etc by accessing various route properties. } } }]; 

Si es nuevo en iOS 7, deberá implementar el mapView:rendererForOverlay: para que aparezca cualquier superposición. Algo como:

 - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id)overlay { if ([overlay isKindOfClass:[MKPolyline class]]) { MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; [renderer setStrokeColor:[UIColor blueColor]]; [renderer setLineWidth:5.0]; return renderer; } return nil; } 

Versión Swift

  let request = MKDirectionsRequest(); request.source = MKMapItem.mapItemForCurrentLocation(); let locationPlacemark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(13.724362, 100.515342), addressDictionary: nil); request.destination = MKMapItem(placemark: locationPlacemark); request.transportType = MKDirectionsTransportType.Any; request.requestsAlternateRoutes = true; let directions = MKDirections(request: request); directions.calculateDirectionsWithCompletionHandler ({ (response: MKDirectionsResponse?, error: NSError?) in print(response?.description) print(error?.description) guard let response = response else { //handle the error here return; } self.myRoute = response.routes[0] self.mkMapView.addOverlay(self.myRoute!.polyline) }); 

y su delegado

  func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { let myLineRenderer = MKPolylineRenderer(polyline: (self.myRoute?.polyline)!) myLineRenderer.strokeColor = UIColor.redColor() myLineRenderer.lineWidth = 3 return myLineRenderer } 

Otra posibilidad es enviar la dirección a la aplicación Apple Maps. Acabo de ver esto hecho en un entorno profesional y ese fue el método elegido.

si quieres mostrar un Diálogo de alerta cuando tocaste un Pin, haz esto:

 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { [mapView deselectAnnotation:view.annotation animated:YES]; if ([view.annotation isKindOfClass:[PinOfProject class]]) { CLLocationCoordinate2D coordinate = [view.annotation coordinate]; MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]; MKMapItem *mapitem = [[MKMapItem alloc] initWithPlacemark:placemark]; self.mapItem = mapitem; CGPoint pin = [mapView convertCoordinate:view.annotation.coordinate toPointToView:self.view]; CGRect rec = CGRectMake(pin.x-13, pin.y-14,view.frame.size.width,view.frame.size.height); [self showAlertInformationForTrash:rec]; } } -(void)showAlertInformationForTrash:(CGRect)rec{ UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Show Route?" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Route", @"Cancel", nil]; actionSheet.tag = 1; [actionSheet showFromRect:rec inView:self.view animated:YES]; } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { [self showRouteToAnnotation]; } } -(void)showRouteToAnnotation{ MKMapItem *myMapItem = self.mapItem; MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; [request setSource:[MKMapItem mapItemForCurrentLocation]]; [request setDestination:myMapItem]; [request setTransportType:MKDirectionsTransportTypeAutomobile]; // This can be limited to automobile and walking directions. [request setRequestsAlternateRoutes:NO]; // Gives you several route options. MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { if (!error) { for (MKRoute *route in [response routes]) { [self.mapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels. for (int i = 0; i < route.steps.count; i++) { MKRouteStep *step = [route.steps objectAtIndex:i]; NSString *newStep = step.instructions; NSLog(@"%@", newStep); } } } }]; } - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id)overlay { if ([overlay isKindOfClass:[MKPolyline class]]) { MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; [renderer setStrokeColor:[UIColor blueColor]]; [renderer setLineWidth:5.0]; return renderer; } return nil; } 
  • Ah, pero tenga en cuenta que hago una propiedad en mi .h @property (fuerte, no atómico) MKMapItem * mapItem;
Intereting Posts