精东ios:GoogleMapsiOSSDK:地图上东点和西点之间的距离

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

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];
}
UPDATE:

这取决于您对地图的“东”和“西”的意思,因为地图可能会旋转或倾斜。即使它没有倾斜或旋转,由于地球的曲率,地图的顶部和底部之间的地图宽度也将以米为单位有所不同(靠近赤道的边缘将比远离赤道的边缘以米为单位)。您越放大,差异就越小。

但是假设你想获得地图左下角和右下角之间的距离,你可以使用这个:

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

如果要考虑旋转 / 倾斜,可以将可见区域包裹在SCoordinateBounds中,然后计算东南角和西南角之间的距离,例如:

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

但是,这可能比屏幕上实际可见的区域更宽,因为SCoordinateBounds将可见区域的四边形包裹在轴对齐的边界框中。

另一种选择是在地图视图框架的每一侧选择点,然后使用地图视图的投影将其转换为 lat / lon,例如:

SMapView* 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);
5

Google Maps iOS SDK 包含一堆geometry helpers

你想要这个功能:

SGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance

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

0

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

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
NSString *urlString =@"https://maps.googlea.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);
}];

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(242)
Warming:什么是预热缓存 (cache warming strategies)
上一篇
Plc编程书:面向对象编程和方法的书(object oriented programming book)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(68条)