Python + GeoPandas 分析中国草地资源:40%国土面积的空间统计与制图
Python GeoPandas 分析中国草地资源40%国土面积的空间统计与制图中国作为世界上草地资源最丰富的国家之一拥有约占国土面积40%的广阔草地。这些草地不仅是重要的生态屏障也是畜牧业发展的基础资源。本文将带你使用Python生态中的GeoPandas、Matplotlib等工具从零开始完成中国草地资源的空间统计分析并生成专业级专题地图。1. 环境准备与数据获取在开始分析前我们需要准备Python环境和相关地理数据。推荐使用Anaconda创建独立环境conda create -n geo python3.9 conda activate geo conda install geopandas matplotlib contextily pandas关键数据来源包括省级行政区划数据可从国家基础地理信息中心获取草地资源分布数据推荐使用中国科学院资源环境科学数据中心发布的1:100万比例尺数据提示处理地理数据时务必确保所有图层使用相同的坐标参考系统(CRS)推荐使用EPSG:4326(WGS84)或EPSG:4610(中国国家大地坐标系)2. 数据加载与预处理使用GeoPandas加载并检查数据质量是分析的第一步import geopandas as gpd # 加载省级行政区划数据 province gpd.read_file(china_provinces.shp) print(province.crs) # 检查坐标系统 # 加载草地资源数据 grassland gpd.read_file(china_grassland.shp) grassland grassland.to_crs(province.crs) # 统一坐标系统常见数据问题及处理方法问题类型检测方法解决方案几何无效geometry.is_validbuffer(0)修复坐标系统不一致crs属性对比使用to_crs()转换属性缺失isnull()统计插值或删除3. 空间统计分析3.1 省级草地面积计算通过空间连接计算各省草地面积占比# 空间连接 joined gpd.sjoin(province, grassland, howinner, opintersects) # 计算各省草地面积 province_grass joined.dissolve(by省名, aggfunc{面积:sum}) province[草地面积] province_grass[面积] # 计算占比 province[草地占比] province[草地面积] / province[面积] * 100主要草地分布省份统计结果示例省份草地面积(km²)占比(%)西藏706,50058.7内蒙古658,40055.2新疆572,30034.5青海363,70050.13.2 草地类型分布特征分析不同草地类型的空间分布规律grass_type_stats grassland.groupby(类型)[面积].agg([count,sum]) grass_type_stats[平均面积] grass_type_stats[sum]/grass_type_stats[count]4. 专题地图制作4.1 分级设色地图展示各省草地资源占比的空间分布import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(12, 8)) province.plot(column草地占比, axax, legendTrue, schemequantiles, cmapYlGn, edgecolork, linewidth0.5) ax.set_title(中国各省草地资源占比分布, fontsize16) plt.tight_layout() plt.savefig(grassland_percentage.png, dpi300)4.2 饼图地图在省级单元内显示草地类型构成from mpl_toolkits.axes_grid1 import make_axes_locatable fig, ax plt.subplots(figsize(15, 10)) divider make_axes_locatable(ax) cax divider.append_axes(right, size5%, pad0.1) # 绘制底图 base province.plot(axax, colorlightgray, edgecolorwhite) # 添加饼图 for idx, row in province.iterrows(): if not pd.isna(row[草地面积]): types grassland[grassland.intersects(row.geometry)] type_counts types.groupby(类型)[面积].sum() if len(type_counts) 0: pie_ax inset_axes(ax, width1, height1, loccenter, bbox_to_anchor(row.geometry.centroid.x, row.geometry.centroid.y), bbox_transformax.transData) type_counts.plot.pie(axpie_ax, colors[#66c2a5,#fc8d62,#8da0cb], wedgepropsdict(width0.5), startangle90) pie_ax.set_xticks([]) pie_ax.set_yticks([]) plt.title(中国草地类型空间分布, fontsize18) plt.savefig(grassland_type_pie.png, dpi300, bbox_inchestight)5. 高级分析与应用5.1 草地资源变化监测结合多时相数据分析草地资源动态变化# 计算变化率 change (grassland_2020.area - grassland_2000.area)/grassland_2000.area * 100 # 空间自相关分析 from esda.moran import Moran w weights.Queen.from_dataframe(change) moran Moran(change[变化率], w) print(fMorans I: {moran.I:.3f}, p-value: {moran.p_sim:.3f})5.2 草地质量评估模型构建简单的草地质量评估指标体系# 标准化处理 from sklearn.preprocessing import MinMaxScaler params [植被指数, 生物量, 土壤湿度] scaler MinMaxScaler() grassland[params] scaler.fit_transform(grassland[params]) # 加权评分 weights [0.4, 0.3, 0.3] # 专家打分法确定权重 grassland[质量评分] (grassland[params] * weights).sum(axis1)在实际项目中处理大规模地理数据时经常会遇到性能问题。我发现使用dask-geopandas可以显著提升处理效率特别是对于全国范围的高分辨率数据。另一个实用技巧是在进行空间连接前先通过空间索引过滤明显不相交的要素这能减少90%以上的计算时间。