2009-07-22 132 views
83

我熟悉使用Google Maps JavaScript API。最近我開始爲一個iphone項目使用MapKit框架,但我很難找出縮放並在地圖上設置區域。MKMapView縮放和Region

在Google Maps API中,我曾使用整數縮放級別(如8,9,10)以及簡單的函數setZoom()。我可以在MapKit框架中看到的唯一等效方法是setRegion:animated。據我所知,我需要設置一個區域的跨度的緯度和經度「增量」值來指定縮放級別。但我真的不知道這些值代表什麼(我閱讀文檔)。

當我使用MKMapView委託並跟蹤regionDidChange委託方法結果中的跨度值似乎不相互關聯。當我縮小並看到量程增量值正在按照文檔中的指定增加時,可以。但突然間,我拖動地圖而沒有縮放,delta值變爲0.0。

有人可以請解釋什麼是這些跨度和三角洲的參考點?或者是否有任何算法將整數縮放級別(如9)轉換爲這些增量值?

作爲獎勵的問題是有沒有辦法在的MKMapView :)指定最小最大縮放級別

感謝

回答

133

首先,MKMapView不使用/有一組預定義的縮放級別,例如Google Maps。

相反,使用MKCoordinateRegion,它由兩個值中的所描述的的MKMapView的可見區域:

  1. 中心(該區域的中心點),並且
  2. 跨度 (中心周圍可見區域的大小)。

中心點應該是顯而易見的(它是該地區的中心點。)

然而,跨度(這是一個MKCoordinateSpan)組成:

  1. latitudeDelta(由區域表示)的垂直距離,和
  2. longitudeDelta(水平距離表示由該地區)。

一個簡單的例子。這裏的一個玩具MKCoordinateRegion:

  1. 中心:
    • 緯度:0
    • 經度:0
  2. 跨度:
    • latitudeDelta:8
    • longitudeDelta:6

的區域可使用其分來描述和最大座標如下:

  1. 分鐘座標(左下點):
    • 緯度:-4
    • 經度:-3
  2. 最大座標(右上角點):
    • 緯度:4
    • 經度:3

所以,你可以指定圍繞中心點縮放級別通過使用適當大小的MKCoordinateSpan。作爲Google的數字縮放級別的近似值,您可以反向設計Google針對給定縮放級別使用的跨度大小,並相應地創建跨度。 (Google以與MKMapView相同的方式描述其視圖區域,作爲中心+跨度,因此您可以將這些值從Google地圖中拉出。)

至於限制區域,您可以使用此委託方法:

mapView:regionWillChangeAnimated 

eg通過將區域重新調整到允許的縮放級別。 (有點像桌子的景色會讓你滾動過去的邊緣,但會把橡皮筋帶回原位。)但是,你的里程可能會有所不同,因爲我沒有用它來達到這個目的。

順便說一句,在OS 3.1中有明確的修復/改進MapKit的方面,這給了我3.0的麻煩。

+0

尼斯這讓我知道基礎。 Upvoted !!! – NSPratik 2015-02-21 15:12:01

+0

@Kelvin,你能描述一下更詳細的細節:「如何對Google給定的縮放級別的跨度大小進行反向工程並創建一個跨度」。我真的需要它 – 2015-05-16 03:08:52

4

跨度爲緯度和經度。相反,有一種方法可以構建需要距離的MKCoordinateRegion結構。這可能是因爲您正在使用MKCoordinateRegionMakeWithDistance指定跨度,然後在regionDidChange中檢查它時,您會看到緯度/經度跨度,它是如何存儲在MKCoordinateRegion結構中的。

據我所知,當使用MKMapKit時,整數縮放級別不可用或者根本沒有用。我個人更喜歡使用跨度數字,它更加靈活。

你不能指定最大和最小縮放比例,我不知道有什麼辦法可以把它放進去。現在MKMapKit實際上很弱,我對缺乏特性感到非常失望。

3

使用maps.google快速比較某個位置的縮放級別。COM通過檢查鏈接查詢字符串表明,2倍dx和dy跨度值增加:

(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 
    ... 
117

如果你喜歡使用顯式縮放級別,而不是定義MKCoordinateSpan,我寫了一個類別,增加了指定支持MKMapView的縮放級別。代碼可以找到here

2

Brant在MKMapView上的分類效果很好。但是,在計算mapSizeInPixels時,它似乎尚未更新爲支持具有視網膜屏幕的較新設備。

可以固定通過更換這行:

CGSize mapSizeInPixels = mapView.bounds.size; 

這一行:描述

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);