地图导航项目,道路数据通常如何存储/表示?

17

导航系统,如Garmin和TomTom,一直让我很着迷。我想实现小型地图/导航应用程序,以尝试各种路径算法并扩展我的知识。

这是一个两部分的问题:

1.) 地图数据是如何存储的?- 当你有一条道路网络时,这些数据通常如何存储?保留哪些数据以便之后能够生成地图?每个道路是否被存储为一系列改变方向的点?这些数据使用什么样的文件格式进行存储?是否有公共可用的库可以轻松解析这些文件?如果有关于地图/道路数据如何存储/表示的具体信息,将非常有帮助。

2.) 导航/路径规划- 在对这些地图数据进行基本的路径规划时(类似于Garmin),我的假设是否正确,即它被转换为一个有向图?是否每个路口都是一个顶点,边权重是顶点之间的距离?这就是我正在考虑的,以便我可以尝试一些基本的已知路径规划算法并查看结果。

我看到过关于美国的公开可用的地图数据,但我不确定它是如何表示的,是否足够详细,可以让我构建我的有向图。

如果有人有任何信息,我将不胜感激。您对此问题了解的知识越详细,越好。

6个回答

9

之前的回答都是关于GIS系统的。这不是PNDs(便携式导航设备)的工作方式。它们太简单了,无法运行桌面/工作站级别的GIS软件。

相反,PNDs将信息存储为Simucal所预测的那样。道路被分成段。这使得模型更加简单。在一个段落内,最大速度等属性不会改变。

对于规划目的,道路段作为图中的边缘。对于每个节点,都存储了入站和出站节点。然后使用修改过的A*算法进行规划。边权通常不是距离,而是估计的旅行时间(或在TomTom的情况下,实际测量时间)。

道路网络通常是分层的,普通的A*算法启动缓慢。当从一个城镇到另一个城镇旅行时,A*将花费过多的时间在起始城镇爬行。然而,我们人类知道在旅行较长的距离时最好使用高速公路。这就是它们建造的目的。PNDs也喜欢高速公路。由于高速公路要少得多,因此这可以节省大量内存。

另一个优化是前向和后向搜索; 你从两个方向向某个中间点规划。这样做的巨大优势在于,如果你走错了路,可以从新的起点重新搜索。由于目的地没有移动,所以后向搜索树不会改变。

6
我不了解导航系统单元的具体情况,但在标准GIS世界中,地图数据基本上存储为由其坐标(和使用的投影以及其他一些参数)描述的多边形、线条和点的集合。例如,最常见的格式之一,shapefile,在这里进行描述,基于数据库的格式标准在这里
我已成功使用此存储模型显示道路和计算路径,使用PostgreSQLPostGISPGRouting。计算使用通常的图形算法完成,并且存储在常见格式中的数据也存储为图形,以允许应用它们。我无法将该经验推广到嵌入式设备,因为考虑到其有限的计算能力,它们很可能以非常不同的方式进行预计算。

如果您想尝试一种与众不同的存储方式,请查看OpenStreetMap


2
确切的存储方式取决于格式;有许多不同的GIS格式。GDAL是一个出色的免费库,可以读取(几乎)所有这些格式。
通常,道路将作为“线图层”存储在文件中,即一组带有附加元数据的折线。因此,每条道路都将具有一系列顶点,并且根据您的数据质量,它将有信息,例如它们是否单向、速度估计和某种连接ID。
是的,它们通常会被转换为有向图来解决。边缘权重可能是距离或更有用的是行驶该边缘所需的时间。
快速解决问题是预计算和存储空间之间的权衡(嵌入式设备可能需要不同的选择)。有一些非常有趣的算法可供使用。

2
Mohammed: 好的,我在那里没有详细说明,因为原始问题似乎对此方面非常熟悉。如果您不熟悉图论,现在最好阅读一些相关知识-Wikipedia可以作为介绍。
通常,在GIS数据中,道路被存储为带有附加元数据的折线。这对于在屏幕上显示它们等方面是很好的,但要能够导航它们,您需要知道哪些道路相互连接。因此,在元数据中,通常为每条道路的每个端点都有一个节点ID,因此您可以说“这是道路段457,它从节点332到节点667”。因此,当您读取GIS数据时,您会将其构建为一组由弧连接的节点的表示形式(即图)。
如果元数据不可用,则可以从具有相同起始/结束坐标的道路推断出它。这是某些不太好的GIS数据的情况。 “有向”位只是意味着道路具有方向-其中一些可以沿任何方向行驶,但其他道路仅为单向。
寻找有向图中路径的典型算法是Dijkstra算法;在实践中使用各种派生算法。基本上,这涉及沿着图的弧从一个节点移动到另一个节点,因此需要适当的数据结构来支持它。
希望这可以帮到你...

