EOWater: 开源高效的水体面积遥感计算工具,基于Sentinel-2和Landsat数据

科技   2024-09-23 09:16   新加坡  

本项目提供了一种高效的基于Google Earth Engine (GEE) 的解决方案,用于从Landsat和Sentinel-2影像中映射水体面积的时序数据。

尽管市场上已有多种水体解析工具,但EOWater具有以下显著优势:

  • 灵活性:允许用户输入自定义的多边形区域。
  • 成本效益:完全基于栅格图像操作,显著降低了云计算成本,避免了处理包含大量顶点的矢量数据所带来的高计算开销。
  • 云层遮罩:使用先进的云层遮罩算法(s2cloudless),最大化提取的时序数据的时间深度。
  • 实时监控:可以在GEE/GCP环境中设置近乎实时的监控工作流,几乎不产生费用(配合Cloud Run函数和Cloud Scheduler使用)。
时间序列示例

项目地址

https://github.com/ShiruiH/EOWater

目录

  1. 安装
  2. 使用
  • 创建多边形遮罩
  • 将遮罩上传到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.jsDownload_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 手动过程

  1. 访问https://code.earthengine.google.com/,登录并选择您的云项目(例如nsw-dpe-gee-tst)。
  2. 点击 NEW > GeoTIFF Image Upload,选择您在/outputs中的文件(例如,outputs/Sentinel2_tiles_mask/T55JGH_20231213T001111_B02.tif)。
  3. 上传完成后,点击资产,进行编辑并在PROPERTIES标签下添加属性,添加名为Tile的属性,值为55JGH(或不同的tile名称)。该属性将在后续步骤中使用。
  4. 对Landsat图像重复上述步骤,但需要添加两个属性,PATH和ROW,并设置其相应值(例如tile 090081)。
  5. 上传所有单个图像后,点击 NEW > Image Collection,为Sentinel-2和Landsat分别创建一个图像集合(分别命名为Base_Sentinel2_tilesBase_Landsat_tiles)。
  6. 将所有单个图像拖放到相应的图像集合中(Sentinel-2或Landsat)。
GEE上传步骤
  • 选项 #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。
  1. 将多边形遮罩上传到Google Cloud Storage (GCS) Bucket。
  2. 使用Image Manifest Upload(https://developers.google.com/earth-engine/guides/image_manifest)将多边形遮罩从Buckets导入到GEE资产中。
GEE上传步骤

4. 在代码编辑器中运行GEE脚本

GEE脚本存放在GEE_scripts文件夹中,可以将其复制到GEE代码编辑器中运行。脚本将输出每个多边形的水体面积时序的CSV文件。可用的脚本有:

  1. WSA_monitoring_S2.js(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_S2.js):映射Sentinel-2图像上的水体面积。
  2. WSA_monitoring_L9.js(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L9.js):映射Landsat 9图像上的水体面积。
  3. WSA_monitoring_L8.js(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L8.js):映射Landsat 8图像上的水体面积。
  4. WSA_monitoring_L7.js(https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L7.js):映射Landsat 7图像上的水体面积。
  5. WSA_monitoring_L5.js( https://github.com/ShiruiH/EOWater/blob/main/GEE_scripts/WSA_monitoring_L5.js):映射Landsat 5图像上的水体面积。

5. 后处理水体面积数据

脚本输出的CSV文件需进一步处理,以下是示例步骤:

  1. 导入Python环境:
    import pandas as pd
  2. 读取CSV文件:
    df = pd.read_csv("path_to_your_csv_file.csv")
  3. 处理数据(计算总水体面积等):
    total_water_area = df['water_area'].sum()


欢迎交流

笔者长期从事人工智能、遥感、大模型等业务

欢迎添加微信交流

空天感知
专注商业航天、人工智能、气象水文等交叉学科,精选行业资讯,深耕AI业务落地
 最新文章