我正试图制作一个Java项目,在给定坐标(取自谷歌地图)的情况下,精确定位地图图像上的位置。
我试着使用图像的左上角(纬度最高、经度最低的地方)作为某种参考点,这将是地图图像上的(0,0)点,然后我试着根据该参考点计算地图上的每个地方。然而,这种方法被证明是不准确的,可能是因为地球的曲率(请注意,我正在使用的(塞尔维亚)地图覆盖了纬度4°和经度4°的区域)。
我已经看到了一些关于转换为墨卡托投影的答案,但我不太清楚,因为它们没有涵盖与我类似的情况,也不是用Java编写的。
我能做些什么来更准确地定位这些点(±3公里就足够了)?
由于注释正确地指出了oit,为了在地理坐标和地图位置之间精确转换,您必须知道地图使用的投影方法和足够数量的参数,以便使用一组合适的参考点调整剩余参数变得可行。
因此,如果你假设一个圆锥投影,那么阅读大卫指出的文件,以及这篇参考的后续文章。正如你所看到的,在圆锥投影族中,有一些替代方案可供选择。它们中的每一个都由几个参数描述(即标准平行度、圆锥常数、纵横比…)。你可以对这些进行猜测,然后使用一些数值优化来获得最佳拟合。然后你为每种投影取最佳的参数拟合,看看哪种投影的整体拟合最好。相当多的工作。如果你不想实现所有这些投影的代码,你可以在命令行上使用proj.4,也可以将其作为本机库。要进行数值优化,您可以尝试将其中一个COIN-OR项目适应您的应用程序。
在任何情况下,第一步都是创建一组合适的参考点,用于评估拟合。所以,在你的地图上选择几个突出的点,并找到这些点的谷歌地球坐标。我认为你应该至少有十几分,以解释你对地图知之甚少的事实。否则,在地图的其他部分仍然完全关闭的情况下,您将调整大量参数以精确拟合您的点,这是一个很大的风险。即使有了这样数量的参考点,由于塞尔维亚的面积并没有那么大(与横跨整个大陆的地图相比),错误猜测或拟合错误的误差可能非常小。因此,可能很难真正决定使用了哪种投影。
根据我上面所说的,即使外部库负责投影和数值优化,仅设置计算投影的工具就可能需要半年的时间。因此,决定这是否值得付出努力。如果没有,还有几种选择。一种是拿一张不同的地图,一张你知道投影的地图。或者联系地图的作者并获取投影。或者问问在塞尔维亚从事测地线工作的人,因为他们可能有足够的经验一眼就能认出投影,我不知道。
另一种选择是将需要参考点的事实与在任何情况下都可能无法计算出精确投影的事实相结合。只需按以下方式将其组合:选择一组适当密集的参考点,均匀分布在地图上。然后在它们之间进行插值,线性地或以更高的阶数或使用一些加权插值方案或其他什么。你知道这一切背后都有一个投影,但你放弃了计算投影,只是简单地缓解症状:通过有足够的参考点,每个数据项都足够接近一个参考点,以保持误差小于你的阈值。
我在这个线程中找到了我想要的答案:Java,将lat/lon转换为UTM
我发现我的地图的实际投影是UTM。从那里,我只需要找到一个类,将我的纬度/经度坐标转换为UTM东距和北距(这个答案中非常有用的代码),然后我会做简单的数学运算,找出该点与地图边界的比较位置,它实际上是有效的。