)
GEEPython-demo利用Sentinel-监测北京奥林匹克森林公园年NDVI变化(附Python版)一、项目背景植被覆盖度是衡量城市生态健康的重要指标。NDVI归一化植被指数利用植物在近红外波段的高反射和红光波段的强吸收特性广泛用于植被监测。北京奥林匹克森林公园作为城市绿肺其植被年际变化能反映城市生态政策与气候影响。传统遥感处理繁琐而Google Earth EngineGEE提供了强大的云端计算能力。本文通过GEE JavaScript API和Pythongeemap库双语言实现展示如何用Sentinel-2时间序列分析奥林匹克森林公园的NDVI年变化。## 二、技术栈与数据-数据源ESA Sentinel-2 MSI Level-2A已大气校正-分析区域北京奥林匹克森林公园北五环中心点约39.993°N, 116.390°E-时间范围2019-2023年每年6-8月生长旺季-核心工具 - GEE JavaScript Code Editor - Python geemap earthengine-api## 三、GEE JavaScript版快速原型验证以下代码在GEE Code Editor中运行。我们首先加载北京奥林匹克森林公园的矢量边界使用GEE内置的FAO数据集或手动绘制然后逐年计算NDVI平均值。javascript// 1. 定义研究区域手动绘制或从资产导入var roi ee.FeatureCollection(FAO/GAUL/2015/level2) .filter(ee.Filter.eq(ADM2_NAME, Chaoyang)) .filter(ee.Filter.eq(ADM1_NAME, Beijing)) .geometry(); // 简化实际需手动裁剪至奥林匹克公园区域// 更精确做法直接绘制多边形示例用矩形近似var park ee.Geometry.Rectangle([116.380, 39.985, 116.400, 40.005]);// 2. 定义时间序列函数function calcAnnualNDVI(year) { var startDate ee.Date.fromYMD(year, 6, 1); var endDate ee.Date.fromYMD(year, 8, 31); // 加载Sentinel-2影像集去云处理 var s2 ee.ImageCollection(COPERNICUS/S2_SR) .filterBounds(park) .filterDate(startDate, endDate) .filter(ee.Filter.lt(CLOUDY_PIXEL_PERCENTAGE, 20)) .map(function(image) { // 计算NDVI并添加波段 var ndvi image.normalizedDifference([B8, B4]).rename(NDVI); return image.addBands(ndvi).clip(park); }); // 取中值合成减少云噪 var median s2.median(); return median.select(NDVI).set(year, year);}// 3. 逐年计算并输出var years ee.List.sequence(2019, 2023);var ndviCollection ee.ImageCollection.fromImages( years.map(function(y) { return calcAnnualNDVI(y); }));// 4. 打印各年平均值var means ndviCollection.map(function(img) { var mean img.reduceRegion({ reducer: ee.Reducer.mean(), geometry: park, scale: 10, maxPixels: 1e9 }); return ee.Feature(null, { year: img.get(year), meanNDVI: mean.get(NDVI) });});print(Annual NDVI means:, means);Export.table.toDrive({ collection: means, description: OlympicPark_NDVI_Annual});关键点注释- 使用normalizedDifference直接计算NDVI (B8-B4)/(B8B4)- 通过中值合成避免单景影像的云遮挡- 逐年reduceRegion获取区域统计值## 四、Python版geemap自动化工作流Python版更适合批量处理和可视化。使用geemap库可以无缝对接GEE无需前端界面。pythonimport eeimport geemapimport pandas as pdimport matplotlib.pyplot as plt# 初始化GEE需先认证ee.Authenticate()ee.Initialize(projectyour-project-id)# 定义区域同上使用矩形代替park ee.Geometry.Rectangle([116.380, 39.985, 116.400, 40.005])def get_annual_ndvi(year): 获取指定年份的NDVI中值合成 start f{year}-06-01 end f{year}-08-31 s2 (ee.ImageCollection(COPERNICUS/S2_SR) .filterBounds(park) .filterDate(start, end) .filter(ee.Filter.lt(CLOUDY_PIXEL_PERCENTAGE, 20)) .map(lambda img: img.clip(park))) # 计算NDVI并合成 def add_ndvi(img): ndvi img.normalizedDifference([B8, B4]).rename(NDVI) return img.addBands(ndvi) ndvi_coll s2.map(add_ndvi).select(NDVI) median_ndvi ndvi_coll.median() # 区域统计 mean_dict median_ndvi.reduceRegion( reduceree.Reducer.mean(), geometrypark, scale10, maxPixels1e9 ) return mean_dict.getInfo()[NDVI]# 逐年计算years list(range(2019, 2024))ndvi_values []for yr in years: try: val get_annual_ndvi(yr) ndvi_values.append(val) print(f{yr} NDVI均值: {val:.3f}) except Exception as e: print(f{yr} 计算失败: {e}) ndvi_values.append(None)# 可视化plt.figure(figsize(10, 5))plt.plot(years, ndvi_values, o-, colorgreen, linewidth2)plt.title(北京奥林匹克森林公园年均NDVI变化 (2019-2023))plt.xlabel(年份)plt.ylabel(NDVI均值)plt.grid(True, linestyle--, alpha0.7)plt.xticks(years)plt.ylim(0.3, 0.7) # 根据实际情况调整# 添加趋势线import numpy as npvalid [(y, v) for y, v in zip(years, ndvi_values) if v is not None]if len(valid) 2: x [p[0] for p in valid] y [p[1] for p in valid] z np.polyfit(x, y, 1) p np.poly1d(z) plt.plot(x, p(x), r--, alpha0.5, label趋势线) plt.legend()plt.tight_layout()plt.savefig(olympic_park_ndvi_trend.png, dpi300)plt.show()重点说明- 使用geemap.CenterMap可定位到奥林匹克公园未在代码中展示- 通过reduceRegion的scale10匹配Sentinel-2原始分辨率- 异常处理确保单年失败不影响整体流程## 五、结果解读与可视化运行上述代码后我们将获得类似下表的数据示例值| 年份 | 平均NDVI ||------|----------|| 2019 | 0.532 || 2020 | 0.548 || 2021 | 0.561 || 2022 | 0.557 || 2023 | 0.543 |趋势分析- 2019-2021年NDVI呈现上升趋势可能与公园植被成熟及养护提升有关- 2022年略有下降可能与极端高温干旱有关- 2023年继续小幅下降需结合降雨数据分析Python版生成的趋势图如下图所示此处为文字描述实际运行会生成PNG文件。## 六、扩展与调优1.更精确的边界使用OpenStreetMap或高德API获取奥林匹克森林公园实际轮廓。2.时间窗口优化可改为5-10月生长季或逐月分析。3.去云增强使用ee.Algorithms.Landsat.simpleComposite或S2云概率波段。4.多指数对比同时计算EVI、NDWI等指数。## 七、总结本文通过GEE JavaScript和Python双语言实现完整演示了利用Sentinel-2监测北京奥林匹克森林公园年NDVI变化的方法。核心步骤包括1. 定义研究区域并过滤影像2. 计算NDVI并合成年际中值3. 区域统计提取均值4. 结果可视化与趋势分析GEE极大地降低了遥感数据处理门槛而Python版提供了更灵活的可视化和自动化能力。实际应用中建议结合地面观测数据进行验证并注意影像云量滤波和尺度效应对结果的影响。整套代码可直接迁移至其他城市公园或自然保护区为城市生态监测提供数据支撑。