如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章