当前位置: 首页 > news >正文

GEEPython-demo1:利用Sentinel-2监测北京奥林匹克森林公园2024年NDVI变化(附Python版)

01 说明

1.1 逻辑和流程

简要流程:

  1. 获取2024年覆盖北京奥林匹克森林公园的所有Sentinel-2影像
  2. 对所有不同时间段的影像分别计算NDVI
  3. 对于同一时间段的影像,取公园内所有像元NDVI值的中位数作为该时间点的NDVI
  4. 将所有时间点的NDVI综合绘制折线图
  5. 地图上展示公园的真彩色Sentinel-2图层和NDVI图层

ps: 提供JS版本和Python版本(在Pycharm中可正常运行, colab未尝试)参考学习,二者逻辑基本保持一致.

1.2 数据集说明

使用的数据集为: Harmonized Sentinel-2 MSl:MultiSpectral Instrument, Level-2A (SR)(SR表示表面反射率即地表反射率, TOA版本为大气层顶反射率<包含大气层的影响>).

使用到的相关波段信息如下:

波段名称描述分辨率比例系数
B2Blue10 meters0.0001
B3Green10 meters0.0001
B4Red10 meters0.0001
B8NIR10meters0.0001

其中,比例系数0.0001与像元DN值相乘即可得到真正的Sentinel-2表面反射率(原始值通过整数存储节省存储,通过0.0001缩放回来)

Sentinel-2中存在属性CLOUDY_PIXEL_PERCENTAGE表示影像的云覆盖率(单位为%)。

02 JS代码

/*
demo1 利用Sentinel-2监测北京奥林匹克森林公园2024年NDVI变化北京奥林匹克森林公园经度: 116.388768°E, 纬度: 39.988588°N
*/// 准备
var start_date = '2024-01-01';
var end_date = '2024-12-31'
var pt = ee.Geometry.Point([116.388768, 39.988588]);  // 定义矢量点
var roi = pt.buffer(2000);  // 2000m缓冲区
var vis_ture_color = {  // 真彩色显示参数bands: ['B4', 'B3', 'B2'],min: 0,max: 1,gamma: 1.6
}
var vis_ndvi = {  // NDVI显示参数bands: 'NDVI',min: 0, max: 1,palette: ['white', 'green', 'yellow']
}// 获取sentinel-2的影像集合
var s2_collection = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterBounds(roi)  // 按空间范围筛选.filterDate(start_date, end_date)  // 按时间范围筛选.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));  // 筛选小于20%云覆盖的影像// 计算NDVI
var add_ndvi = function(img){var ndvi = img.normalizedDifference(['B8', 'B4']).rename('NDVI');  // 计算NDVIreturn img.addBands([ndvi]);  // 返回添加了NDVI波段的img
}
var s2_ndvi = s2_collection.map(add_ndvi).select('NDVI');// 绘制ndvi
var ndvi_chart = ui.Chart.image.series({imageCollection: s2_ndvi,  // 必填region: roi,  // 必填reducer: ee.Reducer.mean(),  // 默认就是该参数, 可不填scale: 30,  // 在30m的分辨率进行reducer(此处即在30m分辨率下进行均值计算), 可不填xProperty: 'system:time_start'  // 默认就是该参数
})
// 为绘制的ndvi添加样式
ndvi_chart.setOptions({title: '2024年北京奥林匹克森林公园NDVI时间序列',vAxis: {title: 'NDVI(平均值)', viewWindow: {min: 0, max: null}},hAxis: {title: '日期', format: 'MM-dd', gridlines: {count: 10}},series:{0: {color: 'green',lineWidth: 1,pointSize: 1.5,pointShape: 'cicrle'}}
})
// 在控制台显示该图表
print(ndvi_chart)// 地图显示
var img_median = s2_collection.median().clip(roi).multiply(0.0001);  // 中位数合成
var ndvi_median = s2_ndvi.median().clip(roi);  // 中位数合成ndvi
Map.centerObject(roi, 14);
Map.addLayer(img_median, vis_ture_color, '真彩色影像 (median)');
Map.addLayer(ndvi_median, vis_ndvi, 'NDVI (median)');

结果展示:

折线图展示
NDVI展示
真彩色图像展示

03 Python代码

