27

グーグルマップが最高のマップであることが知られていることは知っていますが、余分なライブラリなどをたくさんダウンロードする必要はありません。ポイントAからBへの迅速なルートを取得し、それを完了するために、すばやく簡単なことをしたいと思います。組み込み関数/ライブラリでこれを行う方法はありますか? 誰かが私を正しい方向に向けることができますか?

編集

私の場合、ターンバイターンの方向や何かを取得しようとしているのではなく、最初から最後まで線を引きたいだけです。たぶん、どのルートをとるかについてのオプションを提供します。それを行う方法はありますか、それともありませんか?

4

4 に答える 4

67

iOS 7 では、 を使用して経路を取得して表示できますMKDirectionsRequest

現在の場所から別のマップ アイテムへの道順を表示するためのサンプル コードを次に示します。

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

mapView:rendererForOverlay:iOS 7 を初めて使用する場合は、オーバーレイを表示するためのメソッドを実装する必要があります。何かのようなもの:

- (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;
}
于 2013-11-04T17:50:15.873 に答える
2

迅速なバージョン

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

およびその代理人

        func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
        let myLineRenderer = MKPolylineRenderer(polyline: (self.myRoute?.polyline)!)
        myLineRenderer.strokeColor = UIColor.redColor()
        myLineRenderer.lineWidth = 3
        return myLineRenderer
        }
于 2016-03-22T09:34:19.927 に答える
1

もう 1 つの可能性は、住所を Apple Maps アプリに送信することです。これがプロの環境で行われているのを見たばかりで、それが選択された方法でした.

于 2014-05-18T03:48:45.367 に答える
-4

ピンをタップしたときに警告ダイアログを表示する場合は、次のようにします。

- (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;
}
  • ああ、でも、.h @property (strong, nonatomic)MKMapItem *mapItem; でプロパティを作成していることに注意してください。
于 2014-09-26T12:07:16.983 に答える