干货满满!GEE与Python结合:本地分区下载哨兵二号影像的步骤详解与实用技巧
目录
1.确保你已经配置好了环境 成功引入geemap包,不然一切都白搭。
2.确保你的 jsonPath 和 output 路径正确,不然会报错。脚本会自动处理每个分区并下载对应的无云影像。
01写在前面
在遥感数据处理中,哨兵二号影像以其高分辨率和多光谱数据广受欢迎。然而,快速下载大面积的无云影像一直是个挑战。GEE因提供了强大的云计算平台,使得处理大规模的遥感数据变得高效快捷。再结合Python,我们可以编写灵活的脚本来自动化下载过程,提高工作效率。现在也已有不少GEE代码能下载到研究区的影像。
但是,当前通过Google Earth Engine(GEE)下载影像通常需要依赖Google Drive,这在下载速度和灵活性上存在诸多限制。不少小伙伴都应该有下载到一半时提示你空间不够。
此外,如果你需要下载不同区域的影像,现有代码也很少提供分区域下载的解决方案。本文将基于此分享如何用GEE和Python实现本地分区下载无云的哨兵二号影像的代码。(附关键代码)
02环境配置
首先,确保你可以科学上网,已有GEE账号以及搭建了Python的本地环境(下载Python 和Anaconda)。这里推荐吴秋生老师的Geemap包。详细介绍可以参考他的geemap官网。具体配置安装过程,我这里就先不赘述了,如果有问题,可以后台私信我。 吴秋生Geemaphttps://www.easyscholar.cc/
03具体代码及解释
-
导入必要的包:
import ee
import geemap
import os
-
输入矢量数据及输出影像
jsonPath = "./geedownload/extent.geojson"
output = "./geedownload/out"
start = "2020-01-01"
end = "2020-12-30"
-
去云
def maskS2clouds(image):
qa = image.select('QA60')
# 位 10 和 11 是云,我们要把它们掩膜掉
cloudBitMask = 1 << 10
cirrusBitMask = 1 << 11
# 这两个标志都应该设置为0,表示无云
mask = qa.bitwiseAnd(cloudBitMask).eq(0) \
.And(qa.bitwiseAnd(cirrusBitMask).eq(0))
# 哨兵的像元值是反射率的10000倍,要除以10000
return image.updateMask(mask).divide(10000)
-
哨兵二号影像
s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
-
分区下载
def splitDownload(jsonPath, output, start, end):
ee.Initialize()
s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
featureCol = geemap.geojson_to_ee(jsonPath)
mylist = featureCol.toList(featureCol.size())
infos = mylist.getInfo()
for index, info in enumerate(infos):
print(f'开始第{index+1}个')
geom = info["geometry"]
imgcol = s2.filterDate(start, end)\
.filterBounds(geom)\
.map(maskS2clouds)\
.select("B[1-8]")
img = imgcol.median().clip(geom)
geemap.download_ee_image(
image=img,
filename=os.path.join(output,"FID_"+str(index)+".tif"),
region=geom,
crs='EPSG:4326',
scale=10
)
Tips:“splitDownload” 根据GeoJSON文件中的每个区域进行裁剪并下载无云影像。影像在下载前被裁剪和掩膜处理,确保最终的影像无云。
-
运行结果
将上述脚本保存为 download_sentinel2.py,在命令行中运行,等待几分钟就可以,速度根据研究区大小和数量决定。
运行脚本后,检查 output 文件夹,应该可以看到以 FID_ 开头的 .tif 文件。这些就是成功下载的哨兵二号影像。
在ArcGIS打开,可以看到效果相当可以
04相关问题
1.确保你已经配置好了环境 成功引入geemap包,不然一切都白搭。
2.确保你的 jsonPath 和 output 路径正确,不然会报错。脚本会自动处理每个分区并下载对应的无云影像。
相比通过Google Drive下载,此代码代码简单明了,即使是零基础用户也能快速上手。它不仅能直接下载到本地大大提高下载速度,还可以根据GeoJSON文件分区下载影像,灵活处理不同区域的数据需求。节省大量手动操作时间。
作品原创,创作不易,仅供学习和交流,未经授权禁止转载。