匹配建筑物上的房屋数量(多边形点测试的特殊情况)

时间:2014-10-30 10:15:39

标签: algorithm indexing geospatial openstreetmap computational-geometry

任务示例

我正在使用openstreetmap中的geodata(country-size)。建筑物通常是没有住宅数字的多边形,并且房屋编号的单个点位于建筑物的多边形内。建筑物可能有多个住宅号。

我希望将住宅数量与建筑物的多边形相匹配。 Example

简单解决方案

Foreach housenumber使用每个建筑物多边形执行多边形点测试。

问题

对于大约50,000,000个建筑物和10,000,000个地址点来说太慢了。

构建多边形的构建和索引,以加速搜索每个housenumber-point的周围多边形。

问题

您会为此多边形结构推荐哪种指数或策略?多边形从不重叠,区域被稀疏覆盖。


此问题与gis.stackexchange.com重复。建议在那里发布问题。

1 个答案:

答案 0 :(得分:1)

由于听起来你有很好的多边形要测试,我会使用带有AABB检查的空间散列,然后最后使用完整的多边形点测试。希望在这一点上,您将为每个地址平均三个或更少的多边形点测试。

  • 将您的数据区域划分为一个简单的网格,其中网格是中间建筑物大小的小倍数(2到4)。 (也许100-200米?)
  • 计算每个多边形的轴对齐边界框,将其(带有边界框)添加到边界框相交的每个网格位置。 (弄清楚轴对齐的边界框与常规轴对齐的网格单元重叠的位置非常简单。我不会将网格存储在一个简单的2D数组中 - 我使用哈希表将2D整数网格坐标(例如(1023,301))映射到多边形列表)
  • 然后浏览所有地址点。在哈希表中查找该点所在的单元格。遍历该单元格中的所有多边形,如果该点位于任何多边形的轴对齐边界框内,则执行完整的多边形点测试。

这有几个好处:

  • 数据结构很简单 - 不需要花哨的库(除了处理多边形)。使用C ++,多边形库和std命名空间,可以在不到一个小时的时间内实现。
  • 空间结构不是分层的 - 当你查找点时,你只需要在哈希表中进行一次O(1)查找。

当然,网格作为空间结构的常见缺点是:

  • 不能特别好地处理大小不一的多边形多边形。但是,我希望自从您使用地图数据后,尺寸几乎总是在一个数量级内,而且可能要小得多。

假设您最终在每个网格中都有N个最大多边形,并且每个多边形都有P个点,并且您拥有B个建筑物和A个地址,你在看O(B*P + N*A)。由于BP可能相对较小,特别是平均而言,您可以考虑这个O(B + N) - 非常线性。