理想的地理(地图)数据数据库

13

我正在寻找一个理想的数据库或数据结构来存储地图。这份地图由“路线”组成,类似于道路、路径等。路线包含节点(具有纬度和经度坐标,并且有时还有高度)。

任何这样的数据库或结构应该:

  1. 能够快速定位边界框内的所有节点(毫秒级)

  2. 可选地,在大量节点与少量节点在边界框内或边界框很大时,不会明显减慢速度

  3. 能够找到直接连接的节点:例如连接两条路线的节点

  4. 可以只读

  5. 应该是紧凑的(避免浪费空间)-我希望将英国地图放在少于1 GB的空间中。我的卫星导航仪可以在SD卡上使用约800 MB的空间进行此操作。

最初我考虑使用四叉树来存储路线。但是快速实现比较棘手,而且它们不能用于存储单个节点; 所有节点都被放入最小的边界框中。

(我故意使用Open Street Map的相同术语,因为我计划使用该数据。)


我正在这个问题上设置悬赏。 - Thomas O
5个回答

8
我建议使用PostGIS 1.5并使用地理类型,因为它适合您的需求,但是我唯一担心的是在嵌入式设备上使用类似这样的东西会占用大量内存。
我曾经使用Java中的非GIS数据库(Firebird)构建过与此相关的模糊系统,并且检索边界框内的点的性能已经足够(尽管需要使用高级SQL,而这不是PostGIS的情况)。

7

PostGIS可能是最佳选择。注意:PostGIS就是带有地理扩展的PostgreSQL。您只需安装PostgreSQL,然后运行各种脚本即可添加地理函数和类型。

请参阅关于PostGIS的OpenStreetMap信息。您可以使用osm2pgsql将OpenStreetMap planet文件/planet extracts加载到PostGIS中,这就是在OpenStreetMap瓦片服务器上运行Mapnik渲染器时所做的操作。但是...

OpenStreetMap数据还有一种更原始的数据库模式(称为“节点”和“路径”等表)。这是主要的OpenStreetMap数据库服务器用于存储其地理数据并允许通过API进行编辑的方式。当涉及到空间索引等内容时,这种方法可能不太聪明,但很简单。您可以通过安装OpenStreetMap API/website ruby on rails code以此格式创建数据库。这是建立最新版本数据库模式(由rails migrations定义)的最可靠方法。之后,您可能会运行osmosis工具来填充数据库。


3

PostGIS并不是唯一支持地理空间数据的数据库,但其价格非常实惠。很难击败“免费”。

但是还有其他免费的选择,有些读者可能已经使用了另一个关系型数据库系统,并希望利用那方面的专业知识,而不是学习PostGIS。任何支持Open Geographical Consortium规范(OGC或OpenGeo)的数据库都可以满足您描述的场景。

就像摄影世界中的格言一样 - “最好的相机是你随身携带的相机” - 有时理想的空间数据库就是您已经拥有并知道如何使用的数据库。

因此,这里是我所知道的所有选项列表:

空间关系型数据库管理系统 - 免费选项可用

  • Oracle(带有Spatial或Locator)(免费选项:Oracle XE + Locator)
  • MS SQL Server(2008或更高版本)(免费选项:SQL Server Express)
  • PostGIS

空间关系型数据库管理系统 - 没有免费选项

  • DB2(带有Spatial Extender)
  • Informix(带有Spatial Blade)

不太理想的空间关系型数据库管理系统

  • MySQL Spatial(功能集非常有限)

空间“扩展软件”

  • ArcSDE(您可以将其添加到现有的RDBMS中)

1

我所知道的最好的地理数据数据库是带有地理扩展的PostgreSQL,但我不知道它的速度如何。我知道OSM使用它,但他们可以访问一个庞大的计算机基础设施,速度非常快。我也知道他们正在寻找能够为他们编写更快程序的人。

我认为Quadtree是处理地理空间数据的一个非常好的选择,因为从我所了解的情况来看,你可以允许正方形变得非常小。你可以使边界更加柔和(允许一个节点在Quadtree的两个叶子中),并添加每个叶子的最小节点数。例如,任何叶子都不允许包含少于64个节点,也不允许超过1024个节点。

在这里,排序尤其重要,建议将可能首先访问的区域进行排序。例如,如果70%的请求都在伦敦附近,那么将这些数据放在文件的开头会减少搜索时间,从而提高速度。


不,我一直在考虑基于OSM数据的服务 - 但目前我缺乏托管可能性和经济条件。 - Frank

0

我不确定空间问题,但您可能希望查看是否可以使用任何常见数据库服务器的地理扩展。它们通常提供快速的地理索引,基于边界框(回答1和2),许多地理过程来进行计算(回答3,intersect(way1,way2))。

此外,您的问题更适合http://gis.stackexchange.com


我认为这更像是一个编程问题,因为实现同样重要。我考虑使用SQLite3,因为它有一个R*Tree扩展,但那太慢了。 - Thomas O
好的,关于产品推荐部分,最好在其他网站上寻求帮助。算法部分也可能在那里得到很好的服务。你尝试过其他数据库吗? - Vinko Vrsalovic
没有,SQLite3非常快 - 在100m x 100m的框中获取所有节点大约需要40毫秒。我不认为大多数数据库能够比这更快,因此我正在寻找更好的解决问题的方法,例如不同的数据结构或算法。 - Thomas O
我认为你应该更详细地描述你的需求,并强调你不是在寻找一个数据库,而是一种方法。 - Vinko Vrsalovic
如果数据库的速度明显更快,我仍然愿意使用它。 - Thomas O

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