2013-05-31 6 views

risposta

9

Ecco una funzione di supporto che può essere usato per calcolare la distanza in metri tra due coordinate:

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:

Dipende da cosa si intende per 'est' e 'west' della mappa, poiché la mappa può essere ruotata o inclinata. Anche se non è inclinato o ruotato, a causa della curvatura della terra, la larghezza della mappa sarà diversa in metri tra la parte superiore della mappa e il fondo (il bordo più vicino all'equatore sarà più largo in metri rispetto al bordo che è più lontano dall'equatore). La differenza sarà tanto maggiore quanto più aumenterai lo zoom.

Ma supponendo che voleva ottenere la distanza in metri tra il fondo a sinistra e angoli in basso a destra della mappa, è possibile utilizzare questo:

GMSMapView* mapView = ...; 

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

Se si vuole fattore in rotazione/inclinazione, si potrebbe avvolgere la regione visibile in un GMSCoordinateBounds, e quindi calcolare la distanza tra gli angoli ovest sud est e sud, per esempio:

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

Tuttavia, questo potrebbe essere più larga della superficie effettivamente visibile sullo schermo, come il GMSCoordinateBounds wr aps il quadrilatero della regione visibile in un riquadro di delimitazione allineato all'asse.

Un'altra possibilità sarebbe quella di scegliere punti su ciascun lato del telaio della vista mappa, quindi utilizzare la proiezione della mappa per convertirli in lat/lon, ad esempio:

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 - Quindi passa la posizione NE e la posizione SW e ottieni la distanza diagonale tra quelle ... Se vuoi vedere quanto è cambiata la mappa, prendi il vecchio centro e la nuova posizione centrale da didChangeCamera –

+0

1) ma come faccio ad ottenere i punti est e ovest? –

+0

2) ottenere il vecchio centro e il nuovo centro non è sufficiente dato che lo zoom potrebbe essere cambiato –

0

Ecco il codice per reperire distanza tra due punti

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

L'SDK iOS di Google Maps contiene un numero di geometry helpers.

si desidera che questo funzioni:.

GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance 

"restituisce la distanza ortodromica tra due coordinate, in metri, sulla Terra Questa è la distanza più breve tra le due coordinate sulla sfera Entrambe le coordinate devono essere. valido."