如何正确地将地理坐标转换为屏幕上的像素?
How can I correctly convert geographical coordinates to pixels on screen?
我正在尝试制作一个 Java 项目,在给定坐标(取自 Google 地图)时在地图图像上精确定位位置。
我试过使用图像的左上角(纬度最高和经度最低的地方)作为某种参考点,即 (0,0) 点地图图像,然后我尝试根据该参考点计算地图上的每个地方。然而,这种方法被证明是不准确的,可能是因为地球的曲率(请注意,我正在使用的地图(塞尔维亚)覆盖了 4° 纬度和 4° 经度的区域)。
我看过几个关于转换成墨卡托投影的答案,但我不是很清楚,因为它们没有涵盖与我类似的情况,并且没有写在 Java 中。
我怎样才能更准确地定位这些点(±3km 就足够准确了)?
正如评论所指出的那样,为了在地理坐标和地图位置之间进行精确转换,您必须知道地图所用的投影方法,以及足够数量的参数,以便调整其余参数使用一组合适的参考点变得可行。
因此,如果您假设圆锥投影,请阅读 the document David pointed out, and this referenced follow-up as well. As you can see, within the family of conic projections, there are a few alternatives to choose from. Each of them is described by a few parameters (i.e. standard parallels, cone constant, aspect ratio, …). You'd make guesses for these and then use some numerical optimization to obtain a best fit. Then you take the best parameter fit for each kind of projection and see which of them has the best overall fit. Quite a bit of work. If you don't want to implement the code for all these projections you can use proj.4 either on the command line or as a native library. To do the numeric optimization, you could possibly try to adapt one of the COIN-OR projects 到您的应用程序。
无论如何,第一步是创建一组合适的参考点,您可以使用这些参考点来评估拟合度。因此,在您的地图上选择几个显着点,并找到这些点的 Google 地球坐标。我会说你至少应该有十二分,以说明你对你的地图知之甚少的事实。否则,您可能会调整大量参数以完全适合您的点,而地图的其余部分仍然完全关闭。即使有这么多参考点,由于塞尔维亚的面积没有那么那么大(与跨越整个大陆的地图相比),错误猜测或不合适的错误可能非常小.所以可能很难真正决定使用了哪个投影。
根据我上面所说的,即使有外部库负责投影和数值优化,可能很容易就需要半年时间来设置计算投影的工具。所以决定这是否值得付出努力。如果没有,有几种选择。一种方法是使用一张不同的地图,一张你知道投影的地图。或者联系地图的作者并获取投影。或者问问在塞尔维亚做测地线工作的人,因为他们可能有足够的经验,一眼就能认出投影,我不知道。
另一种选择是将您需要参考点的事实与您可能无法在任何情况下计算出准确投影的事实相结合。只需按以下方式组合这些:选择一组适当密集的参考点,均匀分布在地图上。然后在它们之间进行插值,线性地或以更高的程度或使用某种加权插值方案或其他任何方式。你知道这一切背后都有一个投影,但你放弃了计算投影,只是减轻了症状:通过有足够的参考点,每个数据项都足够接近参考点以保持误差小于你的阈值.
我在这个帖子中找到了我想要的答案:Java, convert lat/lon to UTM
我发现我的地图的实际投影是 UTM。从那里,它只是找到一个 class 将我的 lat/lon 坐标转换为 UTM 东距和北距(this answer 中非常有用的代码),然后我会做简单的数学运算来找出答案将点与地图边界进行比较,它确实有效。
我正在尝试制作一个 Java 项目,在给定坐标(取自 Google 地图)时在地图图像上精确定位位置。
我试过使用图像的左上角(纬度最高和经度最低的地方)作为某种参考点,即 (0,0) 点地图图像,然后我尝试根据该参考点计算地图上的每个地方。然而,这种方法被证明是不准确的,可能是因为地球的曲率(请注意,我正在使用的地图(塞尔维亚)覆盖了 4° 纬度和 4° 经度的区域)。
我看过几个关于转换成墨卡托投影的答案,但我不是很清楚,因为它们没有涵盖与我类似的情况,并且没有写在 Java 中。
我怎样才能更准确地定位这些点(±3km 就足够准确了)?
正如评论所指出的那样,为了在地理坐标和地图位置之间进行精确转换,您必须知道地图所用的投影方法,以及足够数量的参数,以便调整其余参数使用一组合适的参考点变得可行。
因此,如果您假设圆锥投影,请阅读 the document David pointed out, and this referenced follow-up as well. As you can see, within the family of conic projections, there are a few alternatives to choose from. Each of them is described by a few parameters (i.e. standard parallels, cone constant, aspect ratio, …). You'd make guesses for these and then use some numerical optimization to obtain a best fit. Then you take the best parameter fit for each kind of projection and see which of them has the best overall fit. Quite a bit of work. If you don't want to implement the code for all these projections you can use proj.4 either on the command line or as a native library. To do the numeric optimization, you could possibly try to adapt one of the COIN-OR projects 到您的应用程序。
无论如何,第一步是创建一组合适的参考点,您可以使用这些参考点来评估拟合度。因此,在您的地图上选择几个显着点,并找到这些点的 Google 地球坐标。我会说你至少应该有十二分,以说明你对你的地图知之甚少的事实。否则,您可能会调整大量参数以完全适合您的点,而地图的其余部分仍然完全关闭。即使有这么多参考点,由于塞尔维亚的面积没有那么那么大(与跨越整个大陆的地图相比),错误猜测或不合适的错误可能非常小.所以可能很难真正决定使用了哪个投影。
根据我上面所说的,即使有外部库负责投影和数值优化,可能很容易就需要半年时间来设置计算投影的工具。所以决定这是否值得付出努力。如果没有,有几种选择。一种方法是使用一张不同的地图,一张你知道投影的地图。或者联系地图的作者并获取投影。或者问问在塞尔维亚做测地线工作的人,因为他们可能有足够的经验,一眼就能认出投影,我不知道。
另一种选择是将您需要参考点的事实与您可能无法在任何情况下计算出准确投影的事实相结合。只需按以下方式组合这些:选择一组适当密集的参考点,均匀分布在地图上。然后在它们之间进行插值,线性地或以更高的程度或使用某种加权插值方案或其他任何方式。你知道这一切背后都有一个投影,但你放弃了计算投影,只是减轻了症状:通过有足够的参考点,每个数据项都足够接近参考点以保持误差小于你的阈值.
我在这个帖子中找到了我想要的答案:Java, convert lat/lon to UTM
我发现我的地图的实际投影是 UTM。从那里,它只是找到一个 class 将我的 lat/lon 坐标转换为 UTM 东距和北距(this answer 中非常有用的代码),然后我会做简单的数学运算来找出答案将点与地图边界进行比较,它确实有效。