Problem
GPS 投影到 2D 表面通常是一个棘手的问题,因为地球表面是弯曲的,而不是平坦的。但是,如果您提供的示例 GPS 数据是实际数据(顺便说一句,希望斯旺西的天气宜人!)我将假设数据集仅限于一个非常小的区域,因此您可以假设经度平行。那么问题就变成了一个简单的代数问题,你只需要两个参考点x1 != x2
and y1 != y2
.
Solution
ISO 坐标为 (纬度, 经度) = (y, x),而绘制坐标为 (x, y)。我将向您展示如何执行 y(纬度)。我们需要将源(屏幕)的原点映射到目标(世界)的原点,并将源的比例映射到世界的比例。我将按如下方式命名这些变量:
screenY0 //Screen origin (pixel corresponding to zero degrees latitude)
worldY0 //World origin (zero degrees latitude)
screenYscale //Screen scale (distance between 2 pixels)
worldYscale //World scale (distance between two latitude lines)
screenYpoint //Screen point (pixel y location)
worldYpoint //World point (latitude on the ground)
我将使用以下坐标对,因为它们相距最远:
(51.606733, -3.986813) -> (246, 399)
(51.607337, -3.987266) -> (838, 781)
我们的公式将如下所示:
screenY0 + screenYscale * screenYpoint = worldY0 + worldYscale * worldYpoint.
我们知道世界原点为 0,世界尺度为 1,因此我们可以将其压缩为:
screenY0 + screenYscale * screenYpoint = worldYpoint.
我们可以代入我们的值来形成 2 个联立方程:
screenY0 + screenYscale * 399 = 51.606733
and screenY0 + screenYscale * 781 = 51.60733
Solving:
screenY0 = 51.606733 - screenYscale * 399
and screenY0 = 51.607337 - screenYscale * 781
=> 51.606733 - screenYscale * 399 = 51.607337 - screenYscale * 781
=> screenYscale * 781 - screenYscale * 399 = 51.607337 - 51.606733
=> screenYscale * 382 = 0.000604
=> screenYscale = 0.00000158115
因此,地图上的每个像素代表 0.00000158115 经度。插入查找原点:
screenY0 + screenYscale * 399 = 51.606733
=> screenY0 + 0.00000158115 * 399 = 51.606733
=> screenY0 + 0.00063087885 = 51.606733
=> screenY0 = 51.606733 - 0.00063087885
=> screenY0 = 51.6061021212
因此,0 处的像素代表现实世界中的 51.6061021212。
Formula
我们寻找现实世界纬度的公式是:
51.6061021212 + 0.00000158115 * 屏幕Y点 = 世界Y点。
Testing
让我们用其他参考纬度来测试一下:51.606671 -> 402
51.6061021212 + 0.00000158115 * screenYpoint = worldYpoint
51.6061021212 + 0.00000158115 * 402 = 51.606671
51.6061021212 + 0.0006356223 = 51.606671
51.6067377435 = 51.606671
这大约相等;考虑到 1 纬度等于 111.2 公里(地球平均半径),这对应于约 7.4 米的误差。
希望这对您有所帮助,并帮助您解决经度(又称为 x)!如果您有任何问题或希望我澄清,请发表评论。