2013-05-31 5 views

Antwort

9

Hier ist eine Hilfsfunktion, die verwendet werden kann, um den Abstand in Metern zwischen zwei Koordinaten zu berechnen:

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:

Es hängt davon ab, was Sie unter ‚Osten‘ und ‚Westen‘ bedeuten der Karte, da die Karte gedreht oder gekippt werden kann. Auch wenn es aufgrund der Erdkrümmung nicht gekippt oder gedreht wird, ist die Breite der Karte in Metern zwischen dem oberen Rand der Karte und dem unteren Rand unterschiedlich (die dem Äquator nähere Kante ist in Metern breiter als die Kante das ist weiter vom Äquator entfernt). Der Unterschied wird geringer sein, je mehr gezoomt Sie sind.

Aber angenommen, Sie wollten die Entfernung in Metern erhalten zwischen der unteren rechten Ecke der Karte links und unten, können Sie diese verwenden:

GMSMapView* mapView = ...; 

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

Wenn Sie in Drehung/Neigung Faktor, könnten Sie wickeln Sie den sichtbaren Bereich in einem GMSCoordinateBounds, und dann den Abstand zwischen den Süd-Ost und Süd-West-Ecken berechnen, zum Beispiel:

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

dies ist jedoch der Bereich breiter sein könnte, als tatsächlich auf dem Bildschirm sichtbar, wie die GMSCoordinateBounds wr apt das Viereck des sichtbaren Bereichs in einer achsgerechten Begrenzungsbox.

wäre eine weitere Option Punkte auf jeder Seite der Karte Ansicht des Rahmens zu wählen, dann ist die Projektion der Kartenansicht verwenden diese in lat/lon, zum Beispiel zu konvertieren:

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 - So übergeben Sie die NE-Position und die SW-Position und Sie erhalten die diagonale Entfernung zwischen denen ... Wenn Sie sehen möchten, wie viel die Karte geändert wurde, erhalten Sie die alte Mitte und die neue Mittelposition von didChangeCamera –

+0

1) aber wie bekomme ich Ost- und Westpunkte? –

+0

2) Das alte Zentrum und das neue Zentrum zu bekommen ist nicht genug, da sich der Zoom hätte ändern können. –

0

Heres der Code für die Ferne zu finden zwischen zwei Punkten

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

Das Google Maps iOS SDK enthält eine Reihe von geometry helpers.

Sie mögen diese Funktion.

GMSGeometryDistance (CLLocationCoordinate2D from, CLLocationCoordinate2D to) -> CLLocationDistance 

„Gibt die Großkreisentfernung zwischen zwei Koordinaten in Metern auf der Erde Dies ist der kürzeste Abstand zwischen den beiden Koordinaten auf der Kugel Beiden Koordinaten müssen. gültig."