帮助从 iPhone 中的纬度和经度计算 X 和 Y
Posted
技术标签:
【中文标题】帮助从 iPhone 中的纬度和经度计算 X 和 Y【英文标题】:Help calculating X and Y from Latitude and Longitude in iPhone 【发布时间】:2011-10-14 16:43:22 【问题描述】:在 iPhone 上使用自定义地图时,我陷入了某种地理位置的困境。问题是:我有一个UIScrollView
和一个UIImageView
,上面有一张展会定制地图的图像,以及所有展位位置等等。
我最大的问题是我打算使用地理定位来定位该地图内的人。当我尝试获取给定纬度和经度的像素位置时,问题就开始了。我有几个地面控制点作为参考,甚至设法计算了我的参考点和当前位置之间的角度。问题是我无法将像素距离与使用地理位置坐标计算的距离相关联。
我试图将它们关联如下:
计算地图中已知点的距离(以像素为单位)。 使用两个参考点的矢量距离计算来计算距离。 等于上面两个以找到与参考的实际距离。
但我根本没有成功......
使用余弦定律,我可以找到可以给出 X 和 Y 投影的角度,但我找不到正确相乘的比例。我猜是因为纬度和经度以度数给出并且是非线性的,但是我有一个很小的点,我可以将它近似为线性点。
我不能在 MKMapKit 中使用叠加图像,因为我必须水平使用地图,而在谷歌地图中,同一个地方向左旋转几度。
更新:
关注此站点:http://www.movable-type.co.uk/scripts/latlong.html,我可以使用 Haversine 公式计算距离,但作为下面的方向,我发现我以错误的方式计算角度。我将不得不找到另一种计算角度的方法。
【问题讨论】:
看看这个:***.com/questions/6534691/… 【参考方案1】:我会通过假设平面地球近似并使用矢量代数将 lat,lon 空间中的角度和距离与 x,y 像素空间相关联来做到这一点。
例如:
我假设您知道左下角和右下角的纬度、经度。还假设您的公平地图不在两极附近并且面积相当小。
选择一个坐标系,比如左下角,已知 lat,lon 为 0,0 像素。在下面的伪代码中调用了 lat1,lon2
计算从右下角lat2,lon2到左下角lat1,lon1的向量1
使用简单的投影xl=lon,yl=lat,然后向量1 = (lon2 - lon1)i + (lat2-lat1)j
从你想要的人的纬度,经度位置计算向量 2 (latp,lonp) 到地图左下角的点 lat1,lon1
使用向量点积得到向量1和2之间的角度。
通过等角投影计算纬度、经度空间中的距离:
p1 = (lonp - lon1) cos ( 0.5*(latp+lat1) ) (convert lat/lon to radians)
p2 = (latp - lat1)
distance = R * sqrt( p1*p1 + p2*p2)
use R = 6371000 and your distance will be in meters
现在将此距离缩放到您的地图比例
此时,您已经有了像素空间中该点的极坐标
您现在进行极坐标到矩形的转换; x = r cos(角度), y = r sin(角度)
r 是缩放距离(即像素空间中的距离),angle 是上面向量 1 和 2 之间的角度
作为一个健全的检查,您可以计算从左上角到左下角创建的纬度、经度向量的角度,从右下角到左下角点缀。如果角度不接近 90 度,则可能存在太多失真。
【讨论】:
我正在尝试实施您的答案。我已经设法使用余弦定律计算角度。我试图找出我将使用的地图的比例。关于那个验证,我已经做到了,但我的结果并不好。我有一个 56 度角,我应该有 90 度。也许我计算错了一些东西。我会继续尝试你的答案。看来我可以使用平地近似,因为我的面积不超过 4km x 4km。我会让你知道我的成就。非常感谢您的帮助。 如果完整性检查不在 90 左右,那么您不能使用上面的矢量方法来获取角度。此时,您可以尝试通过 Bearing = atan2( sin(lon2-lon1) * cos(lat2) , cos(lat1)*sin(lat2)-sin(lat1)*cos( lat2)*cos(lon2-lon1));.然后用已知的 x,y 计算具有已知纬度/经度的方位并减去角度。然后通过方位差旋转 x,y 向量。 按照您的方向,我可以使用本网站movable-type.co.uk/scripts/latlong.html 上的 Haversine 公式计算距离。该公式是在javascript上的,所以我将它转换为objective-C。你能更好地解释一下轴承是什么吗? 您可以使用 Haversine,但对于这么小的区域来说它是多余的。如果从 a 点到 b 点,您可以将方位视为您的罗盘将读取的内容。因此,获取从人到已知点的方位(罗盘角度),然后从两个已知的纬度、经度和 x,y 对中减去。 它就像一个魅力!非常感谢大佬!!!我终于可以有真实坐标的地图了!!【参考方案2】:不确定我是否理解正确.. 但在一小段距离内,您应该能够将 Lat/Long 缩放到 y/x 坐标.. 或者您可以采用其他方式。
我要做的是计算/查找图像角的纬度/经度坐标,然后将中间的点缩放到该范围内的像素位置。例如:
假设您的图片左上角(101 像素宽)代表 lat/lng (0,100) 和右上角 (0,100.1)。现在,如果您想放置点 (0,100.05),您只需将其放置在中间 - 即像素 (x,y) (51,0)。
我还将所有纬度/经度从度/分/秒转换为十进制度 - 即。 150 度 30 分钟变为 150.5。
【讨论】:
我已经尝试过了,但是发生的事情是(x,y)轴与纬度/长轴不一致,这会导致错误的测量。我正在尝试进行 2D 坐标保形变换以均衡两个坐标系,但我找不到适合的比例。 对,我假设图像与纬度/经度网格对齐。在这种情况下,您需要使用仿射变换在 lat/lng 和像素之间进行映射 - 正如 TreyA 的回答中所述【参考方案3】:我认为您正在寻找屏幕投影。
google.maps.Projection object specification
fromLatLngToPoint(latLng:LatLng, point?:Point)
从 LatLng 圆柱体平移到 Point 平面。这个界面 指定一个从给定 LatLng 实现翻译的函数 地图投影上的世界坐标值。地图 API 调用 当需要在屏幕上绘制位置时使用此方法。投影 对象必须实现此方法。
http://code.google.com/apis/maps/documentation/javascript/reference.html#Projection
编辑:
MKCoordinateForMapPoint 返回指定的纬度和经度 对应指定的地图点。
CLLocationCoordinate2D MKCoordinateForMapPoint(
MKMapPoint mapPoint
);
MKMapPointForCoordinate 返回地图点数据结构 对应指定坐标。
MKMapPoint MKMapPointForCoordinate(
CLLocationCoordinate2D coordinate
);
http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/doc/uid/TP40008209
【讨论】:
这些是开源的吗?也许我可以尝试将它从 JS 转换为 Objective-C 以便与 iPhone 一起使用。没有使用 javascript,因为这是本机应用程序。以上是关于帮助从 iPhone 中的纬度和经度计算 X 和 Y的主要内容,如果未能解决你的问题,请参考以下文章
如何处理多个引脚将在 iphone sdk 中的一个经度和纬度上掉线?