如何计算海上2个坐标之间的距离?我还希望能够在两个坐标之间绘制一条路线。
到目前为止,我发现的唯一解决方案是将地图拆分为像素,将每个像素标识为 LAND 或 SEA,然后尝试使用 A* 算法找到路径。然后将像素转换为相对坐标。
我可以购买一些软件包,但没有一个有在线扩展。searates.com是一项计算海港之间距离并在地图上绘制路径的服务
如何计算海上2个坐标之间的距离?我还希望能够在两个坐标之间绘制一条路线。
到目前为止,我发现的唯一解决方案是将地图拆分为像素,将每个像素标识为 LAND 或 SEA,然后尝试使用 A* 算法找到路径。然后将像素转换为相对坐标。
我可以购买一些软件包,但没有一个有在线扩展。searates.com是一项计算海港之间距离并在地图上绘制路径的服务
请注意地图会扭曲距离的事实。例如,在墨卡托投影中,远离赤道的线段表示的实际距离小于等长的靠近赤道的线段。如果您只是为像素/正方形/等分配统一成本,您最终会得到非最佳路由和错误的距离计算。
如果您在地图上投影一个网格(像素只是许多可能网格中的一个特定网格)并使用 A* 搜索最佳路径,您需要做的就是让搜索算法正常运行,根据到沿球体(地球)表面的实际距离,而不是地图上的距离。
请注意,仅说“海或非海”不足以确定可航行性。还有深度、交通路线(例如认为英吉利海峡被分成车道的航运交通)和政治考虑(领海等)的问题。您还希望为太小而无法在地图上显示的通道(巴拿马、苏伊士)手动添加路线,并调整其成本以弥补所产生的任何开销。
几乎您需要将海洋分割成像素并执行 A* 之类的操作。您可以通过将连续像素合并到更大的区域来对其进行一些优化,但如果您将所有内容保持为正方形,则可能会使搜索更容易。搜索将不再是曼哈顿式的,但如果您有足够大的正方形,则额外的连接决策时间将远远弥补。
或者,您可以从所有端口迭代地“增长”多边形,构建凸多边形(这样多边形内的任何点都可以从任何其他点到达而无需外出,例如,您要避免 PacMan 形状),尽管这是我第一次提到的“正方形”方法的改进/复杂/优化。关键是你知道一旦你在一个区域,你就可以到达该区域的任何其他地方。
我不知道这是否有帮助,对不起。这是漫长的一天。不过,祝你好运。这听起来像一个有趣的问题!
编辑:忘了提,您还可以将您的区域预处理成四叉树。也就是说,把你的整个地图垂直和水平分成两半(你不需要同时进行两个分割,如果你想花一些时间进行“更好”的分割,你可以稍后再做) ,并递归地执行此操作,直到每个节点完全是陆地或海洋。由此,您可以轻松地建立一个连接网络(只需连接相邻的叶子),并且 A* 应该很容易从那里实现。无论如何,这可能是实现我的第一个建议的最简单方法。:)
我达到了一个令人满意的解决方案。这与您的建议和我最初的想法一致,但我花了一段时间才弄清楚软件和 GIS 概念,我是 GIS 新手。如果有人再次碰到类似的东西,这是我的设置:PostGIS for PostgreSQL,来自Natural Earth的地图,GIS 编辑软件qGis和OpenJUmp,路由算法pgRouting。
自然地球地图需要一些处理才能有用,我加入了海洋多边形和河流,以便能够获得一些通往最内陆点的准确路径。然后我使用 1 度格线来获取从一个大陆到另一个大陆的路径(我需要找到比这更优雅的解决方案,因为有些路径看起来像国际象棋立方体)。所有这些操作都可以使用 PostGIS 从命令行完成,我发现使用桌面软件更容易(下一个,下一个)。自然地球地图的替代品可能是 OpenStreetMap 但planet.osm 转储约为 200Gb,这让我很沮丧。
我认为这种设置也解决了距离精度问题,PostGIS 考虑了地球的实际形状,距离应该非常准确。
我仍然需要做一些测试和微调,但我可以说它可以从世界海岸线上的任何 2 个点(还没有小的孤立岛屿)计算和绘制路线,并显示路由点名称(通道、海洋、河流、海洋)。