如何在 Java 中将纬度和经度转换为 x,y?

Posted

技术标签:

【中文标题】如何在 Java 中将纬度和经度转换为 x,y?【英文标题】:How can I transform latitude and longitude to x,y in Java? 【发布时间】:2010-05-11 21:47:38 【问题描述】:

我正在使用 Java 进行一个地理项目。

输入是坐标:24.4444 N 等 输出:显示坐标点的 PLAIN 地图(非圆形)。

我不知道在 JComponent 上从坐标转换为 x,y 的算法,有人可以帮我吗?

地图如下所示: http://upload.wikimedia.org/wikipedia/commons/7/74/Mercator-projection.jpg

谢谢

【问题讨论】:

您希望JComponent 显示多大的区域?你所有的坐标都在低纬度吗? (靠近赤道)或者你有一些靠近/在两极? 你问的是en.wikipedia.org/wiki/Mercator_projection吗?常用的球面投影到平面投影?或者你需要en.wikipedia.org/wiki/Polyconic_projection?这是你要问的吗? 【参考方案1】:

鉴于您的稀疏示例,您的输入范围将是 (90.0N - 90.0S) 和 (180W - 180E)。这是最简单的 - 也是标准的 - 如果您将南和西转换为负数,得到 (90.0..-90.0) 的纬度和 (180.0..-180.0) 的经度。

鉴于您的画布的大小 - 假设它是 140x120 像素 - 您会得到:

x = (latitude * canvas_height / 180.0) + (canvas_height / 2)
y = (longitude * canvas_width / 360.0) + (canvas_width / 2)

或:

x = (longitude * 120.0 / 180.0) + (120/2)
y = (latitude  * 140.0 / 360.0) + (140/2)

我已经订购了操作以最大限度地减少舍入误差。这假设画布的左上角有点 (0,0),如果不是,则假设您是澳大利亚人。

添加:您刚刚添加了有关墨卡托投影的内容,使我的简单答案不正确(但如果您实际上并不关心投影,您可能仍然可以使用)

【讨论】:

是的,在反子午线处存在域重叠,但我认为 OP 不会在斐济的 Tavuki 郊区绘制很多点,甚至 Google 地球在那里也有点不稳定。 这不是墨卡托投影,这是他的地图使用的。 我并不完全需要墨卡托。您能给我推荐一张平面地图,我可以将其用于您的算法吗? commons.wikimedia.org/wiki/File:BlankMap-World-162E-flat.svg 请注意,像这样的平面投影很少使用,所以看起来很有趣。另请注意,它以 162E 为中心——就像它说的那样——在计算中必须考虑到这一点。【参考方案2】:

MSW 提供了一个很好的例子。最终,算法取决于使用的地图投影。以下是我过去使用的一些很好的资源。

以下链接很好地参考了许多不同的地图投影,其中包含足够的数学公式。

http://www.remotesensing.org/geotiff/proj_list/

这是在 php 中执行此操作的不错参考。虽然不是 Java,但它应该足够直截了当,可以应用所概述的原则。

http://www.web-max.ca/PHP/article_1.php

【讨论】:

以上是关于如何在 Java 中将纬度和经度转换为 x,y?的主要内容,如果未能解决你的问题,请参考以下文章

如何将屏幕 X 和 Y 转换为纬度和经度

将 x,y 转换为纬度和经度

在java中将地址转换为纬度和经度以获得基于距离的建议

如何在iPhone开发中将地址转换为纬度和经度[重复]

在php中将地址转换为纬度和经度

在 iPhone 上将经度/纬度转换为 x/y