有没有一种方法可以更快地找到给定点的多边形?

时间:2020-05-07 11:13:24

标签: algorithm computational-geometry

我有一个国家的一些城市的MultiPolygon。对于给定的点,我想检查它位于哪个城市。 (我们可以假定每个给定点都位于该国家/地区中,因此它恰好位于一个城市中。)

一种方法是迭代每个多边形,并通过点对点算法检查点是否位于该多边形中。但是因为我可能有很多点,并且多边形点算法至少具有O(n)复杂度,所以这不是适当的方法。

因此,我需要使用以下假设来解决此问题:

  • 每个地点都恰好位于一个城市。
  • 城市边界是固定的,不会每次都改变。

可以用什么算法解决这个问题?

2 个答案:

答案 0 :(得分:2)

多边形对我来说似乎是必要的。但是为了加快算法速度,请使用网格对空间进行分区。您可以使用四边形包围整个城市,而四边形则位于城市内部,以加快检测速度。仅当点在外部四边形内部而不在内部四边形内部时,才使用多边形点算法。 Mehdi建议的四叉树可以非常快速地实现。但是最好的解决方案可能是映射到网格,如下所述,您将获得 O(1)解决方案

您可能也可以加快对多边形进行镶嵌的PIP算法。

使用适当的舍入函数,您可以将点的坐标用作二维数组的索引,并在 O(1)中确定它是否在特定城市中,如果不在特定城市中,一个城市或是否需要进一步调查。

示例:点为(3.4560,5.1547)网格为10x10。 City1是City1的(3,3),(4,3),(4,4),(4,5),(4,6),(3, 6),(2,6),(2,5),(2,4),(2,3)。将点四舍五入为整数,您将获得3,5,可以用作Mat(3,5)= C1中矩阵的索引,其中C1代表City1。您可以将此技巧与具有任意选定分辨率的地理坐标配合使用。

公式,用于将坐标映射到数组的索引:

Coordinate c in [a,b] 
array index i in [0,n-1]
i = floor( (c-a) / ((b-a)/n) )

答案 1 :(得分:1)

通过在垂直轴上投影几何图形,可以大大提高速度。每个多边形都会退化为一个段,您可以将其插入到段树https://en.wikipedia.org/wiki/Segment_tree中。然后使用查询时间O(log(N)+ K),您将报告通过该点的直线所交叉的K个多边形。

如果多边形不太大,则可以尝试将尝试的多边形数量从N减少到√N(大致)。

在X轴上也执行此过程,并且仅处理两个结果列表共有的多边形可能是有利的。这样,您将只测试包含边界框在测试点周围的多边形。

相关问题