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

基于Xarray数据集区域求和为GeoDataFrame加列:求优化建议

编辑:问题已解决

我发现了geocube这个出色的区域统计库,完美解决了问题。该教程提供了针对DataArray分析的优秀示例;以下是我针对Dataset中多栅格分析编写的代码。

再次恳请各位指出优化空间!谢谢。

Alex

import geopandas as gpd
from rioxarray import open_rasterio
import xarray as xr

ssurgo_data = gpd.read_file("../../test/test_data/input/soil_data_group.geojson")
ssurgo_data = ssurgo_data.loc[ssurgo_data.hzdept_r==0]
ssurgo_data["mukey"] = ssurgo_data.mukey.astype(int)
tif_dict = {2000: 'path_to_2000.tif', 2001: 'path_to_2001.tif'}
xda_dict = {i: open_rasterio(tif_dict[i], mask_and_scale=True) for i in tif_dict.keys()}
elevation = xr.Dataset(data_vars=xda_dict)
elevation = elevation.rio.clip(
    ssurgo_data.geometry.values, ssurgo_data.crs, from_disk=True
).sel(band=1).drop("band")
elevation.name = "elevation"
out_grid = make_geocube(
    vector_data=ssurgo_data,
    measurements=["mukey"],
    like=elevation, # ensure the data are on the same grid
)
for j in tif_dict.keys():
    out_grid[j] = (elevation[j].dims, elevation[j].values, elevation[j].attrs, elevation[j].encoding)
out_grid
原始提问

以下代码虽然能运行,但速度极慢。我正在寻找优化方法,欢迎各位提出建议!谢谢!

我接触xarray时间不长,推测自己只是遗漏了简单的方法。我有一个包含20-30个栅格的xarray.Dataset,每个文件对应同一区域不同类别(年份、降雨、温度等)的数据。

同时我有一个覆盖大致同一时空范围的geopandas.GeoDataFrame,所有几何对象均为shapely.Polygon。我希望为该GeoDataFrame添加一列,对应Dataset中的一个文件,列值为每个Polygon覆盖区域内数据的总和。

Alex

import geopandas as gpd
from rioxarray import open_rasterio
import xarray as xr


rasters = {
     2000: open_rasterio('path_to_2000_data.tif'), 
     2001: open_rasterio('path_to_2001_data.tif')
# ... include data across other years, categories, etc.
}
xds = xr.Dataset(rasters)

gdf = gpd.read_parquet('path_to_geometry.geoparquet')

def helper_xr_pop(
        poly: Polygon,
        xds: xr.Dataset
) -> dict:
    try:
        # clip the dataset by the polygon
        out = xds.rio.clip([poly])
        # convert the sums to a dictionary ({2000: 10, 2001: 20})
        out = out.sum().out.to_dict()
    except:
        out = {}
    return out

XR_DATA = 'xr_data'
gdf[XR_DATA] = dask_gdf[GEO_COL].apply(lambda x: helper_xr_pop(x, xds), axis=1)
s = gdf[[GEO_COL]].apply(lambda x: helper_gpd_pop(*x, xds), axis=1)
pop_df = pd.json_normalize(s)
gdf = gdf.drop(columns=[XR_DATA])
out_gdf = pd.concat(objs=[gdf, pop_df], axis=1)

我尝试用pandas/geopandas、dask/dask_geopandas和polars实现,但耗时都远超预期。我直觉xarray有对应的方法,但尚未找到。我查阅了几天文档,学到了很多,但没找到问题的答案。


内容的提问来源于stack exchange,提问作者Alex Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:20:08