MKMapView Zoom en regio

stemmen
83

Ik ben bekend met het gebruik van Google Maps JavaScript API. Onlangs ben ik begonnen met het gebruik van MapKit kader voor een iphone project, maar ik heb een harde tijd om uit te zoomen en het instellen van een gebied op de kaart.

In Google Maps API heb ik gebruikt om integer zoomniveaus gebruiken, zoals 8, 9, 10, samen met eenvoudige functie setZoom (). De enige equivalente werkwijze I kan zien in het MapKit kader setRegion: geanimeerd. Zoals ik het begrijp, moet ik een regio overspanning van de lengte- en breedtegraad delta waarden ingesteld zoomniveau opgeven. Maar ik heb geen idee wat deze waarden vertegenwoordigen (I de documentatie te lezen).

Als ik een MKMapView gedelegeerde te gebruiken en trek de spanwaarden in regionDidChange delegeren methode resulteert lijken niet met elkaar correleren. Het is ok als ik zoom uit en zie de overspanning delta waarden worden steeds meer zoals gespecificeerd in documentatie. Maar plotseling ik sleep de kaart zonder zoomen en delta waarden worden 0.0.

Kan iemand alsjeblieft uitleggen wat is het referentiepunt om deze overspanning en delta? Of is er een algoritme om een ​​integer zoomniveau (zoals 9) om te zetten in deze delta waarden?

Als een bonus vraag is er een manier om een ​​minimum-maximum zoomniveau op een MKMapView opgeven :)

Bedankt

De vraag is gesteld op 22/07/2009 om 17:16
bron van user
In andere talen...                            


5 antwoorden

stemmen
133

Allereerst, MKMapView maakt geen gebruik van / over een vooraf gedefinieerde set zoomniveaus zoals Google Maps doet.

In plaats daarvan wordt het zichtvlak van een MKMapView beschreven behulp MKCoordinateRegion , bestaande uit twee waarden:

  1. center (het middelpunt van het gebied), en
  2. overspanning (de grootte van het zichtbare gebied rond midden).

Het middelpunt zou duidelijk moeten zijn (het is het middelpunt van het gebied.)

Echter is verstreken (dat is een MKCoordinateSpan ) bestaat uit:

  1. latitudeDelta (de verticale afstand weergegeven door de regio) en
  2. longitudeDelta (de horizontale afstand voorgesteld door de regio).

Een kort voorbeeld. Hier is een stuk speelgoed MKCoordinateRegion:

  1. centrum:
    • breedtegraad: 0
    • lengtegraad: 0
  2. span:
    • latitudeDelta: 8
    • longitudeDelta: 6

Het gebied kan worden beschreven met behulp van de minimum en maximum coördinaten als volgt:

  1. min coördinaten (linksonder point):
    • breedtegraad: -4
    • lengtegraad: -3
  2. max coördinaten (rechtsboven point):
    • breedtegraad: 4
    • lengtegraad: 3

Dus, kun je zoomniveau rond een centraal punt te geven door gebruik te maken van een juiste maat MKCoordinateSpan. Als een aanpassing van de numerieke zoom niveaus van Google, kunt u reverse engineering de overspanning maten die Google gebruikt voor een bepaald zoomniveau en het creëren van een overspanning, dienovereenkomstig. (Google beschrijft hun ogen regio's op dezelfde manier dat MKMapView doet, als een centrum + overspanning, dus u kunt deze waarden uit Google Maps te trekken.)

Zoals voor de regio te beperken, kan je speelt w / deze afgevaardigde methode:

mapView:regionWillChangeAnimated

bijvoorbeeld door de grootte van het gebied terug in uw toegestane zoomniveaus. (Zoiets als hoe standpunten tafel zal u laten scrollen langs de rand, maar zal dan rubber band weer op zijn plaats). Echter, uw snelheid kan variëren, omdat ik het niet heb gebruikt voor dit doel.

btw, zijn er duidelijke fixes / verbeteringen in OS 3.1 tot en met aspecten van MapKit die me gaven problemen in 3.0.

antwoordde op 22/07/2009 om 20:36
bron van user

stemmen
117

Als u liever gebruik van expliciete zoom niveaus in plaats van het definiëren van een MKCoordinateSpan, schreef ik een categorie die voegt ondersteuning toe voor het opgeven van het zoomniveau van een MKMapView. De code kan worden gevonden hier .

antwoordde op 23/01/2010 om 03:49
bron van user

stemmen
4

De overspanning in breedte- en lengtegraad. Er is een werkwijze voor het construeren MKCoordinateRegion structuren die afstand neemt, in plaats daarvan. Het kan zijn dat u gebruik maakt van MKCoordinateRegionMakeWithDistance om de overspanning te geven, en dan als je het te controleren in regionDidChange, je ziet op de lat / lange overspanning, dat is hoe het wordt opgeslagen in een MKCoordinateRegion struct.

Voor zover ik weet, de integer zoom niveaus zijn niet beschikbaar of bruikbaar op alle bij het werken met MKMapKit. Ik persoonlijk de voorkeur aan het gebruik van de overspanning cijfers, zijn flexibeler.

U kunt max en min zoom niet opgeven, en ik weet niet van een manier om het te hacken. MKMapKit is eigenlijk vrij zwak op dit moment, ik ben behoorlijk teleurgesteld door het gebrek aan mogelijkheden.

antwoordde op 22/07/2009 om 19:09
bron van user

stemmen
3

Een snelle vergelijking van zoomniveaus voor een locatie met behulp van maps.google.com door het inspecteren van de koppeling query string toont aan dat de dx en dy spanwaarden toename met een factor 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
  ...
antwoordde op 11/12/2009 om 01:30
bron van user

stemmen
2

Brant in de categorie op MKMapView werkt goed. Echter, het lijkt erop dat het niet is bijgewerkt naar nieuwere apparaten te ondersteunen met retina-schermen bij de berekening van mapSizeInPixels.

Het kan worden vastgesteld door het vervangen van deze lijn:

CGSize mapSizeInPixels = mapView.bounds.size;

Met deze lijn:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
antwoordde op 19/06/2014 om 16:43
bron van user

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