【问题标题】:Google Maps iOS SDK: Distance between east and west points on the mapGoogle Maps iOS SDK:地图上东西点之间的距离
【发布时间】:2013-05-31 08:02:04
【问题描述】:

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

【问题讨论】:

    标签: ios google-maps-sdk-ios


    【解决方案1】:

    这是一个辅助函数,可用于计算两个坐标之间的距离(以米为单位):

    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 - 所以通过 NE 位置和 SW 位置,你会得到它们之间的对角线距离......如果你想看看地图有多少变化,得到旧的中心和新的中心didChangeCamera 的中心位置
    • 2) 获得旧中心和新中心是不够的,因为缩放可能已经改变
    • 我添加了一些关于如何计算它的更多信息的更新 - 这取决于你所说的东和西的意思。
    • 不用担心 :) 顺便说一句,我添加了您建议的代码修复,谢谢 - 不知道为什么其他人拒绝它。
    【解决方案2】:

    Google Maps iOS SDK 包含一堆geometry helpers

    你想要这个功能:

    GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance
    

    "返回地球上两个坐标之间的大圆距离,以米为单位。 这是球体上两个坐标之间的最短距离。两个坐标都必须有效。”

    【讨论】:

      【解决方案3】:

      这是查找两点之间距离的代码

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

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 1970-01-01
        • 2018-01-13
        • 2013-02-11
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 2013-01-01
        相关资源
        最近更新 更多