iOS:获取位置之间的距离

iOS:获取位置之间的距离,ios,mkmapview,mapkit,geocoding,Ios,Mkmapview,Mapkit,Geocoding,请不要在未阅读整个问题之前将其标记为重复项 在iOS中,是否有任何方法可以在不显示地图的情况下获得两个CLLocation点之间的行驶路线长度 不像乌鸦那样飞!!!但与MK驾驶模式类似 我不能使用谷歌,因为我将不得不在谷歌地图上显示结果 我找到了这段代码,但这只在显示iOS地图时有效: -(void)showMapRouteFromCurrentLocation { CLLocationCoordinate2D currentUserCoordinate = YourCoordinate

请不要在未阅读整个问题之前将其标记为重复项

在iOS中,是否有任何方法可以在不显示地图的情况下获得两个
CLLocation
点之间的行驶路线长度

不像乌鸦那样飞!!!但与MK驾驶模式类似

我不能使用谷歌,因为我将不得不在谷歌地图上显示结果

我找到了这段代码,但这只在显示iOS地图时有效:

-(void)showMapRouteFromCurrentLocation
{
    CLLocationCoordinate2D currentUserCoordinate = YourCoordinate;
    //currentUserCoordinate.latitude=  +53.509980;
    //currentUserCoordinate.longitude =  -0.133700;

    MKPlacemark *place = [[MKPlacemark alloc]
                          initWithCoordinate:currentUserCoordinate
                          addressDictionary:nil];


    MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:place];

    NSDictionary *routeOption = [[NSDictionary alloc] initWithObjectsAndKeys:MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsDirectionsModeKey, nil];

    [mapItem openInMapsWithLaunchOptions:routeOption];
}

但这不是我所需要的。

据我所知,使用苹果的API是不可能做到的。您需要使用第三方系统在两点之间询问方向。像谷歌一样,但他们通常有其他限制,比如在地图上显示

不确定他们是否有类似的要求,但您可以向iOS7查询


看看本教程。

正如brainray所说,从iOS7中,您可以执行以下操作:

MKDirectionsRequest *routeRequest = [[MKDirectionsRequest alloc] init];
routeRequest.transportType = MKDirectionsTransportTypeAutomobile;
[routeRequest setSource:startPoint]; // startPoint is an MKMapItem with the starting lat/long coordinate
[routeRequest setDestination :endPoint]; // endPoint an MKMapItem with the ending lat/long coordinate

MKDirections *routeDirections = [[MKDirections alloc] initWithRequest:routeRequest];
[routeDirections calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * routeResponse, NSError *routeError)
{
    // Check for error and then do something with the route...
    MKRoute *route = routeResponse.routes[0];
}];

虽然Ken给出了一个很好的答案,但我还将添加将坐标转换为MKMapItem的方法:

+ (void)distanceByRoadFromPoint:(CLLocationCoordinate2D)fromPoint
                        toPoint:(CLLocationCoordinate2D)toPoint
              completionHandler:(MKDirectionsHandler)completionHandler {

    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.transportType = MKDirectionsTransportTypeAutomobile;

    request.source = [self mapItemFromCoordinate:fromPoint];
    request.destination = [self mapItemFromCoordinate:toPoint];

    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * routeResponse, NSError *routeError) {

         MKRoute *route = [routeResponse.routes firstObject];
         CLLocationDistance distance = route.distance;
         NSTimeInterval expectedTime = route.expectedTravelTime;

         //call a completion handler that suits your situation

     }];    

   }


+ (MKMapItem *)mapItemFromCoordinate:(CLLocationCoordinate2D)coordinate {

    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
    MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark];

    return item;

}

您可以获得两个CLP位置的long和lat之间的距离,但是从本机获取“驾驶”路线要比从本机获取“驾驶”路线困难得多。显然,本机本身就有这样的功能。就像在地图应用程序中一样。它不是也由SDK提供吗?
+ (void)distanceByRoadFromPoint:(CLLocationCoordinate2D)fromPoint
                        toPoint:(CLLocationCoordinate2D)toPoint
              completionHandler:(MKDirectionsHandler)completionHandler {

    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    request.transportType = MKDirectionsTransportTypeAutomobile;

    request.source = [self mapItemFromCoordinate:fromPoint];
    request.destination = [self mapItemFromCoordinate:toPoint];

    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * routeResponse, NSError *routeError) {

         MKRoute *route = [routeResponse.routes firstObject];
         CLLocationDistance distance = route.distance;
         NSTimeInterval expectedTime = route.expectedTravelTime;

         //call a completion handler that suits your situation

     }];    

   }


+ (MKMapItem *)mapItemFromCoordinate:(CLLocationCoordinate2D)coordinate {

    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
    MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark];

    return item;

}