跳转至

基于 LT-GEE 的武汉市森林扰动地图制作

参考

  1. 吴秋生教授主页
  2. GEEMAP 官网
  3. LT-GEE 官网

1 实验目的

  本次实验,意在借助 GEE 平台的数据源及其 API 实现以武汉市为边界的 1985年 ~ 2022年的植被损失图绘制。

2 相关技术

2.1 GEE 介绍

2.1.1 GEE 官网

  Google Earth Engine (以下均用 GEE 代替),谷歌地球引擎,是用于地球科学数据和分析的行星级平台,由 Google 的云基础架构提供支持。

  GEE 将卫星图像和地理空间数据集的多 PB 目录与行星尺度分析功能相结合。科学家、研究人员和开发人员可以使用 GEE 来检测变化、绘制趋势图并量化地球表面的差异。

image-20221230151127200

图 2-1 GEE 官网

2.1.2 GEE API

  GEE 提供 API 和其他工具来支持分析大型数据集。其中,GEE API 分为 Python 和 JavaScript 两类,可以利用 Google 云的强大功能进行自己的地理空间分析。下图 2-2 为 GEE 的 JavaScript API 在线编辑器。

image-20221230151217343

图 2-2 GEE 在线编辑器

2.2 Geemap

2.2.1 Geemap 简介

  Geemap 是用于与 GEE、ipyleaflet 和 ipywidgets 进行交互式映射的 Python 包。

  由于 GEE Python API 具有相对较少的文档和有限的交互式可视化结果功能。Geemap Python 包就是为了填补这个空白而创建的。它建立在 ipyleaflet 和 ipywidgets 之上,使用户能够在基于 Jupyter 的环境中以交互方式分析和可视化 Earth Engine 数据集。

image-20221230151547556

图 2-3 Geemap 官网

2.2.2 为什么要使用 GEE Python API 与 Geemap

  通过 Geemap 我们将能够实现,在借助 GEE 平台的海量数据以及云端算力的同时,还不会受制于有限的云端存储空间。

  经过对比使用发现,同样的操作在两个 API 中,GEE Python API 计算速度明显要快于 GEE JavaScript API。

  与此同时,Geemap 还可以直接调用本地数据,也可以直接调用空间数据库中存储的空间数据,灵活性比之 GEE JavaScript API 要高很多。

  本次作业将使用 Geemap 实现具体的算法操作。

2.3 LT-GEE

  LT-GEE 是一个基于 GEE 平台的 LandTrendr 光谱-时间分割算法。

  LandTrendr(以下均用 LT 代替)是一组光谱时间分割算法,可用于中等分辨率卫星图像(主要是 Landsat)时间序列中的变化检测,以及生成基本不含年际信号噪声的基于轨迹的光谱时间序列数据。

image-20221230151706118

图 2-4 LT-GEE 官网

2.4 小结

  本章(第二章)大致介绍了本次作业所使用到的相关技术,GEE、Geemap 以及 LT-GEE。

3 配置开发环境

3.1 创建并激活虚拟环境

  在命令行中逐行键入内容,创建一个名为 rs02 的新 conda 环境,接下来的一系列操作都将在此环境中进行。

创建虚拟环境

1
conda create -n rs02 python=3.9 -y

激活虚拟环境

1
conda activate rs02

3.2 使用 mamba 配置环境

  mamba 是一个快速、健壮、跨平台的包管理器。它运行在 Windows、macOS 和 Linux 上,完全兼容 conda 包,支持 conda 的大部分命令。可以通过 mamba 来配置安装 geemap 所依赖的复杂环境。

conda 安装 mamba

1
conda install -c conda-forge mamba -y

mamba 安装 pygis

1
mamba install -c conda-forge pygis geemap

image-20221230124019133

图 3-1 mamba 批量安装包

3.3 安装 OEEL 库

  Open Earth Engine Library(OEEL),开放地球引擎库是一个基于 GEE 的代码辅助的集合库。

  由于 GEE Python API 的相关文档较少,多数文档和 API 均基于 JavaScript API 进行设计与开发的,所以我们有时会需要借助 OEEL 库在 Python 中实现对 JS 脚本的调用。

安装 OEEL 库最新版

1
pip install oeel --upgrade

3.4 JupyterLab 桌面版

  在进行上述环境配置时,jupyterlab 会一并安装在虚拟环境中,所以我们可以直接安装 JupyterLab 桌面版并选择当前虚拟环境的 python.exe ,即可正常运行JupyterLab 桌面版。后续的编程操作都将在这里进行,操作界面如下图 3-2 所示。

image-20221230152222155

图 3-2 工作环境

3.5 小结

  本章(第三章)介绍了本次作业的开发环境配置。

4 Geemap 的简单使用

4.1 起手配置

  在每次使用 Geemap 时,都需要进行以下操作,导入需求包并初始化。

导入需求包

1
2
import ee
import geemap

在 VPN 中使用 geemap

1
geemap.set_proxy(port="7890")

geemap 初始化

1
geemap.ee_initialize()

