使用geopandas提取NetCDF格点数据对应国家的问题求助
解决思路
你的核心问题是当前用格点中心点做空间匹配,只能关联到中心所在的国家。只要把每个格点的几何从点替换为对应范围的矩形面,再做空间相交连接,就能匹配到所有和该格点有重叠的国家。
具体代码修改
你只需要替换原代码中生成pdsi_gdf的部分,其余逻辑基本不需要改动:
首先导入需要的依赖,再自动计算格点分辨率,构造每个格点的矩形几何:
from shapely.geometry import Polygon # 自动计算格点的半分辨率,适配不同分辨率的NetCDF数据 lon_step = ds.lon.diff(dim='lon').values[0] lat_step = ds.lat.diff(dim='lat').values[0] half_lon_res = lon_step / 2 half_lat_res = lat_step / 2 # 定义生成格点矩形的函数 def get_grid_polygon(row): lon, lat = row['lon'], row['lat'] # 按顺时针顺序构造矩形四个顶点,最后回到起点闭合 return Polygon([ (lon - half_lon_res, lat - half_lat_res), (lon + half_lon_res, lat - half_lat_res), (lon + half_lon_res, lat + half_lat_res), (lon - half_lon_res, lat + half_lat_res), (lon - half_lon_res, lat - half_lat_res) ]) # 替换原有点几何生成逻辑,改用格点矩形作为geometry pdsi_gdf = geopandas.GeoDataFrame( pdsi, geometry = pdsi.apply(get_grid_polygon, axis=1), crs = world_shp.crs ) # 空间连接时指定相交匹配规则,只要格点和国家边界有重叠就会生成关联记录 join_inner_df = geopandas.sjoin(pdsi_gdf, world_shp, how="inner", predicate="intersects")
注意事项
- 若存在跨180度经线的格点,需要先对跨经线的多边形做拆分处理,避免匹配异常
- 你当前用的
naturalearth_lowres是低精度行政边界,对边界匹配精度要求高的话可以替换为更高分辨率的行政边界数据 - 后续如果需要按国家统计PDSI数值,可以额外计算格点和对应国家的重叠面积占比,做面积加权统计,结果会更符合实际情况
内容的提问来源于stack exchange,提问作者ggmaster
相关产品推荐
相关产品推荐

