MKMapView缩放和区域


85

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

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

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

有人可以解释一下这些跨度和增量的参考点是什么吗?还是有任何算法可以将整数缩放级别(如9)转换为这些增量值?

作为一个额外的问题,有什么方法可以在MKMapView上指定最小最大缩放级别:)

谢谢

Answers:


134

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

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

  1. 中心(区域的中心点),以及
  2. 跨度(中心附近可见区域的大小)。

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

但是,span(是MKCoordinateSpan)包含:

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

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

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

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

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

因此,您可以使用适当大小的MKCoordinateSpan指定围绕中心点的缩放级别。作为Google数值缩放级别的近似值,您可以反向工程Google用于给定缩放级别的跨度大小,并相应地创建一个跨度。(Google以与MKMapView相同的方式描述了它们的视图区域,即中心+跨度,因此您可以将这些值从Google Maps中拉出。)

至于限制区域,您可以使用以下委托方法进行播放:

mapView:regionWillChangeAnimated

例如,通过将区域重新调整为允许的缩放级别。(有点像表视图如何使您滚动到边缘之外,然后又将橡皮筋拉回原位。)但是,您的里程可能会有所不同,因为我没有将其用于此目的。

顺便说一句,在OS 3.1中对MapKit的某些方面进行了确定的修复/改进,这些问题在3.0中给我带来了麻烦。


@Kelvin,您能否详细描述如何“反向工程Google用于给定缩放级别的跨度大小并创建跨度”。我真的很需要
Scofield Tran 2015年

118

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


4
特洛伊(Troy)的博客文章使我对mapkit和google maps的工作方式有了很好的了解。我强烈建议您阅读。
亚伦

5
git://github.com/jdp-global/MKMapViewZoom.git
johndpope 2011年

@JohnMerlino是它
佐尔坦Matók

5

跨度以纬度和经度为单位。有一种构造MKCoordinateRegion结构的方法,该方法占用距离。可能是您正在使用MKCoordinateRegionMakeWithDistance指定跨度,然后在regionDidChange中对其进行检查时,您会看到纬度/经度,这就是将其存储在MKCoordinateRegion结构中的方式。

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

您无法指定最大和最小缩放,而且我不知道有什么方法可以破解它。MKMapKit目前实际上非常薄弱,我对缺少功能感到失望。


3

使用maps.google.com通过检查链接查询字符串对位置的缩放级别进行快速比较,结果显示dx和dy span值增加了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
  ...

2

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

可以通过替换以下行来解决:

CGSize mapSizeInPixels = mapView.bounds.size;

用这行:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.