飞道的博客

Google Earth Engine导出大影像时下载失败的一种解决方法

1085人阅读  评论(0)

Google Earth Engine导出大影像时下载失败

  • 最近用gee导出了一些影像到drive云盘中,虽然不是很大,只有两百M左右,但是使用backup and sync同步软件来下载的时候却一直失败,不停的重试。
  • 同步软件不支持断点续传,一旦因为某原因中断,又要从头开始,感到十分的无奈
  • 经过多次教训,发现下载50M以内的小文件是没有问题的,因此考虑导出数据的时候使用分块来解决,最后下载这些小块再拼接起来。

分块下载的方法

  • 使用 Export.image.toDrive(image, description, folder, fileNamePrefix, dimensions, region, scale, crs, crsTransform, maxPixels, shardSize, fileDimensions, skipEmptyTiles, fileFormat, formatOptions)函数的时候,可以设置fileDimensions的大小,即分块的行列数,只输入一个数的话就是正方形的分块,分块的大小必须是shardSize的倍数,shadSize如果不指定的话默认是256,一般将分块大小设置为256的倍数。
  • 例如
Export.image.toDrive({
  image: img,
  description: 'test',
  folder:'test',
  scale: 30,
  region:geometry,
  fileDimensions:2560,
  maxPixels:1e13
});
  • 导出后的图片比较小了,然后再使用backup and sync同步下载就很快。

图像拼接

  • 如果导出多个文件,手动拼接会比较费劲,使用Python来拼接,方便快捷,需要安装gdal库。
  • 主要通过gdal自带的gdal_merge.py完成拼接。如果找不到的话,这里有下载地址,https://pan.baidu.com/s/1KzQmdT1_804SEdq1x5biFg 提取码:uq4l
  • 拼接的代码如下,将gdal_merge.py和下面的脚步放在同一个文件夹下,并修改下面脚步的两个路径即可,会自动根据分块影像的前缀拼成一个影像。
"""
对GEE下载的分块影像进行拼接
gdal_merge.py需放在本文件同级目录下,gdal_merge.py为gdal自带
需要安装gdal
"""
import os

# 分块影像所在文件夹,不能有中文
tifDir = r"E:\googledrive\hhh"
# 输出的文件夹,不能有中文,如果文件夹不存在则会被创建
outPath = r"E:\googledrive\hhh_merge"

# ----------------只需修改上面两个参数--------------------
# 当前脚本所在的目录,用于找gdal_merge文件
currentPath = os.path.dirname(os.path.abspath(__file__))

# 输出目录不存在则创建
if not os.path.exists(outPath):
    os.makedirs(outPath)

# 列出输入文件夹的tif文件
tifs = [i for i in os.listdir(tifDir) if i.endswith(".tif")]

# 获取目标文件数量,前缀相同的
# 分块的文件名的长度相同,将分块编号去掉
targetFile = set()
for i in tifs:
    targetFile.add(i[:-26]+i[-4:])
print("拼接后应该有 %s 个文件" % len(targetFile))

# 切换工作空间,到影像的路径
os.chdir(tifDir)
# 一个一个的执行拼接
for i in targetFile:
    # 拼接后的文件名对应的分块文件名列表
    sliceFileList = []
    for k in tifs:
        if k[:-26] == i[:-4]:
            sliceFileList.append(k)

    # 执行影像拼接
    outtif = os.path.join(outPath,i)  # 输出tif路径,使用绝对路径
    if os.path.exists(outtif):   # 如果输出路径存在则跳过
        print("%s already exists, will be ignored."%outtif)
        continue
    os.system("python %s -init %s  -o %s %s" % (
        os.path.join(currentPath,"gdal_merge.py"),0,  outtif, " ".join(sliceFileList)))

    print("%s -------- merge success"%outtif)

转载:https://blog.csdn.net/weixin_40450867/article/details/104578379
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场