2009-07-22 22 views
83

Ho familiarità con l'utilizzo dell'API JavaScript di Google Maps. Recentemente ho iniziato ad usare il framework MapKit per un progetto per iphone, ma ho difficoltà a capire lo zoom e l'impostazione di una regione sulla mappa.MKMapView Zoom e regione

Nell'API di Google Maps ho utilizzato i livelli di zoom intero come 8, 9, 10 insieme alla funzione semplice setZoom(). L'unico metodo equivalente che posso vedere nel framework MapKit è setRegion: animated. Come ho capito, ho bisogno di impostare i valori di "delta" di latitudine e longitudine dello span di una regione per specificare il livello di zoom. Ma davvero non ho idea di cosa rappresentino questi valori (ho letto la documentazione).

Quando utilizzo un delegato MKMapView e traccia i valori di span in regionDidChange, i risultati del metodo delegato non sembrano correlarsi tra loro. Va bene quando faccio lo zoom indietro e vedo i valori delta span che aumentano come specificato nella documentazione. Ma all'improvviso trascino la mappa senza zoom e i valori delta diventano 0.0.

Qualcuno può spiegare qual è il punto di riferimento per questi span e delta? Oppure esiste un algoritmo per convertire un livello di zoom intero (come 9) in questi valori delta?

come una questione bonus c'è un modo per specificare un livello minimo-massimo di zoom su un MKMapView :)

Grazie

risposta

133

Prima di tutto, MKMapView non utilizza/ha un set predefinito di livelli di zoom come fa Google Maps.

Invece, l'area visibile di un MKMapView è descritta utilizzando MKCoordinateRegion, che consiste di due valori:

  1. centro (il punto centrale della regione), e
  2. campata (la dimensione dell'area visibile intorno al centro).

Il punto centrale dovrebbe essere ovvio (è il punto centrale della regione.)

Tuttavia, campata (che è un MKCoordinateSpan) è costituito da:

  1. latitudeDelta (la distanza verticale rappresentata dalla regione), e
  2. longitudeDelta (la distanza orizzontale rappresentata dalla regione).

Un breve esempio. Ecco un MKCoordinateRegion giocattolo:

  1. centro:
    • latitudine: 0
    • longitudine: 0
  2. arco:
    • latitudeDelta: 8
    • longitudeDelta: 6

La regione potrebbe essere descritto utilizzando il suo minimo e coordina massimo come segue:

  1. min coordinate (punto inferiore sinistro):
    • latitudine: -4
    • longitudine : -3
  2. coordinata massima (punto in alto a destra):
    • latitudine: 4
    • longitudine: 3

Quindi, è possibile specificare i livelli di zoom intorno ad un punto centrale utilizzando un opportunamente dimensionata MKCoordinateSpan. Come approssimazione dei livelli di zoom numerici di Google, puoi invertire la progettazione delle dimensioni di span che Google utilizza per un dato livello di zoom e creare uno span, di conseguenza. (Google descrive le aree di visualizzazione nello stesso modo di MKMapView, come un centro + intervallo, quindi puoi estrarre questi valori da Google Maps.)

Per quanto riguarda la limitazione della regione, puoi giocare w/questo metodo delegato :

mapView:regionWillChangeAnimated 

es. ridimensionando la regione nei livelli di zoom consentiti. (Un po 'come il modo in cui le viste delle tabelle ti consentono di scorrere oltre il bordo, ma rimuoverà l'elastico in posizione.) Tuttavia, il tuo chilometraggio può variare, dal momento che non l'ho usato per questo scopo.

btw, ci sono soluzioni fisse/miglioramenti in OS 3.1 ad aspetti di MapKit che mi davano problemi in 3.0.

+0

Nizza descritto che mi lascia conosceva basi. Venerato !!! – NSPratik

+0

@ Kelvin, puoi descrivere più dettagliatamente come "decodificare le dimensioni di span che Google utilizza per un dato livello di zoom e creare uno span". Ne ho davvero bisogno –

4

L'arco è in gradi di latitudine e longitudine. Esiste invece un metodo per costruire le strutture MKCoordinateRegion che prende la distanza. Può essere che tu stia usando MKCoordinateRegionMakeWithDistance per specificare lo span, e poi quando lo controlli in regionDidChange, stai vedendo l'intervallo lat/long, che è il modo in cui è memorizzato in una struct MKCoordinateRegion.

Per quanto ne so, i livelli di zoom intero non sono disponibili o non sono affatto utili quando si lavora con MKMapKit. Personalmente preferisco usare le cifre span, è più flessibile.

Non è possibile specificare lo zoom massimo e minimo, e non conosco un modo per hackerarlo. MKMapKit è attualmente piuttosto debole in questo momento, sono piuttosto deluso dalla mancanza di funzionalità.

3

Un rapido confronto dei livelli di zoom per una posizione utilizzando maps.google.com controllando la querystring collegamento mostra che la dx e dy valori campata aumento di un fattore di 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 
    ... 
117

Se si preferisce usare i livelli di zoom espliciti invece di definire un MKCoordinateSpan, ho scritto una categoria che aggiunge il supporto per specificare il livello di zoom di un MKMapView. Il codice può essere trovato here.

+0

Messaggi davvero interessanti, grazie per il link. –

+4

I post sul blog di Troy mi hanno aiutato a capire come funzionano mapkit e google maps. Consiglio vivamente di leggerlo. – afarnham

+1

ottimo lavoro uomo .. analisi approfondita .. – harshalb

2

La categoria di Brant su MKMapView funziona bene. Tuttavia, sembra che non sia stato aggiornato per supportare i dispositivi più recenti con schermi retina durante il calcolo di mapSizeInPixels.

Può essere fissato sostituendo questa linea:

CGSize mapSizeInPixels = mapView.bounds.size; 

Con questa formazione:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale); 
Problemi correlati