查找包含Python中的Points列表中的至少一个的多边形

时间:2018-03-15 11:40:39

标签: python pandas shapely geopandas

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

我尝试使用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,我会得到相同的结果。当然我可以用循环来做,但我想找到一种更有效的方法。

2 个答案:

答案 0 :(得分:2)

你尝试的几乎是正确的。将函数应用于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)])

看起来像:

enter image description here

然后应用该函数看起来像:

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

如果regionspoints是GeoDataFrame而不是GeoSeries,则需要在上面添加.geometry

答案 1 :(得分:0)

问题似乎是由Point而不是Polygons给出的。

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

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)

再一次,只有包含至少一个点的多边形是邻居才会有效。