Zoom e regione di MKMapView


85

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

Nell'API di Google Maps usavo livelli di zoom interi come 8, 9, 10 insieme alla semplice funzione setZoom (). L'unico metodo equivalente che posso vedere nel framework MapKit è setRegion: animated. Da quanto ho capito, devo impostare i valori "delta" di latitudine e longitudine dell'intervallo 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 traccio i valori di span nel metodo delegato regionDidChange, i risultati non sembrano essere correlati tra loro. Va bene quando eseguo lo zoom indietro e vedo che i valori delta dello span stanno aumentando come specificato nella documentazione. Ma improvvisamente trascino la mappa senza zoomare ei valori delta diventano 0,0.

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

Come domanda bonus, esiste un modo per specificare un livello di zoom minimo-massimo su un MKMapView :)

Grazie

Risposte:


134

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

L'area visibile di un MKMapView viene invece descritta utilizzando MKCoordinateRegion , che consiste di due valori:

  1. center (il punto centrale della regione) e
  2. span (la dimensione dell'area visibile attorno al centro).

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

Tuttavia, span (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 giocattolo MKCoordinateRegion:

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

La regione può essere descritta usando le sue coordinate minime e massime come segue:

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

Quindi, puoi specificare i livelli di zoom attorno a un punto centrale utilizzando un MKCoordinateSpan di dimensioni appropriate. Come approssimazione dei livelli di zoom numerico di Google, potresti decodificare le dimensioni dell'intervallo che Google utilizza per un determinato livello di zoom e creare un intervallo, di conseguenza. (Google descrive le loro regioni di visualizzazione nello stesso modo in cui fa MKMapView, come centro + span, quindi puoi estrarre questi valori da Google Maps.)

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

mapView:regionWillChangeAnimated

ad esempio ridimensionando la regione nei livelli di zoom consentiti. (Un po 'come il modo in cui le visualizzazioni della tabella ti consentono di scorrere oltre il bordo, ma poi l'elastico torna in posizione.) Tuttavia, il tuo chilometraggio può variare, poiché non l'ho usato per questo scopo.

a proposito, ci sono correzioni / miglioramenti definitivi in ​​OS 3.1 per aspetti di MapKit che mi davano problemi nella 3.0.


@Kelvin, puoi descrivere in modo più dettagliato come "decodificare le dimensioni di span che Google utilizza per un dato livello di zoom e creare un span". Ne ho davvero bisogno
Scofield Tran

118

Se preferisci usare 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 qui .


4
I post sul blog di Troy mi hanno dato una grande comprensione di come funzionano mapkit e google maps. Consiglio vivamente di leggerlo.
Aaron

5
git: //github.com/jdp-global/MKMapViewZoom.git
johndpope

@JohnMerlino sì lo fa
Zoltán Matók

5

L'intervallo è in gradi di latitudine e longitudine. Esiste un metodo per costruire strutture MKCoordinateRegion che prende invece distanza. È possibile che tu stia usando MKCoordinateRegionMakeWithDistance per specificare lo span, e quindi quando lo controlli in regionDidChange, stai vedendo il lat / long span, che è il modo in cui è memorizzato in una struttura MKCoordinateRegion.

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

Non è possibile specificare lo zoom massimo e minimo e non conosco un modo per hackerarlo. MKMapKit è in realtà 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 stringa di query del collegamento mostra che i valori dx e dy span aumentano di un fattore 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
  ...

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 risolto sostituendo questa riga:

CGSize mapSizeInPixels = mapView.bounds.size;

Con questa linea:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.