在基于位置的应用中,我们使用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
为什么使用该方法创建的坐标不正确?
答案 0 :(得分:7)
MKMapPoint
不是纬度和经度。如果是,您将不需要将其“转换”为坐标的功能。
正如位置感知编程指南在Understanding Map Geometry部分中所述:
地图点是墨卡托地图投影上的x和y值。地图点用于许多与地图相关的计算而不是地图坐标,因为它们简化了计算中涉及的数学。
documentation for MKMapPoint更清晰:
如果将地球的曲面投影到平面上, 你得到的是经度的地图的二维版本 线看起来是平行的。 ...
地图点的实际单位与使用的基础单位相关联 绘制MKMapView的内容,但你永远不需要 直接担心这些单位。 ...
将地图相关数据保存到文件时,应始终保存 坐标值(纬度和经度)而不是地图点。
地图点51.96, 6.3
对应于地图投影左上角的坐标。如果您想使用坐标(纬度,经度),请使用CLLocationCoordinate2D
以避免混淆。
(从技术上讲,您可以使用MKMapPoint
结构来存储坐标值,但不需要将它们转换为坐标,错误的类型用法只会导致混淆。)