MKMapView Zoom și regiune

voturi
83

Sunt familiarizat cu utilizarea Google Maps API JavaScript. Recent am început să folosesc cadrul MapKit pentru un proiect iPhone, dar am un timp de greu să dau seama zoom și stabilirea unei regiuni pe hartă.

În Hărți Google API-am folosit pentru a utiliza niveluri de panoramare întregi cum ar fi 8, 9, 10, împreună cu setZoom funcție simplă (). Singura metodă echivalentă pot vedea în cadrul MapKit este setRegion: animat. Așa cum am înțeles, am nevoie pentru a seta valorile de latitudine și longitudine „Delta“ se intinde de la o regiune pentru a specifica nivelul de zoom. Dar eu chiar nu au o idee despre ceea ce reprezintă aceste valori (am citit documentația).

Cand folosesc un delegat MKMapView și traseze valorile din regionDidChange deschidere rezultatele metodei delegat nu par să coreleze reciproc. Este în regulă, atunci când am zoom out și a vedea durata de valori delta sunt în creștere după cum se specifică în documentația. Dar, dintr-o dată am să glisați harta fără a zoom și valorile delta devin 0.0.

Poate cineva să explice ce este punctul de referință la aceste interval și delta? Sau există nici un algoritm pentru a converti un nivel de zoom întreg (cum ar fi 9), la aceste valori delta?

Ca o întrebare bonus există nici o modalitate de a specifica un nivel minim-maxim de zoom pe un MKMapView :)

Mulțumiri

Întrebat 22/07/2009 la 17:16
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
133

În primul rând, MKMapView nu utilizează / au un set predefinit de nivele de zoom , cum ar fi Google Maps face.

In schimb, zona vizibilă a unui MKMapView este descrisă utilizând MKCoordinateRegion , care constă din două valori:

  1. centru (punctul central al regiunii) și
  2. Durata (dimensiunea zonei vizibile în jurul centrului).

Punctul central ar trebui să fie evident (este punctul central al regiunii.)

Cu toate acestea, durata (care este un MKCoordinateSpan ) este format din:

  1. latitudeDelta (distanța pe verticală reprezentată de regiune) și
  2. longitudeDelta (distanța orizontală reprezentată de regiune).

Un exemplu scurt. Iată o MKCoordinateRegion jucărie:

  1. centru:
    • latitudine: 0
    • longitudine: 0
  2. durata:
    • latitudeDelta: 8
    • longitudeDelta: 6

Regiunea poate fi descrisă folosind min și coordonatele max după cum urmează:

  1. min de coordonate (punctul din stânga jos):
    • latitudine: -4
    • longitudine: -3
  2. max de coordonate (punctul din dreapta sus):
    • latitudine: 4
    • longitudine: 3

Deci, puteți specifica nivelurile de panoramare în jurul unui punct central prin utilizarea unui MKCoordinateSpan cu dimensiuni corespunzătoare. Ca o aproximare a nivelului de panoramare numerice Google, ai putea inversa inginer dimensiunile pe care Google utilizează deschidere pentru un anumit nivel de panoramare și de a crea un interval, în mod corespunzător. (Google descrie regiunile lor vedere, în același mod în care MKMapView face, ca un centru + interval, astfel încât să puteți trage aceste valori de la Google Maps.)

În ceea ce privește restricționarea regiunii, puteți juca w / această metodă delegat:

mapView:regionWillChangeAnimated

de exemplu, prin redimensionarea regiunii înapoi în nivelul de zoom permise. (Un fel de modul în care punctele de vedere de masă va permite să derulați peste marginea, dar va apoi banda de cauciuc înapoi în loc.) Cu toate acestea, kilometraj dvs. poate varia, deoarece nu l-am folosit în acest scop.

BTW, Corecții clare / îmbunătățiri în OS 3.1 la aspecte ale MapKit care au fost mi dea probleme în 3.0.

Publicat 22/07/2009 la 20:36
sursa de către utilizator

voturi
117

Dacă preferați să utilizați niveluri de panoramare explicite în loc de a defini o MKCoordinateSpan, am scris o categorie care adaugă suport pentru specificarea nivelului de zoom al unui MKMapView. Codul poate fi găsit aici .

Publicat 23/01/2010 la 03:49
sursa de către utilizator

voturi
4

Intervalul este în grade de latitudine și longitudine. Există o metodă de construcție structs MKCoordinateRegion care ia distanță, în schimb. Acesta poate fi că utilizați MKCoordinateRegionMakeWithDistance pentru a specifica durata, și apoi atunci când îl verificați în regionDidChange, ce vezi la durata lungă / lat, care este modul în care este stocat într-un struct MKCoordinateRegion.

Din câte știu, nivelurile de zoom întreg nu sunt disponibile sau utile, la toate atunci când se lucrează cu MKMapKit. Eu personal prefer folosind cifrele Span sale mai flexibile.

Nu puteți specifica zoom maxim și min, și nu știu de o modalitate de a-l hack în. MKMapKit este de fapt destul de slab, chiar acum, sunt destul de dezamagit de lipsa de caracteristici.

Publicat 22/07/2009 la 19:09
sursa de către utilizator

voturi
3

O comparație rapidă a nivelurilor de zoom pentru o locație utilizând maps.google.com prin inspectarea link-ul de querystring arată că dx și valorile etalon dy creșterea cu un factor de 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
  ...
Publicat 11/12/2009 la 01:30
sursa de către utilizator

voturi
2

Categoria Brant pe MKMapView funcționează bine. Cu toate acestea, se pare că nu a fost actualizat pentru a sprijini mai noi dispozitive cu ecrane de retină la calcularea mapSizeInPixels.

Acesta poate fi fixat prin înlocuirea această linie:

CGSize mapSizeInPixels = mapView.bounds.size;

Cu această linie:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Publicat 19/06/2014 la 16:43
sursa de către utilizator

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