@Peter,你知道有人也将地图数据存储在空间树中,例如四叉树或R-Tree吗?我知道这样可以查询距离x范围内的元素。那么这是否用于渲染呢?只渲染特定半径内的内容或其他用途? - mmcdole
@Peter,顺便说一下,谢谢您的评论。我想了解有关GIS文件格式的所有信息。我对图形理论有一些了解...只是其他方面我有疑问 ;) - mmcdole

2
如果您想查看一些代码来了解路由应用程序的工作原理,可以尝试查看从openstreetmap.org wiki链接的一些路由应用程序。Navit和Gosmore都是开源的,并且特别容易设置。
Gosmore应用程序的开发人员Nic Roets写了一篇有趣的文章,介绍了他选择如何表示道路矢量数据的选择,这可能也对您感兴趣。
如果您想看看Gosmore的实际效果,它是基于openstreetmap数据的yournavigation.org路由网站的后端。

-2

为了提高绘图速度,但代价是更多的存储和有限的分辨率,许多应用程序将使用地理参考栅格格式,例如GeoTiff

鉴于下面Zich的坚持评论:

"所有导航系统中的数据都是矢量数据,没有例外!"

我想我可以对上述内容进行补充。首先,我会将导航系统定义为一种基于您当前位置协助您到达目的地的系统,通常通过计算多个可能的替代路线并推荐最低成本的路线来实现。可能的路线可能由交通方式决定,例如汽车只能在道路上行驶,而山地步行者则不行。路线的成本可能因交通方式以及用户要求而异。汽车可能希望根据道路速度选择最快的路线,卡车可能希望选择最省油的路线,山地步行者可能希望选择最安全的直接路线,船只或飞机可能希望避开危险的天气系统,并同时最大程度地减少燃料成本和时间。

在最简单的层面上,地图和指南针是一种导航系统。用小屏幕、可缩放光栅地图和GPS替换地图,你仍然有一个导航系统。大多数低端到中端的海上导航系统仍然是这样工作的,使用图表表示海岸线和海床,GPS提供位置,回声探测器提供深度。
在更高级的领域,像火星车导航系统这样的自主机器人导航系统会即时生成DTM模型作为短程导航的基础,并使用卫星收集的DEM进行长程导航。
认为所有导航系统都像消费者级别的Garmin或Tom Tom设备一样工作是相当幼稚的假设。顺便说一下,许多现代Garmin设备也包括基于光栅的DEM数据,其中低成本GPS高度测量可能极不准确。

所有导航系统中的数据都以向量形式存在,没有例外! - Iman Nia
是的,没错!(所有导航...)就像你说有些汽车使用铁路一样!我要说不是这样的!所有的汽车都有轮子,它们不使用铁路!很简单!而且,是一个通用规则,最短路径分析可以在GIS软件中对栅格数据进行执行(例如,在Arcgis中使用走廊功能),但它不是一个导航系统!上面的许多答案肯定应该被否决,但是你的答案我实在是无法忽略。 - Iman Nia
NASA的车辆也使用链条而不是轮子!!!但我不是在谈论它们,我们也不是在谈论人工导航中的云点应用。请再次阅读问题,如果您能提供一个使用栅格数据而不是矢量数据的车辆示例,请告诉我。您知道有没有一辆汽车使用基于矢量数据以外的其他东西的导航系统?此外,DEM和DTM都有栅格和矢量示例,这被认为是离题的,因此我不会解释它。 - Iman Nia
@Zich,你最初的评论是“所有导航系统都不例外”,而不是汽车。我已经链接了许多这样的导航系统,这比汽车根据矢量地图跟踪道路要大得多。 - SmacL
也许如果你指的是所有汽车导航系统,你就不应该说“所有导航系统没有例外”了。顺便说一句,许多新的Garmin导航系统还包括DEM高度数据和基于高度的路线成本计算,这些数据与矢量地图一起使用。 - SmacL
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接