2013-11-04 15 views
26

So che le mappe di google sono note per essere le migliori mappe in circolazione, ma non voglio dover scaricare un sacco di librerie extra e tutto il resto. Preferirei fare qualcosa di semplice e veloce per ottenere un percorso rapido dal punto A al punto B e farlo con esso. C'è un modo per farlo con funzioni/librerie integrate? Qualcuno può indicarmi la giusta direzione?c'è un modo per ottenere indicazioni stradali in mkmapview usando una API Apple integrata?

EDIT

Non sto cercando di ottenere girare da indicazioni di svolta o qualcosa nel mio caso, voglio solo per disegnare una linea dall'inizio alla fine. forse dare opzioni su quali percorsi prendere. C'è un modo per farlo o no?

risposta

64

In iOS 7, è possibile ottenere e visualizzare le direzioni utilizzando MKDirectionsRequest.

Ecco alcuni esempi di codice per visualizzare le indicazioni dalla posizione corrente ad un altro elemento della mappa:

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

Se siete nuovi a iOS 7, avrete bisogno di implementare il metodo mapView:rendererForOverlay: per appaia qualsiasi sovrapposizione . Qualcosa di simile:

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

ho scoperto 'MKMapItem's non sono' NSCoder' compliant, così ho memorizzati 'coordinate MKMapItem' in Dati principali. Come restituire tali coordinate in un 'MKMapItem'? – Adrian

+1

@AdrianB Ci scusiamo per la risposta in ritardo, ma è possibile inizializzare un MKMapItem con un MKPlacemark, che può essere istanziato dalle coordinate. – Kamaros

1

Un'altra possibilità è inviare l'indirizzo all'app Apple Maps. Ho appena visto questo fatto in un ambiente professionale e quello era il metodo scelto.

-3

se si desidera mostrare una finestra di dialogo di avviso quando si è toccato in un Pin rendere questo:

- (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<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) { 
     MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; 
     [renderer setStrokeColor:[UIColor blueColor]]; 
     [renderer setLineWidth:5.0]; 
     return renderer; 
    } 
    return nil; 
} 
  • Oh, ma si noti che faccio un immobile nel mio .h @property (forte, nonatomic) MKMapItem * mapItem;
2

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

e il suo delegato

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