了解MKCoordinateFromMapPoint行为

时间:2012-02-21 14:46:48

标签: ios mkmapview cllocation

在基于位置的应用中,我们使用MKMapPoints来存储位置,例如当前用户位置。

当我们尝试在MKMapView上使用此位置时,要设置最初显示的区域(放大用户),我们将其转换为CLLocationCoordinate2D

有一种方便的方法:namenly:MKCoordinateForMapPoint,但在测试过程中会产生奇怪的结果。

  MKMapPoint mapPoint = MKMapPointMake(51.96, 6.3); // My area ;)
  CLLocationCoordinate2D automagicCoordinate = MKCoordinateForMapPoint(mapPoint);
  CLLocationCoordinate2D manualCoordinate = CLLocationCoordinate2DMake(mapPoint.x, mapPoint.y);

我希望automagicCoordinate和manualCoordinate都是完全一样的。 但是当我在调试器中检查它时,我得到以下结果:

automagicCoordinate.latitude = (CLLocationDegrees) 85.05
automagicCoordinate.longitude = (CLLocationDegrees) -179.99

manualCoordinate.latitude = (CLLocationDegrees) 51.96
manualCoordinate.longitude = (CLLocationDegrees) 6.3

为什么使用该方法创建的坐标不正确?

1 个答案:

答案 0 :(得分:7)

MKMapPoint不是纬度和经度。如果是,您将不需要将其“转换”为坐标的功能。

正如位置感知编程指南在Understanding Map Geometry部分中所述:

  

地图点是墨卡托地图投影上的x和y值。地图点用于许多与地图相关的计算而不是地图坐标,因为它们简化了计算中涉及的数学。

documentation for MKMapPoint更清晰:

  

如果将地球的曲面投影到平面上,   你得到的是经度的地图的二维版本   线看起来是平行的。 ...

     

地图点的实际单位与使用的基础单位相关联   绘制MKMapView的内容,但你永远不需要   直接担心这些单位。 ...

     

将地图相关数据保存到文件时,应始终保存   坐标值(纬度和经度)而不是地图点。

地图点51.96, 6.3对应于地图投影左上角的坐标。如果您想使用坐标(纬度,经度),请使用CLLocationCoordinate2D以避免混淆。

(从技术上讲,您可以使用MKMapPoint结构来存储坐标值,但不需要将它们转换为坐标,错误的类型用法只会导致混淆。)