MKMapView缩放和Region

问题描述:

我熟悉使用Google Maps JavaScript API。最近我开始为一个iphone项目使用MapKit框架,但我很难找出缩放并在地图上设置区域。MKMapView缩放和Region

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

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

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

作为奖励的问题是有没有办法在的MKMapView :)指定最小最大缩放级别

感谢

首先,MKMapView不使用/有一组预定义的缩放级别,例如Google Maps。

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

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

中心点应该是显而易见的(它是该地区的中心点。)

然而,跨度(这是一个MKCoordinateSpan)组成:

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

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

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

的区域可使用其分来描述和最大坐标如下:

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

所以,你可以指定围绕中心点缩放级别通过使用适当大小的MKCoordinateSpan。作为Google的数字缩放级别的近似值,您可以反向设计Google针对给定缩放级别使用的跨度大小,并相应地创建跨度。 (Google以与MKMapView相同的方式描述其视图区域,作为中心+跨度,因此您可以将这些值从Google地图中拉出。)

至于限制区域,您可以使用此委托方法:

mapView:regionWillChangeAnimated 

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

顺便说一句,在OS 3.1中有明确的修复/改进MapKit的方面,这给了我3.0的麻烦。

+0

尼斯这让我知道基础。 Upvoted !!! – NSPratik 2015-02-21 15:12:01

+0

@Kelvin,你能描述一下更详细的细节:“如何对Google给定的缩放级别的跨度大小进行反向工程并创建一个跨度”。我真的需要它 – 2015-05-16 03:08:52

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

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

你不能指定最大和最小缩放比例,我不知道有什么办法可以把它放进去。现在MKMapKit实际上很弱,我对缺乏特性感到非常失望。

使用maps.google快速比较某个位置的缩放级别。COM通过检查链接查询字符串表明,2倍dx和dy跨度值增加:

(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 
    ... 

如果你喜欢使用显式缩放级别,而不是定义MKCoordinateSpan,我写了一个类别,增加了指定支持MKMapView的缩放级别。代码可以找到here

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

可以固定通过更换这行:

CGSize mapSizeInPixels = mapView.bounds.size; 

这一行:描述

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