查找至少包含 Python 中的点列表之一的多边形

Find polygons that contain at least one of a list of Points in Python

我有两个数据集,一个是法国地区的形状文件,第二个是包含点的文件。我想(有效地)找到至少包含一个点的区域。 当我打印这两个数据集时,我看到

我试过用 geopandas 读取形状文件如下

point_data = gpd.read_file(name_file) # I read the points 
regions = gpd.read_file('regions-20180101-shp/regions-20180101.shp')  # I read the regions 
reg.apply(lambda x: x.geometry.contains(point_data).any()) # I try to get the intersectons

我收到一个错误。如果我只是尝试 reg.geometry.contains(point_data) 我得到

0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
...

如果我使用 within,我会得到相同的结果。当然我可以用循环来做,但我想找到一种更有效的方法。

问题似乎是由点类型而不是多边形类型引起的。

我发现的一种解决方法是将点作为多边形,然后研究多边形之间的交集。在这种情况下它运行良好,但这不会总是给出正确的答案。代码是

g1 = point_data.geometry
g1 = [list(g.coords)[0] for g in g1]
p1 = polygon.Polygon(g1)
reg.apply(lambda x: x.geometry.intersects(p1),axis=1)

再说一遍,这仅在包含至少一个点的多边形是相邻点时才有效。

你试过的几乎是正确的。将函数应用于 GeoSeries 时,该函数接收单个形状几何图形,因此在本例中为单个多边形。对于单个多边形,我们要检查是否至少有一个点在该多边形内:

regions.apply(lambda x: points.within(x).any())

使用可重现的小例子:

import geopandas
from shapely.geometry import Polygon, Point
regions = geopandas.GeoSeries([Polygon([(0,0), (0,1), (1,1), (1, 0)]), 
                               Polygon([(1,1), (1,2), (2,2), (2, 1)]),
                               Polygon([(1,0), (1,1), (2,1), (2, 0)])])
points = geopandas.GeoSeries([Point(0.5, 0.5), Point(0.2, 0.8), Point(1.2, 1.8)])

看起来像:

然后应用该函数如下所示:

>>> regions.apply(lambda x: points.within(x).any())
0     True
1     True
2    False
dtype: bool

如果regionspoints是GeoDataFrames而不是GeoSeries,你需要在上面添加一个.geometry