MKMapView Yakınlaştırma ve Bölge


85

Google Maps Javascript API kullanımına aşinayım. Son zamanlarda bir iphone projesi için MapKit çerçevesini kullanmaya başladım, ancak haritayı yakınlaştırmak ve bölgeyi ayarlamak için zor zamanlar geçiriyorum.

Google Haritalar API'sinde, basit setZoom () işleviyle birlikte 8, 9, 10 gibi tamsayı yakınlaştırma düzeylerini kullanırdım. MapKit çerçevesinde görebildiğim tek eşdeğer yöntem setRegion: animated. Anladığım kadarıyla, yakınlaştırma seviyesini belirtmek için bir bölgenin enlem ve boylam "delta" değerlerini ayarlamam gerekiyor. Ancak bu değerlerin neyi temsil ettiği konusunda gerçekten bir fikrim yok (belgeleri okudum).

Bir MKMapView temsilcisi kullandığımda ve regionDidChange temsilci yöntemi sonuçlarındaki span değerlerini izlediğimde, birbirleriyle ilişkili görünmüyor. Uzaklaştırdığımda ve belgelerde belirtildiği gibi aralık delta değerlerinin arttığını gördüğümde sorun yok. Ama aniden haritayı yakınlaştırmadan sürükledim ve delta değerleri 0.0 oldu.

Biri lütfen bu açıklık ve deltanın referans noktasının ne olduğunu açıklayabilir mi? Veya tam sayı yakınlaştırma düzeyini (9 gibi) bu delta değerlerine dönüştürmek için herhangi bir algoritma var mı?

Bonus soru olarak, bir MKMapView'da minimum-maksimum yakınlaştırma seviyesini belirlemenin herhangi bir yolu var :)

Teşekkürler

Yanıtlar:


134

Her şeyden önce, MKMapView , Google Haritalar gibi önceden tanımlanmış bir yakınlaştırma seviyesi seti kullanmaz / buna sahip değildir.

Bunun yerine, bir MKMapView görünür alanı , iki değerden oluşan MKCoordinateRegion kullanılarak açıklanır :

  1. merkez (bölgenin merkez noktası) ve
  2. açıklık (merkez çevresindeki görünür alanın boyutu).

Merkez nokta açık olmalıdır (bölgenin merkez noktasıdır.)

Bununla birlikte, span (bir MKCoordinateSpan olan ) şunlardan oluşur:

  1. latitudeDelta (bölge tarafından temsil edilen dikey mesafe) ve
  2. longitudeDelta (bölge tarafından temsil edilen yatay mesafe).

Kısa bir örnek. İşte bir oyuncak MKCoordinateRegion:

  1. merkez:
    • enlem: 0
    • boylam: 0
  2. aralık:
    • latitudeDelta: 8
    • boylamDelta: 6

Bölge, minimum ve maksimum koordinatları kullanılarak aşağıdaki gibi tanımlanabilir:

  1. min koordinat (sol alt nokta):
    • enlem: -4
    • boylam: -3
  2. maksimum koordinat (sağ üst nokta):
    • enlem: 4
    • boylam: 3

Bu nedenle, uygun boyutta bir MKCoordinateSpan kullanarak bir merkez noktası etrafında yakınlaştırma düzeyleri belirleyebilirsiniz. Google'ın sayısal yakınlaştırma düzeylerinin bir yaklaşımı olarak, Google'ın belirli bir yakınlaştırma düzeyi için kullandığı aralık boyutlarını tersine çevirebilir ve buna göre bir aralık oluşturabilirsiniz. (Google, görüntüleme bölgelerini MKMapView ile aynı şekilde orta + açıklık olarak tanımlar, böylece bu değerleri Google Haritalar'dan çekebilirsiniz.)

Bölgeyi kısıtlamaya gelince, bu delege yöntemiyle oynayabilirsiniz:

mapView:regionWillChangeAnimated

Örneğin bölgeyi izin verdiğiniz yakınlaştırma düzeylerine yeniden boyutlandırarak. (Masa görünümlerinin kenarı geçmenize izin vermesi gibi, ancak daha sonra lastik bandı tekrar yerine oturtacağı gibi.) Ancak, bu amaçla kullanmadığım için kilometreniz değişebilir.

btw, OS 3.1'de MapKit'in 3.0'da bana sorun çıkaran yönlerinde kesin düzeltmeler / iyileştirmeler var.


@Kelvin, "Google'ın belirli bir yakınlaştırma düzeyi için kullandığı aralık boyutlarını tersine çevirme ve bir aralık oluşturma" hakkında daha ayrıntılı bilgi verebilir misiniz? Gerçekten ihtiyacım var
Scofield Tran

118

Bir MKCoordinateSpan tanımlamak yerine açık yakınlaştırma seviyeleri kullanmayı tercih ederseniz, MKMapView'in yakınlaştırma seviyesini belirlemek için destek ekleyen bir kategori yazdım. Kod bulunabilir burada .


4
Troy'un blog gönderileri bana harita kiti ve google haritaların nasıl çalıştığına dair harika bir fikir verdi. Okumanızı şiddetle tavsiye ederim.
Aaron


5

Aralık, enlem ve boylam dereceleridir. Bunun yerine mesafe alan MKCoordinateRegion yapılarını oluşturmak için bir yöntem vardır. Aralık belirtmek için MKCoordinateRegionMakeWithDistance kullanıyor olabilirsiniz ve sonra regionDidChange'de kontrol ettiğinizde, enlem / uzun aralıkta görüyorsunuz, bu da bir MKCoordinateRegion yapısında nasıl depolandığını gösterir.

Bildiğim kadarıyla tamsayı yakınlaştırma seviyeleri MKMapKit ile çalışırken hiç kullanılamıyor veya kullanışlı değil. Ben şahsen daha esnek olan açıklık rakamlarını kullanmayı tercih ediyorum.

Maksimum ve minimum yakınlaştırma belirtemezsiniz ve onu hacklemenin bir yolunu bilmiyorum. MKMapKit şu anda oldukça zayıf, özelliklerin eksikliğinden oldukça hayal kırıklığına uğradım.


3

Maps.google.com kullanılarak bir konum için yakınlaştırma düzeylerinin bağlantı sorgu dizesini inceleyerek hızlı bir karşılaştırması, dx ve dy span değerlerinin 2 kat arttığını gösterir:

 (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

Brant'ın MKMapView'daki kategorisi iyi çalışıyor. Ancak, mapSizeInPixels hesaplanırken retina ekranlı yeni cihazları desteklemek için güncellenmemiş gibi görünüyor.

Bu satırı değiştirerek düzeltilebilir:

CGSize mapSizeInPixels = mapView.bounds.size;

Bu satırla:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.