【问题标题】:how to find current zoom level of MKMapView?如何找到 MKMapView 的当前缩放级别?
【发布时间】:2011-11-27 12:47:06
【问题描述】:

我想知道iphone编程中MKMapView的当前缩放级别,我该怎么做? 实际上我有一个应用程序,它需要很少的参数(半径从MKMapView 的中心到角落)正在返回商店详细信息,当我在MKMapView 上时,半径非常高,当半径为更小,所以我想知道缩放级别并据此设置我的网络服务,如何获得当前MKMapView 可见区域的缩放级别?

【问题讨论】:

  • 查看stackoverflow.com/questions/1166444/mkmapview-zoom-and-region>的答案

标签: iphone mkmapview


【解决方案1】:

如果有帮助,您还可以使用mapView.camera.altitude 获取当前显示的地图区域的当前高度。

当我搜索如何获取地图缩放级别时,这对我有帮助。

【讨论】:

    【解决方案2】:

    之前的所有答案都没有考虑当前的地图旋转。 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;
      }
    
    }
    

    您可以在我的 repo 中下载示例项目:https://github.com/d-babych/mapkit-wrap

    【讨论】:

      【解决方案3】:

      获取当前缩放级别的整数的最简单方法是使用 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 是你可以放大地图的最近点,每个更高的值是一个很远的缩放... :-)

      【讨论】:

      • 为什么 - zoomFactor 为 9?
      • 9 不是必需的,如果您想最终将最大缩放因子设为 0,这只是为了这种情况。如果没有 9,在我的情况下它将以 9 结尾。
      • 这将使 -9 成为必要,因为这是标准缩放级别的工作方式。
      【解决方案4】:

      我为它创建了非常简单的辅助子类:

      #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
      

      【讨论】:

      • 我认为 MAX_GOOGLE_LEVELS 可以从 MKMapSizeWorld.width / 256 获得并取 log2,其中 256 是以像素(或点)为单位的图块宽度或图块高度
      • 即log2(MKMapSizeWorld.width / 256)
      • 为了遵守 Objective C 标准,方法的名称应该是 zoomLevel 而不是 getZoomLevel。
      • 最简单的方法是创建一个类别:gist.github.com/d2burke/ad29811b07ae31b378ff(感谢 Nikita Galayko @NiKe
      【解决方案5】:

      您可以在MKMapViewregion 属性内使用span。它是这样定义的:

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

      看看documentation。那里解释得很好。

      【讨论】:

        猜你喜欢
        • 2011-12-04
        • 2011-09-17
        • 2012-12-15
        • 2015-12-07
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 2016-06-07
        相关资源
        最近更新 更多