Рассчитать расстояние между двумя местами на основе дорог - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть два 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 ]

4 голосов
/ 08 декабря 2011

Используйте CLLocation вместо CLLocationCoordinate: -

CLLocation имеет метод init с именем

-(id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude. 

Затем используйте

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

, чтобы получить расстояние между двумя объектами CLLocationна дороге.

Расстояние, которое вы получите, в километрах.

4 голосов
/ 08 декабря 2011

Тезисы - расстояние по воздуху.

Вы не можете найти расстояние на основе дорог с помощью Apple SDK.Попробуйте напрямую обратиться к Google APIs http://code.google.com/intl/fr-FR/apis/maps/index.html

2 голосов
/ 13 января 2016

Начиная с 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;

}
2 голосов
/ 08 декабря 2011

то, что говорит @coolanilkothari, почти правильно, за исключением того факта, что getDistanceFrom устарела в ios 3.2.Это то, что должны сказать яблочные документы ..

getDistanceFrom:

Возвращает расстояние (в метрах) от местоположения получателя до указанного местоположения.(Не рекомендуется в iOS 3.2. Вместо этого используйте distanceFromLocation: метод.) - (CLLocationDistance) getDistanceFrom: (const CLLocation *) location Параметры

location

The other location. 

Возвращаемое значение

Расстояние (в метрах) между двумя точками.Обсуждение

Этот метод измеряет расстояние между двумя точками, отслеживая линию между ними, которая следует за кривизной Земли.Результирующая дуга является гладкой кривой и не учитывает конкретные изменения высоты между двумя точками.Доступность

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

Объявлено в CLLocation.h

1 голос
/ 08 декабря 2011

вам нужно просто передать координаты отправления и назначения и затем проанализировать результат.

...