根据道路计算两个位置之间的距离

时间:2011-12-08 09:15:59

标签: iphone objective-c ios mkmapview core-location

我有两个MKCoordinateRegion个对象。根据这些对象的值,我在地图上制作了两个annotations。 然后我计算这两个位置之间的距离:

CLLocationCoordinate2D pointACoordinate = [ann coordinate];
    CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude];  

    CLLocationCoordinate2D pointBCoordinate = [ann2 coordinate];
    CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude];  

    float distanceMeters = [pointBLocation distanceFromLocation:pointALocation];

    distanceMeters = distanceMeters / 1000;

但我不确定我得到的价值是否正确。
这些值是空气距离吗?是否可以根据道路获得距离 我需要距离用户必须带车。

5 个答案:

答案 0 :(得分:4)

这些值是空中距离。

使用Apple SDK无法找到基于道路的距离。尝试直接询问Google API http://code.google.com/intl/fr-FR/apis/maps/index.html

答案 1 :(得分:4)

使用CLLocation而不是CLLocationCoordinate: -

CLLocation有一个名为

的init方法
-(id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude. 

然后使用

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

获取Road上两个CLLocation对象之间的距离。

您将获得的距离以公里为单位。

答案 2 :(得分:2)

@coolanilkothari所说的几乎是正确的,除了在ios 3.2中不推荐使用getDistanceFrom的事实。这就是苹果文档所说的..

  

getDistanceFrom:

     

返回从接收者位置到的距离(以米为单位)   指定的位置。 (在iOS 3.2中不推荐使用。使用   distanceFromLocation:替代方法。)    - (CLLocationDistance)getDistanceFrom:(const CLLocation *)location Parameters

     

位置

The other location. 
     

返回值

     

两个位置之间的距离(以米为单位)。讨论

     

此方法通过跟踪测量两个位置之间的距离   它们之间的一条线跟随地球的曲率。该   产生的弧线是一条平滑的曲线并没有考虑在内   两个位置之间的特定高度变化。可用性

Available in iOS 2.0 and later.
Deprecated in iOS 3.2.
     

在CLLocation.h中声明

答案 3 :(得分:2)

从iOS7开始,您可以通过以下方式获取该信息:

+ (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;

}

答案 4 :(得分:1)