You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:04