创建地球系统数据立方体ESDCs的简单方法
简介
地球系统数据立方体(Earth System Data Cubes,简称ESDCs),是一种组织和处理地球科学数据的方法,它将多维数据集整合成一个统一的、多维的“立方体”结构,方便用户进行分析和可视化。
今天我介绍一个python包,不用你再去下载数据本地处理了,而是可以通过几行代码从MPC(微软的遥感云计算平台)拉取数据,创建时间序列遥感数据的ESDCs。
详细步骤
(1)安装环境
这里建议不要使用pip,而是全程直接使用conda创建一个全新python环境,并安装包。
首先使用conda安装环境,首先创建一个python3.9的环境:
conda create --name cuboimage python=3.9
然后安装包cubo:
conda install cubo
安装绘图包:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
如果想用jupyter,可以再安装一下jupyter包,也可以直接用pycharm或者vs code等开发工具,就不用安装了。
conda install -c conda-forge notebook
终端输入jupyter notebook进入开发环境。
(2)创建遥感的时空数据立方体
cubo也支持Google earth engine以及GEE自己选中的数据集(可过滤云),但是我考虑到大部分人不用梯子,这里用可国内直连的MPC数据进行展示,gee可以读者自己探索一下。
使用cubo包在本地电脑环境从微软行星计算平台获取数据(不需要登陆),并创建遥感的时空数据立方体,输入代码:
# 导入 cubo 库
import cubo
# 导入 xarray 库并命名为 xr
import xarray as xr
import os
# 使用 cubo 创建一个数据数组
da = cubo.create(
lat=39.9, # 立方体中心的纬度
lon=116.3, # 立方体中心的经度
collection="sentinel-2-l2a", # STAC 集合的名称
bands=["B02", "B03", "B04"], # 需要检索的波段
start_date="2024-01-01", # 立方体的起始日期
end_date="2024-01-29", # 立方体的结束日期
edge_size=64, # 立方体的图像大小(像素)
resolution=10, # 立方体的像素大小(米)
)
# 可视化立方体中的每一个张影像
(da.sel(band=["B04","B03","B02"])/2000).clip(0,1).plot.imshow(col="time",col_wrap = 5)
如果你想把图片保存到本地,可以使用plt保存图片:
# 导入 cubo 库
import cubo
# 导入 xarray 库并命名为 xr
import xarray as xr
import matplotlib.pyplot as plt
import os
# 设置代理服务器
# os.environ['HTTP_PROXY'] = 'http://localhost:7890'
# os.environ['HTTPS_PROXY'] = 'https://localhost:7890'
# 使用 cubo 创建一个数据数组
da = cubo.create(
lat=39.9, # 立方体中心的纬度
lon=116.3, # 立方体中心的经度
collection="sentinel-2-l2a", # STAC 集合的名称
bands=["B02", "B03", "B04"], # 需要检索的波段
start_date="2024-01-01", # 立方体的起始日期
end_date="2024-01-29", # 立方体的结束日期
edge_size=64, # 立方体的图像大小(像素)
resolution=10, # 立方体的像素大小(米)
)
# 可视化立方体中的每一个张影像
# (da.sel(band=["B04","B03","B02"])/2000).clip(0,1).plot.imshow(col="time",col_wrap = 5)
# 可视化并保存立方体中的每一个张影像
import matplotlib.pyplot as plt
# 选择波段
images = da.sel(band=["B04", "B03", "B02"])
# 归一化
images = (images / 2000).clip(0, 1)
# 设置图片的列数
col_wrap = 5
# 获取时间点的数量
time_points = images.sizes['time']
# 为每个时间点绘制并保存图片
for i in range(time_points):
# 选择时间点
img = images.isel(time=i)
# 绘图
plt.figure(figsize=(10, 4))
img.plot.imshow()
# 保存图片
plt.savefig(f'image_{i+1}.png')
# 关闭图形,避免重复输出到屏幕上
plt.close()
使用plt就能把图片保存到本地了。图像中有几张是有云的,所以是白色,你也可以用gee筛选掉云量大的影像,效果会好一些。
这里展示的遥感数据也可以用tif保存,但是一个tif只能保存一个时期的影像,对于多个时期多个波段的影像来说,直接用数组或者说地球系统数据立方体ESDCs进行统计分析更方便一点。
其他
(1)本文使用cubo包引入微软行星计算MPC的数据创建一个遥感时空数据立方体的ESDCs,基于这个数组,可进行一系列的后续分析。当然,你也可以用GEE,只是需要设置一下科学上网。
(2)我感觉这个包比较便利的地方在于:通过输入一个坐标就会输出该范围的长时间序列的遥感时空数据的立方体,不需要再去下载原始影像数据本地处理,对于时空分析和深度学习来说比较友好。
参考
cubo包的python仓库.https://pypi.org/project/cubo/
google earth engine.https://code.earthengine.google.com/
微软行星计算平台.https://planetarycomputer.microsoft.com/