MKMapView Zoom e Regione

voti
83

Sono familiarità con l'utilizzo di Google Maps API Javascript. Recentemente ho iniziato ad usare quadro MapKit per un progetto iPhone, ma sto avendo un momento difficile da capire lo zoom e l'impostazione di una regione sulla mappa.

In Google Maps API ho utilizzato livelli di zoom interi come 8, 9, 10 con la funzione di semplice setZoom (). L'unico metodo equivalente posso vedere nel quadro MapKit è setregion: animato. A quanto ho capito, ho bisogno di impostare i valori di campata di una regione di latitudine e longitudine Delta per specificare il livello di zoom. Ma io davvero non ho un'idea di ciò che questi valori rappresentano (ho letto la documentazione).

Quando uso un delegato MKMapView e tracciare i valori di intervallo in regionDidChange metodo delegato risultati non sembrano correlare tra loro. Va bene quando ho diminuire e vedere l'arco valori delta sono in aumento, come specificato nella documentazione. Ma improvvisamente mi trascino la mappa senza zoom e valori delta divento 0.0.

Qualcuno può spiegare che cosa è il punto di riferimento per questi arco e delta? O c'è qualche algoritmo per convertire un livello di zoom intero (come 9) a questi valori delta?

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

Grazie

È pubblicato 22/07/2009 alle 17:16
fonte dall'utente
In altre lingue...                            


5 risposte

voti
133

Prima di tutto, MKMapView non usare / avere un insieme predefinito di livelli di zoom come Google Maps fa.

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 ) consiste di:

  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. coordinate min (punto inferiore sinistro):
    • latitudine: -4
    • longitudine: -3
  2. max di coordinate (punto in alto a destra):
    • latitudine: 4
    • longitudine: 3

Quindi, è possibile specificare i livelli di zoom intorno ad un punto centrale utilizzando un MKCoordinateSpan dimensioni appropriate. Come approssimazione di livelli di zoom numeriche di Google, è possibile decodificare le dimensioni della portata che Google utilizza per un dato livello di zoom e di creare un arco, di conseguenza. (Google descrive loro regioni vista nello stesso modo in cui MKMapView fa, come un centro + arco, in modo da poter estrarre questi valori di Google Maps.)

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

mapView:regionWillChangeAnimated

ad esempio il ridimensionamento della regione nuovamente dentro i vostri livelli di zoom consentiti. (Un po 'come come viste da tavolo vi permetterà di scorrere oltre il bordo, ma saranno poi elastico in posizione.) Tuttavia, la vostra situazione potrebbe essere diversa, visto che non ho usato per questo scopo.

btw, ci sono precise correzioni / miglioramenti OS 3.1 per gli aspetti di MapKit che mi davano fastidio a 3.0.

Risposto il 22/07/2009 a 20:36
fonte dall'utente

voti
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 qui .

Risposto il 23/01/2010 a 03:49
fonte dall'utente

voti
4

L'arco è in gradi di latitudine e longitudine. C'è un metodo per costruire le strutture MKCoordinateRegion che prende distanza, invece. Può essere che si sta utilizzando MKCoordinateRegionMakeWithDistance per specificare l'intervallo, e poi al momento del check in regionDidChange, che stai vedendo alla lunga durata / lat, che è come viene memorizzato in una struct MKCoordinateRegion.

Per quanto ne so, i livelli di numero intero di zoom non sono disponibili o utile a tutti quando si lavora con MKMapKit. Io personalmente preferisco usare le figure campata, la sua più flessibile.

Non è possibile specificare zoom max e min, e io non so di un modo per incidere in. MKMapKit è in realtà piuttosto debole in questo momento, sono abbastanza deluso dalla mancanza di funzionalità.

Risposto il 22/07/2009 a 19:09
fonte dall'utente

voti
3

Un rapido confronto tra i livelli di zoom per una posizione utilizzando maps.google.com ispezionando querystring collegamento mostra che la dx e valori di intervallo dy 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
  ...
Risposto il 11/12/2009 a 01:30
fonte dall'utente

voti
2

categoria di Brant sulla MKMapView funziona bene. Tuttavia, sembra che esso non è stato aggiornato per supportare nuovi dispositivi con schermi retina nel calcolo mapSizeInPixels.

Può essere fissato sostituendo questa linea:

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);
Risposto il 19/06/2014 a 16:43
fonte dall'utente

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