MKMapView Zoom i Region

Jestem zaznajomiony z używaniem Google Maps Javascript API. Ostatnio zacząłem używać MapKit framework dla projektu iphone ' a, ale mam problem z powiększeniem i ustawieniem regionu na mapie.

W Google Maps API używałem poziomów integer zoom, takich jak 8, 9, 10 wraz z prostą funkcją setZoom (). Jedyną równoważną metodą jaką widzę w ramach MapKit jest setRegion: animated. Jak rozumiem, muszę ustawić szerokość i długość geograficzną regionu " delta" wartości określające poziom powiększenia. Ale naprawdę nie mam pojęcia, co te wartości reprezentują (czytam dokumentację).

Kiedy używam delegata MKMapView i śledzę wartości span w metodzie regionDidChange delegate wyniki nie wydają się ze sobą korelować. Jest ok, gdy pomniejszam i widzę, że wartości Delta zakresu rosną, jak określono w dokumentacji. Ale nagle przeciągam mapę bez powiększania i wartości delta stają się 0.0.

Czy ktos moze wyjasnic czym jest punkt odniesienia do tych span i delta? A może jest jakiś algorytm do konwersji poziomu powiększenia całkowitego (jak 9) na te wartości delta?

Jako bonus pytanie czy jest jakiś sposób na określenie minimalnego-maksymalnego poziomu powiększenia na MKMapView :)

Thanks

Author: bvd, 2009-07-22

5 answers

Po pierwsze, MKMapView nie używa/ma predefiniowany zestaw poziomów powiększenia, jak robi to Google Maps.

Zamiast tego widoczny obszar MKMapView jest opisany za pomocą MKCoordinateRegion , który składa się z dwóch wartości:

  1. center (środkowy punkt regionu), oraz
  2. span (wielkość widocznego obszaru wokół środka).

Punkt środkowy powinien być oczywisty (jest to punkt środkowy region.)

Jednak span (który jest MKCoordinateSpan) składa się z:

  1. latitudeDelta (Odległość pionowa reprezentowana przez region), oraz
  2. longitudeDelta (odległość pozioma reprezentowana przez region).

Krótki przykład. Oto zabawka MKCoordinateRegion:

  1. center:
    • szerokość geograficzna: 0
    • Długość geograficzna: 0
  2. span:
    • latitudeDelta: 8
    • longitudeDelta: 6

Region można opisać za pomocą współrzędnych min i max w następujący sposób:

  1. współrzędna min (lewy dolny punkt):
    • szerokość geograficzna: -4
    • Długość geograficzna: -3
  2. max współrzędna (górny prawy punkt):
    • szerokość geograficzna: 4
    • Długość geograficzna: 3

Można więc określić poziomy powiększenia wokół punktu środkowego, używając odpowiedniego rozmiaru MKCoordinateSpan. Jako przybliżenie liczbowych poziomów powiększenia Google, możesz inżynierii wstecznej rozmiarów zakresu, które Google używa dla danego poziomu powiększenia i odpowiednio utworzyć zakres. (Google opisuje swoje regiony widoku w taki sam sposób, jak MKMapView, jako zakres Centrum +, dzięki czemu można wyciągnąć te wartości z Google Maps.)

Jeśli chodzi o ograniczenie regionu, możesz grać w / tą metodę delegata:

mapView:regionWillChangeAnimated

Np. poprzez zmianę rozmiaru obszaru na dozwolony poziom powiększenia. (Coś jak widok tabeli pozwoli Ci przewijać za krawędź, ale wtedy gumka powróci na miejsce.) Jednak twój przebieg może się różnić, ponieważ nie używałem go do tego celu.

Btw, są pewne poprawki/ulepszenia w OS 3.1 do aspektów MapKit, które sprawiały mi kłopoty w 3.0.

 133
Author: Kelvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 19:36:50

Jeśli wolisz używać jawnych poziomów powiększenia zamiast definiowania MKCoordinateSpan, napisałem kategorię, która dodaje obsługę określania poziomu powiększenia MKMapView. Kod można znaleźć tutaj.

 117
Author: Troy Brant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 14:40:08

Rozpiętość jest w stopniach szerokości i długości geograficznej. Istnieje metoda konstruowania struktur MKCoordinateRegion, która wymaga dystansu. Może być tak, że używasz MKCoordinateRegionMakeWithDistance, aby określić zakres, a następnie po sprawdzeniu go w regionDidChange, widzisz w lat / long span, który jest przechowywany w strukturze MKCoordinateRegion.

Z tego co wiem, poziomy powiększeń całkowitych nie są dostępne ani w ogóle użyteczne podczas pracy z MKMapKit. I osobiście wolę używać liczby rozpiętości, jej bardziej elastyczne.

Nie można określić max i min zoom, a ja Nie wiem jak to zhakować. MKMapKit jest teraz dość słaby, jestem dość rozczarowany brakiem funkcji.

 4
Author: Chase Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 18:09:46

Szybkie porównanie poziomów powiększenia dla lokalizacji za pomocą maps.google.com sprawdzając link querystring pokazuje, że wartości zakresu dx I dy zwiększają się o współczynnik 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
  ...
 3
Author: Ari Braginsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 00:30:37

Kategoria Branta w MKMapView działa dobrze. Wydaje się jednak, że nie został zaktualizowany, aby obsługiwać nowsze urządzenia z ekranami retina podczas obliczania mapSizeInPixels.

Można to naprawić, zastępując tę linię:

CGSize mapSizeInPixels = mapView.bounds.size;

Z tą linijką:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
 2
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 15:43:55