web-dev-qa-db-fra.com

existe-t-il un moyen d'obtenir des indications dans mkmapview à l'aide d'une API Apple intégrée?

Je sais que les cartes Google sont connues pour être les meilleures, mais je ne veux pas avoir à télécharger un tas de bibliothèques supplémentaires et tout ça. Je préférerais faire quelque chose de simple et rapide pour obtenir un itinéraire rapide du point A au point B et en finir. Y a-t-il un moyen de faire cela avec des fonctions/bibliothèques intégrées? Quelqu'un peut-il me diriger dans la bonne direction?

MODIFIER

Je ne cherche pas à obtenir des instructions pas à pas ou quoi que ce soit dans mon cas, je veux simplement tracer une ligne du début à la fin. peut-être donner des options sur les itinéraires à prendre. Y a-t-il un moyen de le faire ou non?

26
Katushai

Dans iOS 7, vous pouvez obtenir et afficher des instructions à l'aide de MKDirectionsRequest.

Voici un exemple de code permettant d’afficher les indications entre l’emplacement actuel et un autre élément de la carte:

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 vous êtes nouveau sur iOS 7, vous devez implémenter la méthode mapView:rendererForOverlay: pour que toute superposition apparaisse. Quelque chose comme:

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

Version rapide

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

et son délégué

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

Une autre possibilité consiste à envoyer l'adresse à l'application Apple Maps. Je viens de voir cela se faire dans un cadre professionnel et c'était la méthode choisie.

1
Katushai