13

我正在寻找用于存储地图的理想数据库或数据结构的建议。本质上,地图由类似于道路、路径等的“方式”组成。方式包含节点(具有纬度和经度坐标,有时还有高度。)

任何此类数据库或结构:

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

  2. 可选地,当大量节点在边界框中而不是少量节点时,或者如果边界框很大,则不应显着减慢

  3. 应该能够找到直接连接的节点:例如连接两种方式的节点

  4. 可以只读

  5. 应该紧凑(避免浪费空间) - 我希望将英国地图放入不到 1 GB 的空间。我有一个卫星导航,它在 SD 卡上有大约 800 MB 的空间。

我最初在考虑四叉树来存储方式。但是快速实现很棘手,而且它们不适用于单个节点;所有节点都尽可能放在最小的 bbox 中。

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

4

5 回答 5

8

我推荐PostGIS 1.5使用geography类型,因为它适合你想要的,但是我唯一关心的是在嵌入式设备上使用这样的东西是内存使用。

我使用 Java 中的非 GIS 数据库(火鸟)构建了一些模糊相关的东西,并且性能足以在边界框中检索点(尽管需要花哨的 SQL,而 PostGIS 不是这种情况)。

于 2010-10-06T14:29:31.683 回答
7

PostGIS可能是最佳选择。注意:PostGIS具有地理扩展的 PostgreSQL。您实际上是安装 postgres,然后运行各种添加地理功能和类型的脚本。

请参阅有关 PostGIS 的 OpenStreetMap 信息。您可以使用 osm2pgsql 将 OpenStreetMap 行星文件/行星提取物加载到 PostGIS 中,这是在运行 Mapnik 渲染器的 OpenStreetMap 瓦片服务器上完成的。然而...

OpenStreetMap 数据还有一个更原始的数据库模式(称为“节点”和“方式”等的表)这是主要的 OpenStreetMap 数据库服务器用于存储其地理数据并允许通过 API 进行编辑的方式。这在空间索引等方面并不那么聪明,但又好又简单。您可以通过安装OpenStreetMap API/website ruby​​ on rails code来创建这种格式的数据库。这是设置最新版本的数据库模式 (由rails 迁移定义)的最可靠方法。之后,您可以运行osmosis工具来填充数据库。

于 2010-10-18T16:20:04.973 回答
3

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

但是还有其他免费选项,一些读者可能已经拥有另一个关系数据库系统,并且希望利用该专业知识而不必学习 PostGIS。任何支持开放地理联盟规范(OGC 或 OpenGeo)的数据库都足以满足您描述的场景。

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

所以这里是我知道的所有选项的列表:

空间 RDBMS - 提供免费选项

  • Oracle(带有 Spatial 或 Locator)(免费选项:Oracle XE + Locator)
  • MS SQL Server(2008 或更高版本)(免费选项:SQL Server Express)
  • 地理信息系统

空间 RDBMS - 没有免费选项

  • DB2(带有空间扩展器)
  • Informix(带有空间刀片)

小于理想的空间 RDBMS

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

空间“扩展件”

  • ArcSDE(将其添加到现有 RDBMS)
于 2011-12-13T20:59:00.337 回答
1

我所知道的地理数据最好的数据库是带有地理扩展的 PostgreSQL,但我不知道速度。我知道 OSM 使用它,但他们可以访问一个巨大的快速计算机基础设施。我也知道他们有几个要求可以为他们编写更快的程序的人。

我会说四叉树是处理地理分区数据的一个非常好的选择,据我所知,您似乎允许正方形变得太小。您可以使边界更柔和(允许一个节点位于四叉树的两个叶子中)并为每个叶子添加最少数量的节点。假设任何叶子都不允许包含少于 64 个节点,并且不超过 1024 个。

在这里,排序对于速度尤其重要,建议对更有可能被访问的区域进行排序。假设所有请求的 70% 将在伦敦附近,那么将这些数据放在文件开头以减少搜索时间将是最快的。

于 2010-10-09T20:59:32.753 回答
0

我不确定空间,但您可能想查看对通用数据库服务器使用任何地理扩展(如果可能的话)。他们通常提供快速的地理索引,基于边界框(回答 1 和 2)许多地理程序来进行计算(回答 3,intersect(way1,way2))。

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

于 2010-10-02T23:28:04.027 回答