在geopandas的naturalearth_lowres世界地图中移除夏威夷并解决裁剪报错
问题根源
- GeoPandas版本兼容问题:
clip方法从GeoPandas 0.10版本才开始支持直接传入Polygon几何对象,0.9及更早版本仅支持传入GeoDataFrame/GeoSeries类型参数,这是触发TypeError的直接原因。 - 多边形构造错误:手动定义的多边形坐标点顺序有误,出现了重复顶点和自交的情况,因此
polygon.is_valid返回False。原坐标序列会先从(180, 85)跳回(-175, 85),导致几何图形非法。
修正方案
推荐两种合法构造裁剪矩形的方式,同时兼容不同版本GeoPandas:
方案1:手动修正坐标点
按顺时针/逆时针顺序依次定义矩形四个顶点,最后闭合回起点即可:
#!/usr/bin/python import geopandas as gpd from shapely.geometry import Polygon world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) # 移除南极洲 world = world[(world.pop_est>0) & (world.name!="Antarctica")] # 构造合法裁剪矩形:经度范围-175°~180°,纬度范围-85°~85°,自动过滤西经175°以西的夏威夷、波利尼西亚区域 polygon = Polygon([ (-175, -85), # 左下角 (-175, 85), # 左上角 (180, 85), # 右上角 (180, -85), # 右下角 (-175, -85) # 闭合回起点 ]) print(polygon.is_valid) # 此时返回True # 兼容所有版本的裁剪写法 poly_gdf = gpd.GeoDataFrame(geometry=[polygon], crs=world.crs) world = world.clip(poly_gdf)
方案2:使用shapely.geometry.box一键生成矩形(更稳妥,避免手动写坐标出错)
from shapely.geometry import box # 直接传入最小x、最小y、最大x、最大y即可生成合法矩形 polygon = box(minx=-175, miny=-85, maxx=180, maxy=85)
后续裁剪逻辑和方案1完全一致。
内容的提问来源于stack exchange,提问作者CPBL
相关产品推荐
相关产品推荐

