我正在寻找有关存储地图的理想数据库或数据结构的建议。基本上,地图由道路,路径等“道路”组成。道路包含节点(具有纬度和经度坐标,有时还有高度。)
任何此类数据库或结构:
应该能够快速(毫秒)定位边界框中的所有节点
可选地,当大量节点在边界框中而不是少量节点时,或者如果边界框很大时,不应该显着减慢
应该能够找到直接连接的节点:例如连接两种方式的节点
可以只读
应该是紧凑的(避免浪费空间) - 我希望将英国的地图放入不到1 GB的范围内。我有一个卫星导航,可以在SD卡上使用大约800 MB的空间。
我最初想的是四叉树存储方式。但是快速实现很棘手,并且它们不适用于单个节点;所有节点都可以放在最小的bbox中。
(我故意使用相同的Open Street Map术语,因为我打算使用这些数据。)
答案 0 :(得分:5)
我建议PostGIS 1.5使用地理类型,因为它适合您想要的内容,但我在嵌入式设备上使用此类内容的唯一问题是内存使用情况。
我在Java中使用非GIS数据库(firebird)建立了模糊相关的东西,并且性能足以在边界框内检索点(尽管需要花哨的SQL,但PostGIS不是这种情况)。
答案 1 :(得分:5)
PostGIS可能是最佳选择。注意:PostGIS 是带有地理扩展的 PostgreSQL。你真的安装postgres,然后运行各种脚本,添加地理功能和类型。
请参阅OpenStreetMap information about PostGIS。您可以使用osm2pgsql将OpenStreetMap行星文件/行星提取加载到PostGIS中,这是在运行Mapnik渲染器的OpenStreetMap磁贴服务器上完成的操作。然而...
OpenStreetMap数据还有一个更原始的数据库模式(表称为“节点”和“方式”等)这是主 OpenStreetMap数据库服务器用于存储其地理数据并允许编辑的内容通过API。在空间索引等方面,这并不是那么聪明,但又好又简单。您可以通过安装OpenStreetMap API/website ruby on rails code以此格式创建数据库。这是设置database schema(由the rails migrations定义)的最新版本的最可靠方法。之后,您可以运行osmosis工具来填充数据库。
答案 2 :(得分:1)
我所知道的地理数据最好的数据库是带有地理扩展的PostgreSQL,但我不知道速度。我知道OSM使用它,但是他们可以访问 fast 的巨大计算机基础设施。我也知道他们有几个人可以为他们编写更快的程序。
我想说Quadtree是处理地理部分数据的一个非常好的选择,似乎你允许方块从我能说的方面变得太小。您可以使边界更柔和(允许节点位于四叉树的两个叶子中)并为每个叶子添加最少量的节点。假设任何叶子不允许包含少于64个节点,并且不超过1024个。
排序对于速度来说尤其重要,建议将对可能更容易被访问的åreas进行排序。假设70%的请求都在伦敦附近,那么将这些数据放在文件开头以减少搜索时间是最快的。
答案 3 :(得分:1)
PostGIS不是唯一支持地理空间数据的数据库,但价格非常好。难以击败“免费”。
但是还有其他免费选项,有些读者可能已经有了另一个关系数据库系统,并希望利用这些专业知识而不必学习PostGIS。任何支持开放地理联盟规范(OGC或OpenGeo)的数据库都足以满足您描述的场景。
就像摄影世界的格言一样 - “最好的相机就是你拥有的相机” - 有时理想的空间数据库就是你已经拥有并知道如何使用的数据库。
所以这里列出了我所知道的所有选项:
空间RDBMS - 免费选项
空间RDBMS - 没有免费选项
小于理想的空间RDBMS
空间“Extension-Ware”
答案 4 :(得分:0)
我不确定空间,但您可能希望查看对常见数据库服务器使用任何Geo扩展(如果可能的话)。它们通常提供快速地理索引,基于边界框(回答1和2)的许多地理程序进行计算(回答3,intersect(way1,way2)
)。
此外,您的问题更适合http://gis.stackexchange.com