Google Maps iOS SDK: расстояние между точками Восток и Запад на карте


Как рассчитать расстояние (в метрах) между Восточной и Западной точками карты? Предположим, пользователь изменил положение прокрутки карты, тогда я ловлю движение с помощью метода mapView:didChangeCameraPosition: delegate, но я не знаю, как вычислить расстояние.

3 5

3 ответа:

Вот вспомогательная функция, которая может быть использована для вычисления расстояния в метрах между двумя координатами:

double getDistanceMetresBetweenLocationCoordinates(
    CLLocationCoordinate2D coord1, 
    CLLocationCoordinate2D coord2)
{
    CLLocation* location1 = 
        [[CLLocation alloc] 
            initWithLatitude: coord1.latitude 
            longitude: coord1.longitude];
    CLLocation* location2 = 
        [[CLLocation alloc] 
            initWithLatitude: coord2.latitude 
            longitude: coord2.longitude];

    return [location1 distanceFromLocation: location2];
}

Обновление:

Это зависит от того, что вы подразумеваете под "Востоком" и "Западом" карты, так как карта может быть повернута или наклонена. Даже если она не наклонена или не повернута, из-за кривизны Земли ширина карты будет отличаться в метрах между верхней и нижней частями карты (край ближе к экватору будет шире в метрах, чем край, который находится на экваторе). дальше от экватора). Разница будет тем меньше, чем больше вы увеличены. Но предположим, что вы хотите получить расстояние в метрах между нижним левым и нижним правым углами карты, вы можете использовать это:
GMSMapView* mapView = ...;

CLLocationCoordinate2D bottomLeftCoord = 
    mapView.projection.visibleRegion.nearLeft;
CLLocationCoordinate2D bottomRightCoord = 
    mapView.projection.visibleRegion.nearRight;
double distanceMetres = getDistanceMetresBetweenLocationCoordinates(
    bottomLeftCoord, bottomRightCoord);

Если вы хотите учесть поворот / наклон, вы можете обернуть видимую область в GMSCoordinateBounds, а затем вычислить расстояние между юго-восточным и юго-западным углами, например:

GMSMapView* mapView = ...;

GMSCoordinateBounds* bounds = [[GMSCoordinateBounds alloc] 
    initWithRegion: mapView.projection.visibleRegion];
CLLocationCoordinate2D southWest = bounds.southWest;
CLLocationCoordinate2D southEast = CLLocationCoordinate2DMake(
    bounds.southWest.latitude, bounds.northEast.longitude);
double distanceMetres = getDistanceMetresBetweenLocationCoordinates(
    southWest, southEast);

Однако это может быть шире, чем область на самом деле видимый на экране, поскольку GMSCoordinateBounds обертывает четырехугольник видимой области в ограничивающую рамку, выровненную по оси.

Другой вариант-выбрать точки На каждой стороне фрейма вида карты, а затем использовать проекцию вида карты для преобразования их в lat/lon, например:

GMSMapView* mapView = ...;

CGPoint middleLeftPoint = CGPointMake(
    0, mapView.frame.size.height / 2);
CGPoint middleRightPoint = CGPointMake(
    mapView.frame.size.width, mapView.frame.size.height / 2);

CLLocationCoordinate2D middleLeftCoord = 
    [mapView.projection coordinateForPoint: middleLeftPoint];
CLLocationCoordinate2D middleRightCoord = 
    [mapView.projection coordinateForPoint: middleRightPoint];

double distanceMetres = getDistanceMetresBetweenLocationCoordinates(
    middleLeftCoord, middleRightCoord);

Google Maps iOS SDK содержит кучупомощников по геометрии .

Вам нужна эта функция:

GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance

" возвращает расстояние большого круга между двумя координатами, в метрах, на Земле. Это самое короткое расстояние между двумя координатами на сфере. Обе координаты должны быть действительными."

Здесь код для нахождения расстояния между двумя точками

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

NSString *urlString =@"https://maps.googleapis.com/maps/api/directions/json";

 NSDictionary *dictParameters = @{@"origin" : [NSString stringWithFormat:@"%@",_sourceAdd], @"destination" : [NSString stringWithFormat:@"%@",_destinationAdd], @"mode" : @"driving", @"key":@"AIzaSyD9cWTQkAxemELVXTNUCALOmzlDv5b9Dhg"};

[manager GET:urlString parameters:dictParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {



    NSDictionary *arr=responseObject[@"routes"][0][@"legs"];
    NSMutableArray *loc=[[NSMutableArray alloc]init];    

    NSString *dis,*dur;
    loc=[[arr valueForKey:@"distance"]valueForKey:@"text"];
    dis=loc[0];

    loc=[[arr valueForKey:@"duration"]valueForKey:@"text"];
    dur=loc[0];


   UIAlertView *av=[[UIAlertView alloc]initWithTitle:@"Route Info" message:[NSString stringWithFormat:@"Distance:%@ \nDuration:%@",dis,dur] delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
    [av show];


} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];