2011-09-29 109 views
21

我想知道iPhone編程中MKMapView的當前縮放級別,我該怎麼做? 其實我有一個應用程序,這是幾個參數(從中心到角落的半徑爲MKMapView)正在返回商店的詳細信息,當我在MKMapView上時,半徑非常高,並且它在半徑較小時發生變化,所以我想知道縮放級別並根據此設置我的webservice,如何獲取當前MKMapView可見區域的縮放級別?如何找到MKMapView的當前縮放級別?

+1

剛剛從 Minakshi

回答

13

您可以在MKMapViewregion屬性內使用span。它是這樣定義的:

typedef struct { 
    CLLocationDegrees latitudeDelta; 
    CLLocationDegrees longitudeDelta; 
} MKCoordinateSpan; 

看看documentation。那裏有很好的解釋。

46

我創造了非常簡單的輔助子吧:

#define MERCATOR_RADIUS 85445659.44705395 
#define MAX_GOOGLE_LEVELS 20 

@interface MKMapView (ZoomLevel) 
- (double)getZoomLevel; 
@end 

@implementation MKMapView (ZoomLevel) 

- (double)getZoomLevel 
{ 
    CLLocationDegrees longitudeDelta = self.region.span.longitudeDelta; 
    CGFloat mapWidthInPixels = self.bounds.size.width; 
    double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI/(180.0 * mapWidthInPixels); 
    double zoomer = MAX_GOOGLE_LEVELS - log2(zoomScale); 
    if (zoomer < 0) zoomer = 0; 
// zoomer = round(zoomer); 
    return zoomer; 
} 

@end 
+0

我查答案認爲MAX_GOOGLE_LEVELS可以從'MKMapSizeWorld.width/256'獲得並且獲得log2 o的f其中256是在像素中的瓦片的寬度或高度瓦(或者指向) – huggie

+0

也就是說爲log 2(MKMapSizeWorld.width/256) – huggie

+11

粘到目標C的標準,該方法的名稱應該是個zoomLevel代替getZoomLevel。 –

3

以前所有的答案,不考慮當前地圖的旋轉。 MKMapView的經緯度因非旋轉地圖和旋轉地圖而異。 這裏是直的地圖縮放計算一個很大的功能:https://stackoverflow.com/a/15020534/4923516

這裏是我在斯威夫特的改進,即考慮到地圖旋轉,並返回當前的縮放級別:

class MyMapView : MKMapView { 

    func getZoom() -> Double { 
    // function returns current zoom of the map 
    var angleCamera = self.camera.heading 
    if angleCamera > 270 { 
     angleCamera = 360 - angleCamera 
    } else if angleCamera > 90 { 
     angleCamera = fabs(angleCamera - 180) 
    } 
    let angleRad = M_PI * angleCamera/180 // camera heading in radians 
    let width = Double(self.frame.size.width) 
    let height = Double(self.frame.size.height) 
    let heightOffset : Double = 20 // the offset (status bar height) which is taken by MapKit into consideration to calculate visible area height 
    // calculating Longitude span corresponding to normal (non-rotated) width 
    let spanStraight = width * self.region.span.longitudeDelta/(width * cos(angleRad) + (height - heightOffset) * sin(angleRad)) 
    return log2(360 * ((width/256)/spanStraight)) + 1; 
    } 

} 

您可以下載樣本項目我的回購:https://github.com/d-babych/mapkit-wrap

5

獲取當前縮放級別整數的最簡單方法是使用MapView函數:regionDidChangeAnimated。此功能可識別變焦中的每個變化,併爲您提供變焦係數計算的基礎。

只需插入此功能到您的MapView類(作品雨燕3.0):

var mapView: MKMapView! = nil 

... 

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
    let zoomWidth = mapView.visibleMapRect.size.width 
    let zoomFactor = Int(log2(zoomWidth)) - 9 
    print("...REGION DID CHANGE: ZOOM FACTOR \(zoomFactor)") 
} 

,你會得到一個zoomFactor值出來,其中0表示最近點,你可以放大地圖和每一個更高的價值是一個很遠很遠變焦... :-)

+0

美麗,感謝 –

+0

爲什麼 - 9日在zoomFactor – miff

+0

的9不必要的,如果你想最大變焦係數爲0 ....沒有9,在我的情況下它將以9結束。 – MosTwanTedT