2014-01-22 2 views
8

zu bekommen, wenn ich eine MKCoordinateRegion machen müssen, ich die folgenden:Der Versuch, die Spannweite Größe in Metern für einen iOS MKCoordinateSpan

var region = MKCoordinateRegion 
       .FromDistance(coordinate, RegionSizeInMeters, RegionSizeInMeters); 

sehr einfach - funktioniert perfekt.

Jetzt möchte ich den Wert der aktuellen Region span speichern. Wenn ich den region.Span Wert sehen, es ist ein MKCoordinateSpan, die zwei Eigenschaften hat:

public double LatitudeDelta; 
public double LongitudeDelta; 

Wie kann ich den LatitudeDelta Wert in eine latitudinalMeters umwandeln bitte? (So ​​kann ich meine Region (später) mit der obigen Methode wiederherstellen ...

+1

Wenn Sie die Spanne speichern, _could_ Sie die Ebene MKCoordinateRegionMake nennen, die versuchen, stattdessen ein Zentrum und eine Spanne nimmt die Spanne in Meter zu konvertieren. Alternativ können Sie statt des Bereichs auch _meter_ speichern. In diesem Fall ist keine Konvertierung erforderlich, und Sie können MKCoordinateRegionMakeWithDistance verwenden. – Anna

+0

Übrigens sind die Delta-Werte in Grad (genau wie die Mittelkoordinate). – Anna

+0

Bist du 100% sicher @ Anna? Dies sind die aktuellen Daten, die ich für meine Testdaten habe (das kostenlose Laufwerk im iOS Simulator). http://i.imgur.com/fVOWpJo.png Beachten Sie, dass LatitudeDelta kein gültiger Breitengradwert (+/- 90) ist. –

Antwort

24

Wie ich sehen kann, haben Sie bereits die Region der Karte.Es enthält nicht nur die Längen, sondern auch die . Mittelpunkt der Region können Sie die Abstände in Metern berechnen, wie im Bild dargestellt:

enter image description here

1: Erhalten Sie die Region Spanne (wie groß der Bereich, in lat/long Grad)

MKCoordinateSpan span = region.span;

2: Holen Sie die Region Mitte (lat/long-Koordinaten)

CLLocationCoordinate2D loc = region.center;

3: Erstellen Sie zwei Standorten (loc1 & loc2, Nord - Süd), basierend auf der zentralen Stelle und berechnen den Abstand dazwischen (in Metern)

//get latitude in meters 
CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:(center.latitude - span.latitudeDelta * 0.5) longitude:center.longitude]; 
CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:(center.latitude + span.latitudeDelta * 0.5) longitude:center.longitude]; 
int metersLatitude = [loc1 distanceFromLocation:loc2]; 

4: erstellen Sie zwei Standorten (LOC3 & Loc4, West - Ost) auf der zentralen Stelle basiert und den Abstand dazwischen (in Metern) berechnen

//get longitude in meters 
CLLocation *loc3 = [[CLLocation alloc] initWithLatitude:center.latitude longitude:(center.longitude - span.longitudeDelta * 0.5)]; 
CLLocation *loc4 = [[CLLocation alloc] initWithLatitude:center.latitude longitude:(center.longitude + span.longitudeDelta * 0.5)]; 
int metersLongitude = [loc3 distanceFromLocation:loc4]; 
+0

Das sieht so aus, als könnte es mein Problem beheben.Kannst du erklären, was vor sich geht? Was ist das Delta-Ding? warum die 0.5 usw.? (Ich liebe es zu wissen, warum Dinge, nicht nur Antworten und dann weiter). –

+0

Bitte sehen Sie meine Bearbeitung, ich fügte ein Bild und eine weitere Erklärung – Hannes

+0

Warum die XXX_Delta * 0,5? und welcher Wert ist ein Delta, wirklich? Hier ist ein Screenshot meiner Werte ... http://i.imgur.com/fVOWpJo.png ... Ich dachte, es könnte eine gültige Lat/Long-Koordinate gewesen sein ... aber es ist nicht? Wenn ich den Code ausprobiere, ist der Kartenbereich etwas größer als der aktuelle, sodass keine exakte Kopie erstellt wird. Das bedeutet, dass ich jedes Mal, wenn ich mich bewege, langsam zoome, bis ich nicht mehr kann. –

7

Swift-Implementierung für Hannes Lösung:

let span = mapView.region.span 
    let center = mapView.region.center 

    let loc1 = CLLocation(latitude: center.latitude - span.latitudeDelta * 0.5, longitude: center.longitude) 
    let loc2 = CLLocation(latitude: center.latitude + span.latitudeDelta * 0.5, longitude: center.longitude) 
    let loc3 = CLLocation(latitude: center.latitude, longitude: center.longitude - span.longitudeDelta * 0.5) 
    let loc4 = CLLocation(latitude: center.latitude, longitude: center.longitude + span.longitudeDelta * 0.5) 

    let metersInLatitude = loc1.distanceFromLocation(loc2) 
    let metersInLongitude = loc3.distanceFromLocation(loc4) 
+0

Ich habe eine Follow-up-Frage zu Ihrer Antwort hier hinzugefügt, können Sie hier https://stackoverflow.com/questions/40206211/how-can-i-center-my-map-on-the-annotation-view-only nachsehen -wenn-es-ist-nah-an-der-Kante? Vielen Dank! – user3766930

Verwandte Themen