web-dev-qa-db-ja.com

MKMapViewの現在のズームレベルを見つける方法

IPhoneプログラミングでMKMapViewの現在のズームレベルを知りたいのですが、どうすればよいですか?実際、私は1つのアプリを持っています。つまり、いくつかの引数(MKMapViewの中心から隅までの半径)を使用して、ストアの詳細を返しています。つまり、MKMapViewにいるとき、半径は非常に大きいですRadiusが小さいと変化するので、ズームレベルを知り、それに応じてWebサービスをセットアップしたいのですが、現在のMKMapView表示領域のズームレベルを取得するにはどうすればよいですか?

27

spanregionプロパティ内でMKMapViewを使用できます。これは次のように定義されています:

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

documentation をご覧ください。よく説明されています。

16
Fran Sevillano

そのための非常に単純なヘルパーサブクラスを作成しました。

#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
50
NiKe

現在のズームレベルの整数を取得する最も簡単な方法は、MapView関数のregionDidChangeAnimatedを使用することです。この関数は、ズームのすべての変更を認識し、ズーム係数の計算の基礎を提供します。

この関数をMapViewクラスに挿入するだけです(Swift 3.で機能)):

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はマップにズームできる最も近いポイントであり、より高い値はすべて遠く離れたズームです... :-)

10
MosTwanTedT

これまでのすべての回答は、現在のマップの回転を考慮していません。 MKMapViewのlongitudeDeltaは、非回転マップと回転マップで異なります。ストレートマップズーム計算に最適な関数を次に示します。 https://stackoverflow.com/a/15020534/4923516

そして、これがマップの回転を考慮して現在のズームレベルを返すSwiftの私の改良点です。

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

6
Dmytro Babych

それが役立つ場合は、mapView.camera.altitude現在表示されている地図領域の現在の高度を取得します。

これは、地図のズームレベルを取得する方法を検索したときに役立ちました。

0
razvan