将点匹配到大多边形列表中的多边形

时间:2013-02-19 16:15:40

标签: java algorithm gis polygon

我有一个很大的多边形列表(比如大小250,000)和一个大的点列表(比如大小为100,000)。我需要做的是找到每个点所属的多边形。

多边形总是矩形/菱形,有5个点,第一个和最后一个点相同。它们的近似中心点也与多边形相关。 示例多边形如下:多边形(a; b; c; d; a)=(3,1; 5,3; 3,5; 1,3; 3,1)和中心点(x)=(3 ,3)。见下面的示例图:

          c (3,5)
         /\
        /  \
(1,3) d/    \b (5,3)
       \ x  /
        \  /
         \/
          a (3,1)

这是一个简化的例子。这些点中的大多数是lat-lon / GIS坐标。

点的输入列表可能与任何多边形不匹配,或者可能与多边形列表中的一个或多个多边形匹配。

目前我有一个函数,它采用一个点和一个多边形来查看该点是否在多边形内部。任何时候我想看到一个点在多边形中,我必须遍历完整的多边形列表以查看它是否匹配。此外,由于某个点可能位于多个多边形中,因此每次都必须遍历完整列表。这是非常低效的。

我正在寻找的是将这些多边形排序到HashMap或其他什么东西,以便我可以快速获取需要为每个点检查的几个多边形而不是完整的多边形列表。由于这些点同时具有x和y参数,我无法找到订购多边形的好方法。 另请注意,每个多边形都有一个中心点。那么有没有办法根据这些中心点将多边形排序为关键,以便我们可以轻松查找?

对此有何看法?谢谢!

2 个答案:

答案 0 :(得分:2)

使用k-d树,这是一个有效的空间分区

http://en.wikipedia.org/wiki/K-d_tree

答案 1 :(得分:0)

将2D空间拆分为方形单元格,用于与单元格相交的多边形的每个单元格存储列表。当您需要检查点时,首先找到属于的单元格点,然后遍历与该单元格相交的所有多边形并进行测试。选择单元格大小,以便每个单元格中有合理数量的多边形。

如果您的多边形分布不均匀,您可能需要使用quadtree而不是方形单元格。