代码之家  ›  专栏  ›  技术社区  ›  itsme

寻找可移动地理标记物体的体系结构

  •  2
  • itsme  · 技术社区  · 14 年前

    我现在有一个Postgres数据库,里面有大约30万个全世界移动车辆的数据集。我经常重复的问题是:给我5/10/20英里半径范围内的所有车辆。目前我在数据库中花费大约600到1200毫秒来准备定位的车辆对象集。

    有什么想法如何架构整个系统来加速这个查询?有没有NoSQL数据库能够提供这种地理定位性能?我知道MongoDB正在开发一个扩展来实现这个场景,但是还没有尝试过。有没有智能地使用Redis来实现这一点?

    期待您的考虑,谢谢!

    2 回复  |  直到 14 年前
        1
  •  1
  •   npdoty    14 年前

    如果您使用正确的算法来组织数据,您将能够使用 spatial index 这样可以大大加快查询速度。

    地理位置域的最佳实践是使用 geohash , quad-tree R-tree 查询点树(或者说大多数数据结构都是相似的,但这听起来并不重要)。在每种情况下,都可以创建一个空间索引,该索引使用单个线性列,其中每个值表示大小和形状不同的边界框。这样您就可以用数据库中的单个范围查询来回答大多数查询。空间索引可以用SQL实现( PostGIS MS SQL , MySQL 它们都有使用这些技术之一的空间数据类型和空间索引)或NoSQL(因其水平可伸缩性而流行;AppEngine有 geomodel ,SimpleGeo使用 Cassandra ,Foursquare使用 MongoDB ).

    使用索引可能会因为不断移动的点而变得复杂,但我怀疑写操作,甚至是更新索引的稍微繁重的写操作,不会成为您的瓶颈。

        2
  •  0
  •   Anders Abel    14 年前

    即使你的车辆一直在行驶,我想他们有某种速度限制。你能做的就是创建某种离散坐标系,一个例子就是纬度/经度坐标的整数部分。然后将这些值放在单独的列中,在另一列中保留精确的位置。然后您应该能够索引整数列,因为车辆不会移动太多,因此它们会经常更改这些值。

    在进行搜索时,首先要找出哪些“正方形”是有趣的,并使用索引列将查询限制到这些sqeare中的vechicle。然后你必须对每个广场内的所有车辆进行全面搜索。你必须做一个全面搜索的车辆数量现在应该只是所有车辆的一小部分。当然,这种策略的效率取决于车辆的分布情况。如果50%的车辆在某个城市,这是行不通的,但假设一个地方最大的车辆组为5-10%,则应提高性能。