4.2 显示武汉市地图

  对于矢量数据,GEE 与 Geemap 都有多种调用方法,这里仅列举了三种,同时也借助武汉市矢量数据的显示,来检查 Geemap 是否正常使用:

  1. ee.FeatureCollection():调用 GEE 云端用户已上传的矢量数据
  2. geemap.shp_to_ee():Geemap 直接调用本地的 *.shp 数据
  3. geemap.geojson_to_ee():Geemap 直接调用本地的 *.json 格式数据
1
2
3
4
5
6
7
# wh = ee.FeatureCollection("users/vivianwei/Wuhan")
# wh = geemap.shp_to_ee("E:/geeDownloads/shp/wuhan.shp")
wh = geemap.geojson_to_ee("E:/Downloads/wuhan.json")
Map = geemap.Map()
Map.addLayer(wh, {}, 'wuhan')
Map.centerObject(wh, 9)
Map

4.3 小结

  本章(第四章)对 Geemap 进行了一些简单使用,完成了对武汉市的矢量地图的加载与显示。

5 代码实现

5.1 定义影像集参数

1
2
3
4
5
6
7
startYear = 1985
endYear = 2022
startDay = '06-20'
endDay = '09-01'
aoi = wh
index = 'NBR'
maskThese = ['cloud', 'shadow', 'snow', 'water']

5.2 运行 LandTrendr

加载 LT-GEE API

1
2
url = 'https://github.com/eMapR/LT-GEE/blob/master/LandTrendr.js'
ltgee = geemap.requireJS(url)

image-20221230165054511

图 5-1 加载 LT-GEE API

定义 landtrendr 参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
runParams = {
    'maxSegments':            6,
    'spikeThreshold':         0.9,
    'vertexCountOvershoot':   3,
    'preventOneYearRecovery': True,
    'recoveryThreshold':      0.25,
    'pvalThreshold':          0.05,
    'bestModelProportion':    0.75,
    'minObservationsNeeded':  6
}

定义变化参数

1
2
3
4
5
6
7
8
9
changeParams = {
    'delta':  'loss',
    'sort':   'greatest',
    'year':   {'checked':True, 'start':1986, 'end':2019},
    'mag':    {'checked':True, 'value':200, 'operator':'>'},
    'dur':    {'checked':True, 'value':4, 'operator':'<'},
    'preval': {'checked':True, 'value':300, 'operator':'>'},
    'mmu':    {'checked':True, 'value':11},
}

为变化参数字典添加指数 NBR

1
changeParams['index'] = index

运行 landtrendr

1
lt = ltgee.runLT(startYear, endYear, startDay, endDay, aoi, index, [], runParams, maskThese)

得到变化地图图层

1
changeImg = ltgee.getChangeMap(lt, changeParams)

5.3 地图可视化配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
palette = ['#9400D3', '#4B0082', '#0000FF', '#00FF00', '#FFFF00', '#FF7F00', '#FF0000']
yodVizParms = {
    'min': startYear,
    'max': endYear,
    'palette': palette
}
magVizParms = {
    'min': 200,
    'max': 800,
    'palette': palette
}

5.4 将扰动图可视化

以武汉市为地图缩放中心

1
2
Map = geemap.Map()
Map.centerObject(aoi, 9)

武汉市矢量边界显示配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 设置显示样式: color代表边界颜色, fillcolor代表填充颜色, width边界宽度
styling = {
    'color': 'blue',
    # 填充颜色用不了
    # 'fillColor': '#ffffff',
    'width': 2
}
# 添加武汉市矢量边界图层
Map.addLayer(aoi, vis_params=styling, name="武汉市", opacity=0.2)
Map

以武汉市为边界切割变化图像

1
exportImg = changeImg.clip(wh)

添加并显示切割后的扰动图层

1
2
3
Map.addLayer(exportImg.select(['mag']), magVizParms, '变化幅度')
Map.addLayer(exportImg.select(['yod']), yodVizParms, '年份观测')
Map

image-20221230164924926

图 5-2 在 google colaboratory 中查看运行结果

5.5 下载生成扰动地图

1
2
3
4
5
geemap.download_ee_image(
    exportImg,
    "E:/geeDownloads/img/lt-gee_disturbance_map.tif",
    scale=30
)

5.6 小结

  本章(第五章)实现了 landtrendr 算法,同时绘制了最大植被损失部分并显示了变化检测的年份和变化的幅度,最终导出了计算结果数据。

6 在 QGIS 中查看成果

  在 QGIS 中打开下载的数据,如下图 6-1 所示。

image-20221230155608445

图 6-1 查看扰动地图

7 实验总结

  本次实验,使用 Geemap 调用 GEE Python API 实现了 LandTrendr 算法,并以武汉市为边界绘制出了植被损失图,实现了本地数据 + GEE 平台云端数据 + GEE 算力 + 结果导出到本地的全流程操作,进一步熟悉了 GEE 平台的使用技巧和遥感实验的操作流程。


最后更新: 2023-06-20
创建日期: 2022-12-27
作者: gis-xh