MKMapView缩放和区域

coc*_*her 85 iphone cocoa-touch zoom mapkit

我熟悉使用Google Maps Javascript API.最近我开始使用MapKit框架进行iphone项目,但我很难找到缩放并在地图上设置区域.

在谷歌地图API中,我曾经使用整数缩放级别,如8,9,10,以及简单的函数setZoom().我在MapKit框架中看到的唯一等价方法是setRegion:animated.据我了解,我需要设置区域的跨度的纬度和经度"delta"值来指定缩放级别.但我真的不知道这些值代表什么(我阅读文档).

当我使用MKMapView委托并跟踪regionDidChange中的span值时,委托方法结果似乎彼此不相关.当我缩小并查看文档中指定的跨度增量值正在增加时,这没关系.但突然我拖动地图而没有缩放,delta值变为0.0.

有人可以解释一下这些跨度和三角洲的参考点是什么?或者是否有任何算法将整数缩放级别(如9)转换为这些delta值?

作为一个额外的问题是有任何方法来指定MKMapView上的最小 - 最大缩放级别:)

谢谢

小智 134

首先,MKMapView没有像谷歌地图那样使用/拥有一组预定义的缩放级别.

相反,MKMapView的可见区域是使用MKCoordinateRegion描述的,它由两个值组成:

  1. 中心(该地区的中心点),和
  2. span(中心周围可见区域的大小).

中心点应该是显而易见的(它是该区域的中心点.)

但是,span(这是一个MKCoordinateSpan)包括:

  1. latitudeDelta(由区域表示的垂直距离),和
  2. longitudeDelta(由区域表示的水平距离).

一个简短的例子.这是一个玩具MKCoordinateRegion:

  1. 中央:
    • 纬度:0
    • 经度:0
  2. 跨度:
    • latitudeDelta:8
    • 经度德尔塔:6

可以使用其最小和最大坐标来描述该区域,如下所示:

  1. 最小坐标(左下角):
    • 纬度:-4
    • 经度:-3
  2. 最大坐标(右上角):
    • 纬度:4
    • 经度:3

因此,您可以使用适当大小的MKCoordinateSpan指定中心点周围的缩放级别.作为Google数字缩放级别的近似值,您可以对Google针对给定缩放级别使用的跨度大小进行反向工程,并相应地创建跨度.(Google以与MKMapView相同的方式描述了他们的视图区域,作为中心+跨度,因此您可以将这些值从Google地图中提取出来.)

至于限制区域,你可以玩这个委托方法:

mapView:regionWillChangeAnimated
Run Code Online (Sandbox Code Playgroud)

例如,通过将区域重新调整为允许的缩放级别.(有点像桌面视图会让你滚过边缘,但橡皮筋会回到原位.)但是,你的里程可能会有所不同,因为我没有将它用于此目的.

顺便说一下,OS 3.1中对MapKit方面有明确的修复/改进,给我带来麻烦.


小智 118

如果您更喜欢使用显式缩放级别而不是定义MKCoordinateSpan,我写了一个类别,它增加了对指定MKMapView缩放级别的支持.代码可以在这里找到.

  • 混帐://github.com/jdp-global/MKMapViewZoom.git (5认同)
  • Troy的博客文章让我对mapkit和谷歌地图的工作原理有了深刻的理解.我强烈建议阅读它. (4认同)