我想知道在iPhone编程中,如何获取MKMapView
的当前缩放级别?
实际上,我有一个应用程序,它需要几个参数(从MKMapView
中心到角落的半径),并返回该区域内的商店详细信息。当我在MKMapView
上时,半径很大,并且在半径较小时更改。因此,我想知道当前MKMapView
可见区域的缩放级别,并根据此设置我的Web服务。如何获取当前MKMapView
的缩放级别?
我想知道在iPhone编程中,如何获取MKMapView
的当前缩放级别?
实际上,我有一个应用程序,它需要几个参数(从MKMapView
中心到角落的半径),并返回该区域内的商店详细信息。当我在MKMapView
上时,半径很大,并且在半径较小时更改。因此,我想知道当前MKMapView
可见区域的缩放级别,并根据此设置我的Web服务。如何获取当前MKMapView
的缩放级别?
我为此创建了一个非常简单的帮助子类:
#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
MKMapSizeWorld.width / 256
获取 MAX_GOOGLE_LEVELS,并取其 log2 值,其中 256 是像素(或者可能是点)的瓦片宽度或高度。 - huggie您可以在 MKMapView
的 region
属性内使用 span
。它的定义如下:
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
请查看文档,那里讲得很清楚。
所有之前的答案都没有考虑当前地图旋转。MKMapView在非旋转和旋转状态下的longitudeDelta不同。以下是一个非常好用的函数,用于计算直接地图缩放:https://dev59.com/d2855IYBdhLWcg3wsWv3#15020534
这里是我在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函数:regionDidChangeAnimated。此函数会识别每个缩放变化并为缩放因子的计算提供基础。
只需将此函数插入到您的MapView类中(适用于Swift 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是您可以缩放到地图上的最近点,每个更高的值都是一个遥远的缩放... :-)
mapView.camera.altitude
来获取当前显示的地图区域的海拔高度。当我搜索如何获取地图缩放级别时,这就是帮助我的方法。