Python中如何解决geopandas特定UserWarning无法抑制的问题?
解决geopandas clip操作中无法抑制的UserWarning问题
问题描述
执行get_water_data函数时,持续弹出以下警告:
UserWarning: keep_geom_type can not be called on a mixed type GeoDataFrame.
函数代码:
def get_water_data(north, south, east, west, mask_gdf): print("Download water_data in progress....") tags= {"natural":["water"], "waterway":["river"]} gdf = ox.features_from_bbox(north, south, east, west, tags) gdf_reproj = ox.project_gdf(gdf, to_crs="EPSG:3857") gdf_clipped= gpd.clip(gdf_reproj, mask_gdf, keep_geom_type=True) gdf_clipped = gdf_clipped[(gdf_clipped['geometry'].geom_type =='Polygon') | (gdf_clipped['geometry'].geom_type == 'LineString')] print("water_data ...OK\n") return gdf_clipped
已尝试但无效的方法:
- 在函数内调用
warnings.filterwarnings("ignore", category=UserWarning, module="geopandas") - 全局执行
warnings.filterwarnings("ignore")屏蔽所有警告
解决方案
1. 精准匹配警告文本抑制
仅指定module="geopandas"可能无法覆盖触发警告的子模块,直接匹配警告的完整文本可以确保精准拦截:
import warnings import geopandas as gpd import osmnx as ox def get_water_data(north, south, east, west, mask_gdf): # 精准匹配目标警告 warnings.filterwarnings( "ignore", message="keep_geom_type can not be called on a mixed type GeoDataFrame.", category=UserWarning ) print("Download water_data in progress....") tags= {"natural":["water"], "waterway":["river"]} gdf = ox.features_from_bbox(north, south, east, west, tags) gdf_reproj = ox.project_gdf(gdf, to_crs="EPSG:3857") gdf_clipped= gpd.clip(gdf_reproj, mask_gdf, keep_geom_type=True) gdf_clipped = gdf_clipped[(gdf_clipped['geometry'].geom_type =='Polygon') | (gdf_clipped['geometry'].geom_type == 'LineString')] print("water_data ...OK\n") return gdf_clipped
2. 从根源避免警告(推荐)
警告的核心原因是传入gpd.clip的GeoDataFrame包含多种几何类型,却启用了keep_geom_type=True。可以先拆分几何类型再分别裁剪,彻底消除警告触发条件:
import geopandas as gpd import pandas as pd import osmnx as ox def get_water_data(north, south, east, west, mask_gdf): print("Download water_data in progress....") tags= {"natural":["water"], "waterway":["river"]} gdf = ox.features_from_bbox(north, south, east, west, tags) gdf_reproj = ox.project_gdf(gdf, to_crs="EPSG:3857") # 按几何类型拆分数据 polygons = gdf_reproj[gdf_reproj['geometry'].geom_type == 'Polygon'] linestrings = gdf_reproj[gdf_reproj['geometry'].geom_type == 'LineString'] # 分别裁剪空数据处理 clipped_polygons = gpd.clip(polygons, mask_gdf, keep_geom_type=True) if not polygons.empty else gpd.GeoDataFrame() clipped_linestrings = gpd.clip(linestrings, mask_gdf, keep_geom_type=True) if not linestrings.empty else gpd.GeoDataFrame() # 合并裁剪结果 gdf_clipped = pd.concat([clipped_polygons, clipped_linestrings], ignore_index=True) print("water_data ...OK\n") return gdf_clipped
3. 临时上下文抑制警告
如果不想全局修改警告规则,可以用上下文管理器仅在裁剪操作时屏蔽目标警告:
import warnings import geopandas as gpd import osmnx as ox def get_water_data(north, south, east, west, mask_gdf): print("Download water_data in progress....") tags= {"natural":["water"], "waterway":["river"]} gdf = ox.features_from_bbox(north, south, east, west, tags) gdf_reproj = ox.project_gdf(gdf, to_crs="EPSG:3857") # 仅在clip执行期间抑制警告 with warnings.catch_warnings(): warnings.filterwarnings( "ignore", message="keep_geom_type can not be called on a mixed type GeoDataFrame.", category=UserWarning ) gdf_clipped= gpd.clip(gdf_reproj, mask_gdf, keep_geom_type=True) gdf_clipped = gdf_clipped[(gdf_clipped['geometry'].geom_type =='Polygon') | (gdf_clipped['geometry'].geom_type == 'LineString')] print("water_data ...OK\n") return gdf_clipped
内容的提问来源于stack exchange,提问作者Ezaan
相关产品推荐
相关产品推荐

