MKMapView缩放和区域

我熟悉使用Google Maps Javascript API。 最近我开始为一个iphone项目使用MapKit框架,但我很难弄清楚缩放和设置地图上的区域。

在Google Maps API中,我使用了8,9,10等整数缩放级别以及简单的函数setZoom()。 我在MapKit框架中唯一可以看到的方法是setRegion:animated。 据我所知,我需要设置一个区域的跨度的纬度和经度的“三angular洲”值来指定缩放级别。 但我真的不知道这些值代表什么(我阅读文档)。

当我使用MKMapView委托并跟踪regionDidChange委托方法结果中的跨度值似乎不相互关联。 当我缩小时,可以看到量程增量值按照文档中的规定增加。 但突然间,我拖动地图而不缩放,增量值变为0.0。

有人可以请解释什么是这些跨度和三angular洲的参考点? 还是有任何algorithm来将整数缩放级别(如9)转换为这些增量值?

作为一个奖金的问题是否有任何方式来指定MKMapView的最小最大缩放级别:)

谢谢

首先, MKMapView不使用像Google Maps那样的预定义缩放级别。

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

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

中心点应该是明显的(这是该地区的中心点)。

然而,跨度(这是一个MKCoordinateSpan )包括:

  1. latitudeDelta (地区代表的垂直距离),和
  2. 经度Delta (由区域表示的水平距离)。

一个简单的例子。 这是一个玩具MKCoordinateRegion:

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

该区域可以用下面的最小和最大坐标来描述:

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

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

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

mapView:regionWillChangeAnimated 

例如通过将区域重新调整到允许的缩放级别。 (有点像桌子的意见会让你滚动过去的边缘,但将橡皮筋回到位)。但是,你的里程可能会有所不同,因为我没有用于这个目的。

顺便说一句,有一些MapKit方面的操作系统3.1有明确的修复/改进,给我在3.0的麻烦。

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

跨度是经度和纬度。 有一种方法来构buildMKCoordinateRegion结构,而不是距离。 这可能是因为您正在使用MKCoordinateRegionMakeWithDistance来指定跨度,然后在regionDidChange中检查它时,您会看到经度/纬度跨度,它是如何存储在MKCoordinateRegion结构中的。

据我所知,当使用MKMapKit时,整数缩放级别不可用或者根本没有用处。 我个人比较喜欢用跨度数字,比较灵活。

你不能指定最大和最小缩放,我不知道有什么方法来破解它。现在MKMapKit实际上很弱,我对缺乏function感到非常失望。

通过检查链接查询string,使用maps.google.com快速比较某个位置的缩放级别,结果显示dx和dy跨度值增加了2倍:

  (0.005334, 0.011834) starting span (0.010668, 0.023668) dx: x2, dy: x2 (0.021335, 0.047337) dx: x2, dy: x2 (0.042671, 0.094671) dx: x2, dy: x2 ... 

Brant在MKMapView上的分类效果很好。 但是,在计算mapSizeInPixels时,似乎还没有更新以支持具有视网膜屏幕的较新设备。

可以通过replace这一行来修复:

 CGSize mapSizeInPixels = mapView.bounds.size; 

用这一行:

 CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);