IPhoneプログラミングでMKMapView
の現在のズームレベルを知りたいのですが、どうすればよいですか?実際、私は1つのアプリを持っています。つまり、いくつかの引数(MKMapView
の中心から隅までの半径)を使用して、ストアの詳細を返しています。つまり、MKMapView
にいるとき、半径は非常に大きいですRadiusが小さいと変化するので、ズームレベルを知り、それに応じてWebサービスをセットアップしたいのですが、現在のMKMapView
表示領域のズームレベルを取得するにはどうすればよいですか?
span
のregion
プロパティ内でMKMapView
を使用できます。これは次のように定義されています:
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
documentation をご覧ください。よく説明されています。
そのための非常に単純なヘルパーサブクラスを作成しました。
#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
現在のズームレベルの整数を取得する最も簡単な方法は、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はマップにズームできる最も近いポイントであり、より高い値はすべて遠く離れたズームです... :-)
これまでのすべての回答は、現在のマップの回転を考慮していません。 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
それが役立つ場合は、mapView.camera.altitude
現在表示されている地図領域の現在の高度を取得します。
これは、地図のズームレベルを取得する方法を検索したときに役立ちました。