我有两个数据集,一个是法语区域的形状文件,第二个是包含点的文件。我想(有效地)找到包含至少一个点的区域。 当我打印两个数据集时,我看到
我尝试使用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
,我会得到相同的结果。当然我可以用循环来做,但我想找到一种更有效的方法。
答案 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)])
看起来像:
然后应用该函数看起来像:
>>> regions.apply(lambda x: points.within(x).any())
0 True
1 True
2 False
dtype: bool
如果regions
和points
是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)
再一次,只有包含至少一个点的多边形是邻居才会有效。