查找至少包含 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
如果regions
和points
是GeoDataFrames而不是GeoSeries,你需要在上面添加一个.geometry
。
我有两个数据集,一个是法国地区的形状文件,第二个是包含点的文件。我想(有效地)找到至少包含一个点的区域。
当我打印这两个数据集时,我看到
我试过用 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
如果regions
和points
是GeoDataFrames而不是GeoSeries,你需要在上面添加一个.geometry
。