xArray+GeoPandas批量多边形统计处理问题求助
批量用GeoPandas多边形裁剪xArray数据集并计算统计量的问题
我在用xArray和GeoPandas做时间序列数据分析时碰到了问题。手里有个cum_magn_ds的xArray数据集,还有包含200个多边形的GeoDataFrame(selected_gdf)。需求是遍历每个多边形,裁剪数据集后计算均值这类基础统计量。单个多边形处理完全正常,但批量处理时,把每行多边形几何参数传入xArray_dataset.rio.clip()的环节出错了。
我尝试的代码如下(几何参数处理存在错误):
results_from_three = [] for row in selected_gdf.iterfeatures(): # print(type(row)) # print(row['geometry']['coordinates']) aoi_coords = row['geometry']['coordinates'] # print(aoi_coords) aoi = cum_magn_ds.rio.clip(aoi_coords) mp = aoi.cum_disp.mean(dim=["x", "y"], skipna=True) results_from_three.append(mp) # Concatenate results into a single DataFrame df = xr.concat(results_from_three, dim='polygon').to_dataframe()
单个多边形处理的可行代码参考:
获取最大多边形:
single_poly_gdf = gdf.loc[[gdf['area_m2'].idxmax()]]
裁剪并计算均值:
cum_magn_ds.rio.clip(single_poly_gdf.geometry.values, single_poly_gdf.crs).cum_disp.mean(dim=["x", "y"], skipna=True)
问题原因与解决办法
你用iterfeatures()拿到的是GeoJSON格式的坐标,但rio.clip()需要的是Shapely几何对象,且最好同时传入CRS参数(确保和数据集CRS匹配),直接传坐标数组会导致格式不兼容。
优化后的批量处理代码:
results_from_three = [] # 先确认数据集与GeoDataFrame的CRS一致,不一致则先转换 # selected_gdf = selected_gdf.to_crs(cum_magn_ds.rio.crs) for idx, row in selected_gdf.iterrows(): # 获取当前行的Shapely几何对象 geom = row.geometry # 裁剪时传入几何对象和CRS aoi = cum_magn_ds.rio.clip([geom], selected_gdf.crs) # 计算均值并添加到结果列表 mp = aoi.cum_disp.mean(dim=["x", "y"], skipna=True) # 带上多边形索引,方便后续对应 mp = mp.assign_coords(polygon=idx) results_from_three.append(mp) # 合并结果为DataFrame df = xr.concat(results_from_three, dim='polygon').to_dataframe()
额外优化建议
如果多边形数量较多,循环调用rio.clip()效率较低,可以用xarray-spatial的zonal_stats函数做分区统计,底层经过优化,处理速度更快:
from xrspatial.zonal import zonal_stats # 确保GeoDataFrame与数据集CRS一致 selected_gdf = selected_gdf.to_crs(cum_magn_ds.rio.crs) # 提取数据集的目标变量数组 data_array = cum_magn_ds.cum_disp # 计算分区统计,可指定多个统计量 stats_df = zonal_stats(selected_gdf, data_array, stats_funcs=['mean'])
内容的提问来源于stack exchange,提问作者Diomauricio
相关产品推荐
相关产品推荐

