本项目提供了一种高效的基于Google Earth Engine (GEE) 的解决方案,用于从Landsat和Sentinel-2影像中映射水体面积的时序数据。
尽管市场上已有多种水体解析工具,但EOWater具有以下显著优势:
灵活性:允许用户输入自定义的多边形区域。 成本效益:完全基于栅格图像操作,显著降低了云计算成本,避免了处理包含大量顶点的矢量数据所带来的高计算开销。 云层遮罩:使用先进的云层遮罩算法(s2cloudless),最大化提取的时序数据的时间深度。 实时监控:可以在GEE/GCP环境中设置近乎实时的监控工作流,几乎不产生费用(配合Cloud Run函数和Cloud Scheduler使用)。
项目地址
https://github.com/ShiruiH/EOWater
目录
安装 使用
创建多边形遮罩 将遮罩上传到GEE资产 在代码编辑器中运行GEE脚本 后处理水体面积数据
安装
要使用此工具,您需要访问Google Earth Engine (GEE) 项目。可以在https://signup.earthengine.google.com/上创建一个账户。然后前往https://cloud.google.com/sdk/docs/install 安装gcloud CLI
。安装后,它会自动启动并让您用GEE账户(或个人Gmail)进行认证。
安装Python环境时,请先安装Anaconda (https://www.anaconda.com/download/)。然后打开Anaconda Prompt,输入以下命令:
conda create -n eowater
conda activate eowater
conda install -c conda-forge geopandas -y
conda install -c conda-forge earthengine-api scikit-image rasterio matplotlib notebook folium -y
接着输入jupyter lab
,并导航到该库中的notebooks。
使用
1. 下载Sentinel-2和Landsat原始图像
有两种下载选项:
选项 #1:从USGS Earth Explorer下载场景
访问USGS Earth Explorer,下载所需的Sentinel-2和/或Landsat图像,覆盖您的感兴趣区域。
选项 #2:使用EE代码编辑器下载场景
使用EE代码编辑器下载所需的Sentinel-2和/或Landsat图像。使用
Download_original_tiles_S2.js
和Download_original_tiles_Landsat.js
,并指定变量tile_list
。
2. 创建多边形遮罩
01_Create_polygon_mask.ipynb
(https://github.com/ShiruiH/EOWater/blob/main/01_Create_polygon_mask.ipynb): 该notebook用于生成Landsat和Sentinel-2图像的多边形遮罩。提供了一个NSW北部流域的示例输入多边形边界waterbodies_boundaries.geojson
(https://github.com/ShiruiH/EOWater/blob/main/inputs/waterbodies_boundaries.geojson)),由NRAR提供。
该脚本的输入是从步骤1
(https://github.com/ShiruiH/EOWater/blob/main/README.md#1-download-sentinel-2-and-landsat-original-tiles)下载的Sentinel-2和Landsat图像。脚本将为每个图像创建一个.tif
文件,其中每个多边形分配一个不同的值,使得处理过程可以在栅格级别区分它们。
3. 将遮罩上传到GEE资产
上传生成的多边形遮罩到GEE资产中,有两种方法,适用于不同的使用场景。
选项 #1 手动过程
访问 https://code.earthengine.google.com/
,登录并选择您的云项目(例如nsw-dpe-gee-tst
)。点击 NEW > GeoTIFF Image Upload
,选择您在/outputs中的文件(例如,outputs/Sentinel2_tiles_mask/T55JGH_20231213T001111_B02.tif
)。上传完成后,点击资产,进行编辑并在PROPERTIES标签下添加属性,添加名为Tile的属性,值为55JGH(或不同的tile名称)。该属性将在后续步骤中使用。 对Landsat图像重复上述步骤,但需要添加两个属性,PATH和ROW,并设置其相应值(例如tile 090081)。 上传所有单个图像后,点击 NEW > Image Collection,为Sentinel-2和Landsat分别创建一个图像集合(分别命名为 Base_Sentinel2_tiles
和Base_Landsat_tiles
)。将所有单个图像拖放到相应的图像集合中(Sentinel-2或Landsat)。
选项 #2 自动化过程
安装Earth Engine Python客户端。 使用 03_Upload_bucket_to_EE_asset.ipynb
(https://github.com/ShiruiH/EOWater/blob/main/03_Upload_bucket_to_EE_asset.ipynb)创建图像集合Base_Sentinel2_tiles
和/或Base_Landsat_tiles
,并将多边形遮罩导入图像集合中。安装 gcloud
(https://cloud.google.com/sdk/docs/install) CLI。使用 02_Upload_polygon_mask_to_bucket.ipynb
(https://github.com/ShiruiH/EOWater/blob/main/02_Upload_polygon_mask_to_bucket.ipynb)将多边形遮罩上传到Google Cloud Bucket。
将多边形遮罩上传到Google Cloud Storage (GCS) Bucket。 使用 Image Manifest Upload
(https://developers.google.com/earth-engine/guides/image_manifest)将多边形遮罩从Buckets导入到GEE资产中。
4. 在代码编辑器中运行GEE脚本
GEE脚本存放在GEE_scripts文件夹中,可以将其复制到GEE代码编辑器中运行。脚本将输出每个多边形的水体面积时序的CSV文件。可用的脚本有:
WSA_monitoring_S2.js
(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_S2.js):映射Sentinel-2图像上的水体面积。WSA_monitoring_L9.js
(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L9.js):映射Landsat 9图像上的水体面积。WSA_monitoring_L8.js
(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L8.js):映射Landsat 8图像上的水体面积。WSA_monitoring_L7.js
(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L7.js):映射Landsat 7图像上的水体面积。WSA_monitoring_L5.js
( https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L5.js):映射Landsat 5图像上的水体面积。
5. 后处理水体面积数据
脚本输出的CSV文件需进一步处理,以下是示例步骤:
导入Python环境: import pandas as pd
读取CSV文件: df = pd.read_csv("path_to_your_csv_file.csv")
处理数据(计算总水体面积等): total_water_area = df['water_area'].sum()
欢迎交流
笔者长期从事人工智能、遥感、大模型等业务
欢迎添加微信交流