我需要在多边形内过滤数据行。我的multypolygon存储在gdf_polygon中,我的点存储在gdf中。这是它们外观的一些简历。

gdf_polygon
id          geometry
0           MULTIPOLYGON (((39.81239 21.43429, 39.81445 21...

gdf
id      geometry
0       POINT (50.05832 26.43992)
...     ...


问题是,当我尝试检查其内部是否有任何点时,返回False,但我知道多边形内有一些点。

基本上,如果我运行此命令,则将False作为输出。

gdf_polygon.geometry.contains(gdf.geometry).any()


否则,如果运行此命令,则将True作为输出,因为该点在多边形内部。

gdf_polygon.geometry.contains(gdf.geometry[141828])


我知道我可以遍历gdf的所有行并为每个行运行包含,但是由于我的数据集很大(大约30.000.000行),因此效率很低。所以我一直在寻找解释或可能的解决方法。

我的数据框创建是:

 crs = {'init': 'epsg:4326'}

 df = pd.read_csv(FOLDER+file, compression='gzip', escapechar='\\')

 geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)]
 gdf = gpd.GeoDataFrame(df,crs=crs, geometry=geometry)

 inside = gdf.geometry.within(gdf_polygon.geometry)

最佳答案

比较contains中的两个GeoSeries geopandas使它们对齐时,请参见https://gis.stackexchange.com/questions/345785/geopandas-intersect-function-gives-different-result-to-shapely/345822#345822以获得解释。

为了使代码按预期工作,您需要将点的GeoSeries与多面几何本身进行比较。反之亦然,使用within

polygon = gdf_polygon.geometry.iloc[0]
gdf.geometry.within(polygon)

09-29 19:52
查看更多