Algorithm 匹配建筑物上的房屋编号(多边形点测试的特例) 带示例的任务

Algorithm 匹配建筑物上的房屋编号(多边形点测试的特例) 带示例的任务,algorithm,indexing,geospatial,openstreetmap,computational-geometry,Algorithm,Indexing,Geospatial,Openstreetmap,Computational Geometry,我正在使用openstreetmap中的地理数据(国家大小)。建筑物通常是没有门牌号的多边形,在建筑物的多边形内放置一个带有门牌号的点。建筑物可能有多个门牌号 我想将房屋编号与建筑物的多边形相匹配。 简单解 Foreach housenumber对每个建筑多边形执行多边形中的点测试 问题 对于大约50000000栋建筑和10000000个地址点来说,速度太慢了 主意 构建建筑多边形并为其编制索引,以加速搜索每个housenumber点的周围多边形 问题: 对于这种多边形结构,您会推荐什么索引或

我正在使用openstreetmap中的地理数据(国家大小)。建筑物通常是没有门牌号的多边形,在建筑物的多边形内放置一个带有门牌号的点。建筑物可能有多个门牌号

我想将房屋编号与建筑物的多边形相匹配。

简单解 Foreach housenumber对每个建筑多边形执行多边形中的点测试

问题 对于大约50000000栋建筑和10000000个地址点来说,速度太慢了

主意 构建建筑多边形并为其编制索引,以加速搜索每个housenumber点的周围多边形

问题: 对于这种多边形结构,您会推荐什么索引或策略?多边形从不重叠,该区域被稀疏覆盖



此问题已复制到gis.stackexchange.com。建议您将问题张贴在那里。

因为听起来您有格式良好的多边形可供测试,我将使用带有AABB检查的空间散列,最后是多边形中的完整点测试。希望在这一点上,您将平均每个地址进行三次或更少的多边形点测试

  • 将数据覆盖的区域拆分为一个简单的网格,其中网格是中等建筑大小的一个小倍数(2到4)。(可能100-200米?)
  • 计算每个多边形的轴对齐边界框,将其(及其边界框)添加到边界框相交的每个栅格位置。(计算轴对齐的边界框与常规轴对齐的网格单元重叠的位置非常简单。我不会将网格存储在简单的二维数组中——我会使用哈希表将二维整数网格坐标(例如(1023301))映射到多边形列表)
  • 然后检查你所有的地址点。在哈希表中查找该点所在的单元格。遍历该单元中的所有多边形,如果该点位于任何多边形的轴对齐边界框内,则执行“多边形中的完整点”测试
这有几个优点:

  • 数据结构很简单——不需要花哨的库(除了处理多边形)。用C++、多边形库和STD命名空间可以在不到一个小时内实现。
  • 空间结构不是分层的——当您查找点时,只需在哈希表中进行一次O(1)查找
当然,网格作为一种空间结构的常见缺点是:

  • 不能很好地处理各种大小的多边形。然而,我希望,由于您使用的是地图数据,因此大小几乎总是在一个数量级以内,而且可能要小得多

假设您在每个网格中都有
N
最大多边形,每个多边形都有
p
点,并且您有
B
建筑和
A
地址,您将看到
O(B*p+N*A)
。由于<>代码> b>代码>和<>代码> p>代码>可能比较小,特别是在平均情况下,你可以考虑这个代码> o(b+n)——非常线性。

这个问题更好地属于。此外,你可以看看其他人选择的策略,例如,我应该在gis.stackexachange.com上发布一份副本吗?如果不是的话,我怎么能提出这个问题?据我所知,你不能提出。创建一个副本,但在两个问题中都提到它,或者关闭此问题。使用更高的数据结构(例如四叉树)此问题旨在讨论使用哪种结构(例如四叉树、r-树等等)。为什么不使用2d数组?是因为多边形的稀疏性而节省内存吗?是的。我会假设你有大片的乡村和密集的社区,但我承认,我有偏见,因为这就是我居住的地方。老实说,如果您不认为内存约束会是一个问题,那么使用数组会更简单一些。但是哈希表提供了几乎无限的空间——您不必担心数组的大小。我不确定你在任何情况下都会注意到多少速度差异。我想我应该将其存储在1d阵列中,以获得更高的速度,因为缓存效率更好。我会做一些计算和测试内存使用情况,然后让你知道。如果你使用一种快速语言(例如C++、D、FORTRAN,我们甚至还可以计算java、javascript和c++),你一般不会注意到一个数组和一个哈希表的访问速度。我可以在一秒钟内用C#5000万次点击一个哈希表。(这是一些相当复杂的键——不是整数对)我使用了C#中的解决方案,编写了一个包含X和Y成员的类Pixel,并重写了GetHashCode方法。光栅化相当快,只需要几分钟。让我们看看点的位置有多快。。。