海上距离计算器,中间坐标?

3 投票
3 回答
3955 浏览
提问于 2025-04-15 20:49

我想知道怎么计算两个海上坐标之间的距离?我还想能画出这两个坐标之间的路线。

到目前为止,我找到的唯一解决办法是把地图分成很多像素,判断每个像素是陆地还是海洋,然后用A*算法找出路径。最后再把这些像素转换成相对坐标。

我可以购买一些软件包,但没有一个是可以在线使用的。有一个服务可以计算海港之间的距离,并在地图上绘制路径,网址是 searates.com

3 个回答

1

我找到了一个满意的解决方案。这个方案和你们建议的差不多,也和我最开始想的差不多,不过我花了一些时间才弄明白软件和地理信息系统(GIS)的概念,因为我对GIS还很陌生。如果有人再次遇到类似的问题,这里是我的设置:我使用了PostGIS来配合PostgreSQL数据库,地图来自Natural Earth,GIS编辑软件用的是qGisOpenJump,还有路由算法用的是pgRouting

Natural Earth的地图需要一些处理才能用,我把海洋多边形和河流合并在一起,这样才能得到一些准确的路径到达内陆的点。然后我用1度的经纬网来获取从一个大陆到另一个大陆的路径(我需要找到一个更优雅的解决方案,因为有些路径看起来像棋盘格)。所有这些操作都可以通过命令行使用PostGIS来完成,但我发现用桌面软件(点下一步,点下一步)更简单。Natural Earth地图的替代方案可能是OpenStreetMap,但planet.osm的文件大约有200GB,这让我有些打退堂鼓。

我觉得这个设置也解决了距离准确性的问题,PostGIS考虑了地球的实际形状,计算出的距离应该相当准确。

我还需要进行一些测试和调整,但我可以说它可以计算并绘制出世界海岸线任意两个点之间的路线(目前还没有小的孤立岛屿),并显示出路由点的名称(如水道、海洋、河流、海洋)。

1

基本上,你需要把海洋分成很多小方块,然后用类似A*的算法来处理。你可以通过把相邻的小方块合并成更大的区域来优化一下,但如果你把所有的区域都保持成正方形,可能会让搜索变得更简单。这样搜索就不再是曼哈顿风格的了,不过如果你有足够大的正方形,额外的连接决策时间也会被弥补回来。

另外,你也可以从所有的港口开始,逐步“扩展”出多边形,形成凸多边形(这样多边形内的任何一点都可以直接到达其他任何一点,而不需要走出多边形,比如说你要避免像吃豆人那样的形状)。不过这其实是对我刚才提到的“正方形”方法的一种改进和复杂化。关键是你一旦进入某个区域,就知道可以在这个区域内随意移动。

我不知道这是否有帮助,抱歉。今天真是漫长的一天。不过祝你好运,这听起来是个有趣的问题!

编辑:忘了提,您还可以先把区域处理成四叉树。也就是说,把整个地图先垂直和水平各分成两半(不需要同时进行这两次分割,如果你想花时间做“更好”的分割,可以稍后再做),然后递归地进行,直到每个节点完全是陆地或海洋。这样你就可以轻松建立连接网络(只需连接相邻的叶子节点),然后从这里实现A*算法应该也不难。这可能是实现我第一个建议的最简单方法。 :)

2

要注意,地图可能会扭曲距离。例如,在墨卡托投影中,离赤道远的地方,等长的线段表示的实际距离比靠近赤道的地方要小。如果你只是给你的像素、方块等分配统一的成本,你最终会得到不理想的路径规划和错误的距离计算。

如果你在地图上投影一个网格(像素只是众多可能网格中的一种),并使用A*算法寻找最佳路径,你需要做的就是根据地球表面的真实距离来设置边的权重,而不是地图上的距离,这样搜索算法才能正常工作。

仅仅说“海洋或非海洋”是不够的,不能完全判断可通航性。还需要考虑水深、交通路线(比如,英吉利海峡的航运交通是分成不同通道的)和政治因素(例如,领海等)。你还需要手动添加一些在地图上显示不出来的小航道(如巴拿马运河、苏伊士运河),并调整它们的成本,以覆盖可能产生的额外费用。

撰写回答