2013-05-31 28 views
5

Làm cách nào để tính khoảng cách (tính bằng mét) giữa điểm phía đông và điểm phía tây của bản đồ? Giả sử người dùng thay đổi vị trí di chuyển bản đồ, sau đó tôi bắt chuyển động với mapView: didChangeCameraPosition: phương thức ủy nhiệm, nhưng tôi không biết cách tính khoảng cách.SDK Google Maps iOS: Khoảng cách giữa các điểm phía đông và phía tây trên bản đồ

Trả lời

9

Dưới đây là một hàm helper mà có thể được sử dụng để tính toán khoảng cách trong mét giữa hai tọa độ:

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:

Nó phụ thuộc những gì bạn có nghĩa là bởi 'đông' và 'tây' của bản đồ, vì bản đồ có thể được xoay hoặc nghiêng. Ngay cả khi nó không nghiêng hoặc xoay, do độ cong của trái đất, chiều rộng của bản đồ sẽ khác nhau về mét giữa phần trên cùng của bản đồ và đáy (cạnh gần xích đạo sẽ rộng hơn mét so với cạnh) mà là xa hơn từ đường xích đạo). Sự khác biệt sẽ ít thu nhỏ hơn trong bạn.

Nhưng giả sử bạn muốn để có được những khoảng cách trong mét giữa phía dưới bên trái và góc dưới bên phải của bản đồ, bạn có thể sử dụng này:

GMSMapView* mapView = ...; 

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

Nếu bạn muốn nhân hệ số vòng quay/độ nghiêng, bạn có thể quấn vùng khả kiến ​​trong một GMSCoordinateBounds, và sau đó tính toán khoảng cách giữa các góc đông tây và phía nam nam, ví dụ:

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

Tuy nhiên, đây có thể rộng hơn so với diện tích thực tế có thể nhìn thấy trên màn hình, như GMSCoordinateBounds wr aps tứ giác của vùng hiển thị trong hộp giới hạn trục được căn chỉnh.

Một lựa chọn khác sẽ được chọn điểm trên mỗi bên của khung giao diện bản đồ, sau đó sử dụng chiếu giao diện bản đồ để chuyển đổi chúng thành lat/lon, ví dụ:

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

+1 - Vì vậy, vượt qua vị trí NE và vị trí SW và bạn nhận được khoảng cách chéo giữa những ... Nếu bạn muốn xem bản đồ đã thay đổi bao nhiêu, hãy lấy trung tâm cũ và vị trí trung tâm mới từ didChangeCamera –

+0

1) nhưng làm thế nào để tôi có được điểm đông và tây? –

+0

2) nhận được trung tâm cũ và trung tâm mới là không đủ vì zoom có ​​thể đã thay đổi –

0

Heres mã cho việc tìm kiếm khoảng cách giữa hai điểm

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

NSString *urlString [email protected]"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); 
}]; 
2

SDK Google Maps iOS chứa một bó geometry helpers.

Bạn muốn chức năng này:.

GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance 

"Trả về khoảng cách vòng tròn lớn giữa hai tọa độ, tính bằng mét, trên Trái Đất Đây là khoảng cách ngắn nhất giữa hai tọa độ trên phạm vi cả tọa độ phải. có hiệu lực."

Các vấn đề liên quan