gpt4 book ai didi

python - 为什么在通过服务帐户进行身份验证的 Python 中使用 Google 地球引擎时,导出到云端硬盘的内容为空?

转载 作者:行者123 更新时间:2023-12-05 04:31:31 24 4
gpt4 key购买 nike

我在 Python 中使用 Google 地球引擎来获取 Sentinel-2 合成并将其下载到我的谷歌驱动器。进行手动身份验证时一切正常:

ee.Authenticate()
ee.Initialize()

但是,由于我想在工作流程中使用我的代码,而不是一直使用手动身份验证,所以我使用的是服务帐户,如 here 所述.它工作正常,我可以在不手动执行任何操作的情况下使用 GEE:

# get service account
service_account = 'test@test.iam.gserviceaccount.com'

# get credentials
credentials = ee.ServiceAccountCredentials(service_account, gee_secret.json)

ee.Initialize(credentials)

为了将我的文件导出到 Google 云端硬盘,我使用了以下代码:

# export options
export_config = {
'scale':10,
'region':aoi, #aoi is a polygon
'crs': 'EPSG:3031',
}
file_name = "test"

# export to drive
task = ee.Batch.Export.iamge.toDrive(image, file_name, **export_config)
task.start()

使用这两种身份验证方法,此任务已成功完成(任务状态为“已完成”)。但是,只有在使用手动身份验证时,我才能在我的云端硬盘中看到我导出的图像。使用自动身份验证时,我的驱动器是空的。

其他人已经问过类似的问题here .这里一个可能的想法是图像文件被导出到服务帐户的 Google Drive 而不是我个人的 Google Drive。但是,我不确定如何访问这个其他驱动器。

有没有人知道如何解决这个问题(=如何访问导出的文件?)。或者有另一种自动身份验证解决方案,其中文件将位于我的个人 Google Drive 中?

最佳答案

非常感谢 DaImTo 和 Yancy Godoy 的提示!有了这些,我可以找到解决方案。我会把它张贴在这里,这样它也可能对其他人有用。

的确,导出到 Google Drive 的工作非常完美,但是它没有导出到我个人的 Google Drive,而是导出到服务帐户的 Google Drive。因此,为我的服务帐户添加对 Google 云端硬盘的访问权限非常重要(请参阅 here)。

在下文中您可以找到完整的工作流程。对于下载,我使用 PyDrive

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from oauth2client.service_account import ServiceAccountCredentials

# this file contains the E-mail adress of the service account
with open(key_path + '/service_worker_mail.txt', 'r') as file:
service_account_file = file.read().replace('\n', '')

# get the credentials
credentials = ee.ServiceAccountCredentials(service_account_file, key_path + "/" + "gee_secret.json")

# authenticate and initialize Google Earth Engine
ee.Initialize(credentials)

# The following operations of Google Earth Engine, including the Export to the Drive
# ...
# ...
# ...

# authenticate to Google Drive (of the Service account)
gauth = GoogleAuth()
scopes = ['https://www.googleapis.com/auth/drive']
gauth.credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path + "/" + "gee_secret.json", scopes=scopes)

drive = GoogleDrive(gauth)

# get list of files
file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList()
for file in file_list:

filename = file['title']

# download file into working directory (in this case a tiff-file)
file.GetContentFile(filename, mimetype="image/tiff")

# delete file afterwards to keep the Drive empty
file1.Delete()


关于python - 为什么在通过服务帐户进行身份验证的 Python 中使用 Google 地球引擎时,导出到云端硬盘的内容为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71834208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com