Google Maps iOS SDK: расстояние между точками Восток и Запад на карте
Как рассчитать расстояние (в метрах) между Восточной и Западной точками карты? Предположим, пользователь изменил положение прокрутки карты, тогда я ловлю движение с помощью метода mapView:didChangeCameraPosition: delegate, но я не знаю, как вычислить расстояние.
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); }];