java - 如何正确地将地理坐标转换为屏幕上的像素?

标签 java math 2d map-projections mercator

我正在尝试创建一个 Java 项目,当给定坐标(取自 Google map )时,该项目可以精确定位 map 图像上的位置。

我尝试使用图像的左上角(纬度最高、经度最低的地方)作为某种引用点,即 map 上的 (0,0) 点图像,然后我尝试根据该引用点计算 map 上的每个位置。然而,这种方法被证明是不准确的,可能是因为地球的曲率(请注意,我正在使用的 map (塞尔维亚)覆盖了 4° 纬度和 4° 经度的区域)。

我看过几个关于转换为墨卡托投影的答案,但它们对我来说不是很清楚,因为它们没有涵盖与我类似的情况,并且不是用 Java 编写的。

我该怎么做才能更准确地定位这些点(±3公里就足够准确了)?

最佳答案

正如评论所指出的,为了精确地在地理坐标和 map 位置之间进行转换,你必须知道 map 所使用的投影方法,以及足够数量的参数,以便使用合适的参数调整其余参数一组引用点变得可行。

因此,如果您假设圆锥投影,请阅读 the document大卫指出,并且this referenced follow-up以及。正如您所看到的,在圆锥投影家族中,有几种替代方案可供选择。它们中的每一个都由一些参数来描述(即标准纬线、圆锥常数、长宽比……)。您可以对这些进行猜测,然后使用一些数值优化来获得最佳拟合。然后,您采用适合每种投影的最佳参数,并查看其中哪一个具有最佳的整体拟合效果。相当多的工作。如果您不想实现所有这些投影的代码,您可以使用 proj.4无论是在命令行上还是作为 native 库。要进行数值优化,您可以尝试调整 COIN-OR projects 之一到您的应用程序。

无论如何,第一步是创建一组合适的引用点,您可以使用它们来评估适合度。因此,请在 map 上选择一些突出的点,然后找到这些点的 Google 地球坐标。我想说你应该至少有十几个点,以说明你对 map 知之甚少的事实。否则,您将面临很大的风险,即您将调整大量参数以完全适合您的点,而 map 的其余部分仍然完全关闭。即使有这么多引用点,由于塞尔维亚的面积并没有那么大(与跨越整个大陆的 map 相比),错误猜测或不合适的错误可能会非常小。因此,可能很难真正确定使用了哪种投影。

根据我上面所说的,即使有外部库负责投影和数值优化,可能很容易就需要半年时间来设置工具来计算投影。因此,请决定这是否值得付出努力。如果没有,还有几种选择。一种方法是拿一张不同的 map ,一张你知道投影的 map 。或者联系 map 的作者并获取投影。或者问问塞尔维亚从事测地线工作的人,因为他们可能有足够的经验,一眼就能认出投影,我不知道。

另一种选择是将您需要引用点的事实与您在任何情况下都可能无法计算出精确投影的事实结合起来。只需通过以下方式将它们组合起来:选择一组适当密集的引用点,均匀分布在 map 上。然后在它们之间进行插值,分段线性或更高阶或使用某种加权插值方案或其他方式。您知道这一切背后都有一个投影,但您放弃了计算投影,而只是缓解症状:通过拥有足够的引用点,每个数据项都足够接近引用点,以使误差小于您的阈值.

关于java - 如何正确地将地理坐标转换为屏幕上的像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30953513/

相关文章:

java - SequenceGenerator 在 JUnit 测试中不起作用?

java - 谷歌地图崩溃

mysql - 需要不同的数字组排列

C++ 2D 如何将 "stick"宇宙飞船上的排气 Sprite 并允许它相应地旋转?

c++ - 2D Box Collision - 这是对的吗?

java - 图标未显示在操作栏上

java - Hibernate抛出转换数据类型异常

c - 我将如何在这里应用余数/模运算符?

c++ - 序列返回 49 但应该返回 36

Java:将txt文件读入二维数组