用Python分析武汉20年土地利用变化:从Landsat影像到动态图斑统计

发布时间:2026/6/1 20:22:09

用Python分析武汉20年土地利用变化:从Landsat影像到动态图斑统计 用Python分析武汉20年土地利用变化从Landsat影像到动态图斑统计武汉这座江城的土地肌理正随着城市化进程不断被重塑。对于数据分析师和科研人员而言如何从海量遥感数据中提取有价值的空间变化信息是评估城市发展轨迹的关键。本文将带您用Python构建一套完整的分析流程从多期Landsat影像中挖掘武汉1980-2020年间土地利用的时空演变规律。1. 数据准备与预处理获取武汉市土地利用数据后首先需要建立规范的数据管理结构。建议按以下目录组织原始数据/Wuhan_LandUse ├── /raw_data │ ├── 1980.tif │ ├── 1990.tif │ └── ... ├── /processed ├── /outputs └── config.yaml使用Rasterio库读取TIFF格式的栅格数据时需特别注意坐标系统一性。以下代码演示如何批量检查所有影像的CRSimport rasterio def check_crs(file_list): crs_info {} for file in file_list: with rasterio.open(file) as src: crs_info[file] str(src.crs) return crs_info常见预处理步骤包括投影转换确保所有数据使用相同CRS空间范围裁剪以武汉行政边界为掩膜无效值处理如填充Nodata区域提示使用GeoPandas读取武汉市行政边界Shapefile时建议先对边界做5km缓冲区处理避免边缘像元被错误裁剪。2. 土地利用分类统计方法武汉土地利用数据采用二级分类体系我们需要先建立分类映射字典class_mapping { 1: 耕地, 11: 水田, 12: 旱地, 2: 林地, # ...完整分类映射 }面积统计的核心算法是通过Numpy进行像素计数再乘以像元面积900m² for 30m分辨率def calculate_area(raster, class_id): pixel_count np.sum(raster class_id) return pixel_count * 900 / 1000000 # 转换为平方公里为提升计算效率可以借助Dask进行并行计算import dask.array as da def parallel_area_calc(raster, classes): dask_array da.from_array(raster, chunksauto) results {} for class_id in classes: count da.sum(dask_array class_id).compute() results[class_id] count * 900 / 1000000 return results3. 时空变化可视化技术3.1 面积变化趋势图使用MatplotlibSeaborn组合绘制多类别面积变化折线图plt.figure(figsize(12, 6)) sns.set_style(whitegrid) for land_type in [建设用地, 耕地, 水域]: sns.lineplot(x年份, y面积, datadf[df[类型]land_type], labelland_type, markero) plt.title(武汉市主要土地利用类型面积变化1980-2020) plt.ylabel(面积平方公里) plt.legend(bbox_to_anchor(1.05, 1)) plt.tight_layout()3.2 空间动态变化图创建土地利用变化动图需要以下步骤统一所有年份数据的色彩映射使用Matplotlib的FuncAnimation生成帧序列添加时间轴标注核心动画代码结构from matplotlib.animation import FuncAnimation fig, ax plt.subplots(figsize(10, 8)) im ax.imshow(data_1980, cmaptab20, vmin1, vmax67) def update(frame): im.set_array(yearly_data[frame]) ax.set_title(f武汉市土地利用分布 {years[frame]}年) return [im] ani FuncAnimation(fig, update, frameslen(years), interval800) ani.save(landuse_evolution.mp4, writerffmpeg, dpi200)4. 高级分析方法与应用4.1 土地利用转移矩阵构建转移矩阵可以量化各类土地之间的转化关系def transition_matrix(old_raster, new_raster, classes): matrix np.zeros((len(classes), len(classes))) for i, old_class in enumerate(classes): mask (old_raster old_class) for j, new_class in enumerate(classes): matrix[i,j] np.sum((mask) (new_raster new_class)) return pd.DataFrame(matrix, indexclasses, columnsclasses)4.2 景观格局指数计算使用PyLandStats库计算常见景观指数from pylandstats import Landscape landscape Landscape(wuhan_2020.tif, res(30, 30)) metrics { PLAND: landscape.pland(class_val51), # 城镇用地占比 ED: landscape.edge_density(), LSI: landscape.landscape_shape_index() }典型分析结果可能显示建设用地破碎度指数从1980年的1.2上升到2020年的2.8耕地最大斑块指数LPI下降约40%水域连通性指数呈现波动变化5. 分析报告自动化生成结合Jinja2模板引擎可以自动生成包含图表的研究报告from jinja2 import Environment, FileSystemLoader env Environment(loaderFileSystemLoader(templates)) template env.get_template(report_template.html) report_content template.render( title武汉市土地利用变化分析报告, time_series_plotlanduse_trend.png, transition_matrixtransition_df.to_html() ) with open(final_report.html, w) as f: f.write(report_content)推荐报告包含的要素关键变化统计数据表格时空变化动态图GIF或视频嵌入转移矩阵热力图景观指数变化曲线在项目实践中建议将整个流程封装为Python包通过配置文件驱动分析过程。例如建立如下处理管道pipeline LandUseAnalysisPipeline( config_pathconfig.yaml, output_dirresults ) pipeline.run_analysis()这种模块化设计使得分析方法可以快速复用到其他区域的研究中。

相关新闻