我想知道MKMapView
iphone编程中当前的缩放级别,我该怎么做?实际上我有一个应用程序,即少量参数(从中心到角落的半径MKMapView
)正在返回商店详细信息,当我打开时MKMapView
,半径非常高,当Radius较小时它会改变,所以我想要知道缩放级别并根据它设置我的webservice,如何获得当前MKMapView
可见区域的缩放级别?
小智 50
我为它创建了非常简单的辅助子类:
#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
Run Code Online (Sandbox Code Playgroud)
Fra*_*ano 16
您可以span
在region
酒店内使用MKMapView
.它的定义如下:
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
Run Code Online (Sandbox Code Playgroud)
看一下文档.那里有很好的解释.
Mos*_*edT 10
获取当前缩放级别的Integer的最简单方法是使用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)")
}
Run Code Online (Sandbox Code Playgroud)
并且你会得到一个zoomFactor值,其中0是你可以放大到地图的最近点,而每个更高的值都是遥远的缩放...... :-)
小智 6
所有先前的答案都没有考虑当前的地图旋转.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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在我的仓库下载示例项目:https://github.com/d-babych/mapkit-wrap
归档时间: |
|
查看次数: |
24432 次 |
最近记录: |