Google Maps iOS SDK:地图上东西点之间的距离

时间:2013-05-31 08:02:05

标签: ios google-maps-sdk-ios

如何计算地图东点和西点之间的距离(以米为单位)? 假设用户改变了滚动地图的位置,然后我用mapView:didChangeCameraPosition:delegate方法捕捉到了移动,但我不知道如何计算距离。

3 个答案:

答案 0 :(得分:10)

这是一个辅助函数,可用于计算两个坐标之间的距离:

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将可见区域的四边形包裹在轴对齐的边界框中。

另一种选择是在地图视图框架的每一侧选择点,然后使用地图视图的投影将这些转换为纬度/经度,例如:

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);

答案 1 :(得分:3)

The Google Maps iOS SDK contains a bunch of geometry helpers. You want this function: GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance "Returns the great circle distance between two coordinates, in meters, on Earth. This is the shortest distance between the two coordinates on the sphere. Both coordinates must be valid."

答案 2 :(得分:0)

下面是寻找两点之间距离的代码

 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);
}];