MKMapView Zoom und Region

stimmen
83

Ich bin mit der Verwendung von Google Maps JavaScript API vertraut. Vor kurzem begann ich MapKit Rahmen für ein iPhone-Projekt, aber ich habe eine harte Zeit, um eine Region auf der Karte, um herauszufinden, mit Zoomen und Einstellung.

In Google Maps API verwenden I wie 8 integer Zoomstufen zu verwenden, 9, 10 zusammen mit einfacher Funktion setZoom (). Die einzige äquivalente Methode, die ich im Rahmen MapKit sehen kann, ist setRegion: animiert. Wie ich verstehe, ich brauche eine Region Spanne Breite und Länge der „delta“ Wert einstellen Zoomstufe festlegen. Aber ich habe wirklich keine Ahnung, was diese Werte repräsentieren (ich die Dokumentation zu lesen).

Wenn ich einen MKMapView Delegaten verwenden und die Spanne Wert in regionDidChange Delegatmethode Ergebnissen verfolgen scheinen sie nicht zu korrelieren. Es ist in Ordnung, wenn ich herauszoomen und sehen Sie die Spanne Delta-Werte zu erhöhen als in der Dokumentation. Doch plötzlich ziehe ich die Karte ohne Zoomen und Delta-Werte werden 0,0.

Kann jemand bitte erklären, was der Referenzpunkt auf diese Spanne und Delta ist? Oder gibt es einen Algorithmus für eine ganze Zahl Zoomstufe (wie 9) auf diesen Delta-Wert zu konvertieren?

Als Bonus Frage ist es eine Möglichkeit, eine Minimum-Maximum-Zoomstufe auf einem MKMapView angeben :)

Vielen Dank

Veröffentlicht am 22/07/2009 um 17:16
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
133

Zunächst einmal MKMapView nicht einen vordefinierten Satz von Zoomstufen wie Google Maps funktioniert benutzen / haben.

Stattdessen wird der sichtbare Bereich einer MKMapView Verwendung beschrieben MKCoordinateRegion , der aus zwei Werten besteht:

  1. Zentrum (der Mittelpunkt der Region), und
  2. Spanne (die Größe des sichtbaren Bereichs um Mitte).

Der Mittelpunkt sollte offensichtlich sein (es ist der Mittelpunkt der Region.)

Jedoch Spanne (worin A MKCoordinateSpan ) besteht aus:

  1. latitudeDelta (der vertikale Abstand durch den Bereich dargestellt ist ), und
  2. longitudeDelta (der horizontale Abstand von der Region dargestellt).

Ein kurzes Beispiel. Hier ist ein Spielzeug MKCoordinateRegion:

  1. Center:
    • Breite: 0
    • Länge: 0
  2. Spanne:
    • latitudeDelta: 8
    • longitudeDelta: 6

Die Region könnte beschrieben seine min und unter Verwendung von Max-Koordinaten wie folgt:

  1. min (linken unteren Punkt) -Koordinate:
    • Breite: -4
    • Länge: -3
  2. max (oberen rechten Punkt) koordinieren:
    • Breite: 4
    • Länge: 3

So können Sie Zoomstufen um einen Mittelpunkt angeben, indem ein entsprechend dimensioniertes MKCoordinateSpan verwenden. Als Annäherung der numerischen Zoomstufen von Google, können Sie die Spanne Größen Reverse Engineering, die Google für einen bestimmten Zoomstufe verwendet und eine Spannweite schaffen, entsprechend. (Google beschreibt ihre Sicht Regionen in der gleichen Art und Weise, dass MKMapView tut, als Zentrum + Spanne, so können Sie diese Werte aus Google Maps ziehen.)

Wie für die Region zu beschränken, können Sie w / dieser Delegatmethode spielen:

mapView:regionWillChangeAnimated

zB durch die Region wieder in Ihre erlaubt Zoomstufen Größe ändern. (Art wie wie Tabellenansichten lässt Sie über den Rand bewegen, wird aber dann Gummiband wieder ein.) Jedoch die Leistung kann variieren, da ich es nicht für diesen Zweck verwendet haben.

btw, es gibt bestimmte Fixes / Verbesserungen in OS 3.1 auf Aspekte der MapKit, die mir Probleme in 3.0 wurden zu geben.

Beantwortet am 22/07/2009 um 20:36
quelle vom benutzer

stimmen
117

Wenn Sie explizite Zoomstufen bevorzugen anstelle eines MKCoordinateSpan definieren, schrieb ich eine Kategorie , die Unterstützung für die Angabe der Zoomstufe eines MKMapView hinzufügt. Der Code kann gefunden werden hier .

Beantwortet am 23/01/2010 um 03:49
quelle vom benutzer

stimmen
4

Die Spanne ist in Grad Breite und Länge. Es gibt ein Verfahren MKCoordinateRegion structs für die Konstruktion, den Abstand nimmt, statt. Es kann sein, dass Sie MKCoordinateRegionMakeWithDistance verwenden die Spanne angeben, und dann, wenn Sie es in regionDidChange überprüfen, sind Sie an der lat / long Spanne zu sehen, das ist, wie es in einer MKCoordinateRegion Struktur gespeichert ist.

Soweit ich weiß, sind die ganzzahligen Zoomstufen überhaupt nicht verfügbar oder nützlich, wenn mit MKMapKit arbeiten. Ich persönlich bevorzuge die Spanne Zahlen verwenden, dessen flexibler.

Sie können nicht max und min Zoom angeben, und ich weiß nicht, einen Weg, es zu hacken in. MKMapKit jetzt eigentlich ziemlich schwach ist, ich bin ziemlich enttäuscht von dem Mangel an Features.

Beantwortet am 22/07/2009 um 19:09
quelle vom benutzer

stimmen
3

Ein kurzer Vergleich der Zoomstufen für einen Standort durch Überprüfen des Link Abfragezeichenfolgeflag mit maps.google.com zeigt, dass die dx und dy Spanne Wert Steigerung um einen Faktor von 2:

 (0.005334, 0.011834) starting span
 (0.010668, 0.023668) dx: x2, dy: x2 
 (0.021335, 0.047337) dx: x2, dy: x2
 (0.042671, 0.094671) dx: x2, dy: x2
  ...
Beantwortet am 11/12/2009 um 01:30
quelle vom benutzer

stimmen
2

Brants Kategorie auf MKMapView funktioniert gut. Es scheint jedoch, dass es ist nicht aktualisiert worden neuere Geräte mit Retina-Bildschirmen zu unterstützen, wenn mapSizeInPixels Berechnung.

Es kann durch das Ersetzen dieser Linie festgelegt werden:

CGSize mapSizeInPixels = mapView.bounds.size;

Mit dieser Zeile:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Beantwortet am 19/06/2014 um 16:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more