MKMapView Zoom og Region

stemmer
83

Jeg er kjent med å bruke Google Maps Javascript API. Nylig jeg begynte å bruke MapKit rammeverk for en iphone prosjekt, men jeg har en hard tid å finne ut zooming og sette en region på kartet.

I Google Maps API pleide jeg å bruke heltall zoomnivåer som 8, 9, 10 sammen med grei funksjon setZoom (). Den eneste tilsvarende metode I kan se i MapKit rammeverket er setRegion: animert. Som jeg forstår, jeg trenger å sette en regionens span bredde- og lengde Delta verdier for å angi zoomnivået. Men jeg egentlig ikke har en anelse om hva disse verdiene representerer (jeg leste dokumentasjonen).

Når jeg bruker en MKMapView representanten og spore spenn verdiene i regionDidChange utsending fremgangsmåten resulterer ikke synes å korrelere med hverandre. Det er ok når jeg zoomer ut og se span deltaverdier øker som angitt i dokumentasjonen. Men plutselig jeg dra kartet uten zooming og deltaverdier blir 0,0.

Kan noen vennligst forklare hva som er referansepunktet til disse span og delta? Eller er det noen algoritme for å konvertere et heltall zoomnivået (som 9) til disse deltaverdier?

Som en bonus spørsmålet er det noen måte å angi et minimum-maksimum zoomnivå på en MKMapView :)

Takk

Publisert på 22/07/2009 klokken 16:16
kilden bruker
På andre språk...                            


5 svar

stemmer
133

Først av alt, MKMapView ikke bruker / har et forhåndsdefinert sett med zoomnivåer som Google Maps gjør.

I stedet er det synlige området av en MKMapView beskrevet ved hjelp av MKCoordinateRegion , som består av to verdier:

  1. sentrum (midtpunkt i), og
  2. span (størrelsen av det synlige området rundt sentrum).

Midtpunktet bør være opplagt (det er midtpunktet i regionen.)

Imidlertid spenn (som er en MKCoordinateSpan ) består av:

  1. latitudeDelta (den vertikale avstand som representeres ved den region), og
  2. longitudeDelta (den horisontale avstand som representeres ved den region).

Et lite eksempel. Her er et leketøy MKCoordinateRegion:

  1. senter:
    • breddegrad: 0
    • lengdegrad: 0
  2. span:
    • latitudeDelta: 8
    • longitudeDelta: 6

Regionen kan beskrives ved hjelp av sin min og maks koordinater som følger:

  1. min koordinat (nedre venstre punkt):
    • breddegrad: -4
    • lengdegrad: -3
  2. max koordinat (øvre høyre punkt):
    • breddegrad: 4
    • lengdegrad: 3

Så kan du angi zoomnivåer rundt et midtpunkt ved hjelp av en passende størrelse MKCoordinateSpan. Som en tilnærming av Googles numeriske zoomnivåer, kan du reversere de span størrelser som Google bruker for et gitt zoomnivå og skape et spenn, tilsvarende. (Google beskriver sitt syn regioner på samme måte som MKMapView gjør, som et senter + span, slik at du kan trekke disse verdiene ut av Google Maps.)

Som for å begrense området, kan du spille w / denne delegat metoden:

mapView:regionWillChangeAnimated

for eksempel ved å endre størrelse på området tilbake i de tillatte zoomnivåer. (Litt som hvordan tabellen visninger vil la deg bla forbi kanten, men vil da gummistrikk tilbake på plass.) Men din kjørelengde kan variere, siden jeg ikke har brukt det til dette formålet.

btw, det er klart rettinger / forbedringer i OS 3.1 til aspekter av MapKit som var å gi meg problemer i 3.0.

Svarte 22/07/2009 kl. 19:36
kilden bruker

stemmer
117

Hvis du foretrekker å bruke eksplisitte zoomnivåer stedet for å definere en MKCoordinateSpan, skrev jeg en kategori som legger til støtte for å angi zoomnivået for en MKMapView. Koden finner du her .

Svarte 23/01/2010 kl. 02:49
kilden bruker

stemmer
4

Spennet er i breddegrader og lengdegrad. Det er en fremgangsmåte for å konstruere MKCoordinateRegion structs som tar avstand, i stedet. Det kan være at du bruker MKCoordinateRegionMakeWithDistance å spesifisere span, og deretter når du sjekke det i regionDidChange, du ser på lat / lang span, som er hvordan den er lagret i en MKCoordinateRegion struct.

Så vidt jeg vet, heltall zoomnivåer ikke er tilgjengelige eller nyttig i det hele tatt når du arbeider med MKMapKit. Jeg personlig foretrekker å bruke de span tall, mer fleksibel.

Du kan ikke angi max og min zoom, og jeg vet ikke om en måte å hacke den i. MKMapKit er faktisk ganske svak akkurat nå, jeg er ganske skuffet over mangelen på funksjoner.

Svarte 22/07/2009 kl. 18:09
kilden bruker

stemmer
3

En rask sammenligning av zoomnivåer for en posisjon ved hjelp maps.google.com ved å undersøke koblingen søkestreng viser at dx og dy span verdier øke med en faktor på 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
  ...
Svarte 11/12/2009 kl. 00:30
kilden bruker

stemmer
2

Brant i kategorien på MKMapView fungerer godt. Det synes imidlertid at det ikke har blitt oppdatert for å støtte nyere enheter med retina-skjermer ved beregning mapSizeInPixels.

Det kan fikses ved å erstatte denne linjen:

CGSize mapSizeInPixels = mapView.bounds.size;

Med denne linjen:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Svarte 19/06/2014 kl. 15:43
kilden bruker

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