首页 文章

MKMapView缩放和区域

提问于
浏览
83

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

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

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

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

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

谢谢

5 回答

  • 4

    首先, MKMapView 不使用/具有一组预定义的缩放级别,如谷歌 Map .

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

    • center (该地区的中心点),和

    • span (中心周围可见区域的大小) .

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

    但是,span( MKCoordinateSpan )包括:

    • latitudeDelta (由区域表示的垂直距离),和

    • longitudeDelta (由区域表示的水平距离) .

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

    • 中心:

    • 纬度:0

    • 经度:0

    • span:

    • latitudeDelta:8

    • 经度Delta:6

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

    • min坐标(左下角):

    • 纬度:-4

    • 经度:-3

    • 最大坐标(右上角):

    • 纬度:4

    • 经度:3

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

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

    mapView:regionWillChangeAnimated
    

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

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

  • 2

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

  • 117

    Span 以纬度和经度为单位 . 有一种方法可以构建占用距离的MKCoordinateRegion结构 . 您可能正在使用MKCoordinateRegionMakeWithDistance来指定范围,然后在regionDidChange中检查它时,您会看到纬度/长度 Span ,它是如何存储在MKCoordinateRegion结构中的 .

    据我所知,使用MKMapKit时,整数缩放级别根本不可用或根本没用 . 我个人更喜欢使用 Span 数字,它更灵活 .

    你不能指定最大和最小缩放,我不知道如何破解它.MKMapKit现在实际上非常弱,我对缺乏功能感到非常失望 .

  • 133

    通过检查链接查询字符串使用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
      ...
    
  • 3

    MKMapView上的布兰特类别效果很好 . 但是,在计算mapSizeInPixels时,它似乎尚未更新以支持具有视网膜屏幕的新设备 .

    它可以通过替换此行来修复:

    CGSize mapSizeInPixels = mapView.bounds.size;
    

    有了这条线:

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

相关问题