我需要在多边形内过滤数据行。我的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)