#%% md
# demo1 利用Sentinel-2监测北京奥林匹克森林公园2024年NDVI变化北京奥林匹克森林公园经度: 116.388768°E, 纬度: 39.988588°N
#%%
import geemap
import ee
from matplotlib import pyplot as plt
from matplotlib import dates as mdates
import pandas as pd
#%%
# 准备
start_date = '2024-01-01'
end_date = '2024-12-31'
pt = ee.Geometry.Point([116.388768, 39.988588])  # 定义矢量点
roi = pt.buffer(2000)  # 做2000m缓冲区视为北京奥林匹克森林公园区域
#%%
# 获取Sentinel-2影像集合
s2_collection = (ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(start_date, end_date)  # 筛选时间范围.filterBounds(roi)  # 筛选空间范围.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))  # 保留云覆盖率小于20%的影像# .map(lambda img: img.normalizedDifference(['B8', 'B4']).rename('NDVI'))# .select('NDVI'))
#%%
# 计算NDVI
def add_ndvi(img):ndvi = img.normalizedDifference(['B8', 'B4']).rename('NDVI')  # 计算NDVI并修改为波段名称为NDVIreturn img.addBands(ndvi)  # 添加NDVI波段
s2_ndvi = s2_collection.map(add_ndvi).select('NDVI')
#%%
# 获取roi的NDVI均值(中位数)
def extract_roi_ndvi(img):stats = img.reduceRegion(reducer=ee.Reducer.median(),  # 计算的统计量geometry=roi,  # 统计的区域scale=30  # 允许在30m分辨率进行统计而非此处s2的10m分辨率)return ee.Feature(None).set(stats).set('date', img.date().format('YYYY-MM-dd'))s2_ndvi_f = s2_ndvi.map(extract_roi_ndvi)
ndvi_list = [p['properties'] for p in s2_ndvi_f.getInfo()['features']]
ndvi_df = pd.DataFrame(ndvi_list).sort_values('date').set_index('date')
ndvi_df
#%%
# 绘制NDVI折线图
plt.rcParams['font.family'] = ['Times New Roman', 'SimSun']  # 可显示中文(中文宋体-SimSun, 英文新罗马-Times New Roman)
plt.rcParams['axes.unicode_minus'] = False  # 可显示负号fig, ax = plt.subplots(figsize=(12, 6))
ndvi_df.plot(ax=ax,style='-o',color='green',title='2024年北京奥林匹克森林公园NDVI时间序列'
)
# 优化XY轴信息
ax.set_xlabel('日期', size=16)
ax.set_ylabel('NDVI(中位数)', size=16)
ax.grid(True)
ax.set_ylim(0, None)
# 优化X轴日期显示
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
plt.xticks(size=14)plt.tight_layout()  # 自动调整布局(紧凑)
plt.show()
#%%
# 地图Map上显示NDVI和真彩色底图
ndvi_median = s2_ndvi.median().clip(roi)
s2_true_color = s2_collection.median().clip(roi).multiply(0.0001)
Map = geemap.Map()
Map.centerObject(roi, 14)  # roi居中显示
Map.addLayer(ndvi_median, {'min': 0, 'max': 1, 'palette': ['white', 'green', 'yellow']}, 'NDVI (中位数)')
Map.addLayer(s2_true_color, {'bands': ['B4', 'B3', 'B2'], 'min': 0, 'max': 1, 'gamma': 1.6}, 'Sentinel-2 (真彩色)')
#%%
Map

结果展示:

折线图展示

NDVI展示

真彩色图像展示

http://www.lryc.cn/news/623268.html

相关文章:

  • [CSP-J2020] 方格取数
  • Vue组件生命周期钩子:深入理解组件的生命周期阶段
  • Vue 3.5+ Teleport defer 属性详解:解决组件渲染顺序问题的终极方案
  • 【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
  • ESP32-S3_ES8311音频输出使用
  • CSS 核心知识点全解析:从基础到实战应用
  • 探索粒子世界:从基础理论到前沿应用与未来展望
  • 主从复制+哨兵
  • 【论文阅读】Multimodal Graph Contrastive Learning for Multimedia-based Recommendation
  • List容器:特性与操作使用指南
  • 《设计模式》代理模式
  • Java 9 新特性及具体应用
  • 什么是微前端?
  • XC6SLX45T-2FGG484C Xilinx AMD Spartan-6 FPGA
  • 两个简单的设计模式的例子
  • [Linux] Linux文件系统基本管理
  • 没学过音乐怎么写歌?豆包 + 蘑兔
  • Python Condition对象wait方法使用与修复
  • 《设计模式》装饰模式
  • Tello无人机与LLM模型控制 ROS
  • 二十六、Mybatis-XML映射文件
  • 行为型设计模式:对象协作的舞蹈家(中)
  • 从0到1掌握 Spring Security(第三篇):三种认证方式,按配置一键切换
  • RH134 访问网络附加存储知识点
  • 从舒适度提升到能耗降低再到安全保障,楼宇自控作用关键
  • 19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战
  • 立体匹配中的稠密匹配和稀疏匹配
  • RK3568 NPU RKNN(二):RKNN-ToolKit2环境搭建
  • 《MySQL 数据库备份与视图创建全流程:从数据迁移到高效查询实战》
  • MySQL的下载安装(MSI和ZIP版本都有)