GEE 不将数据导入数组
GEE do not import data into array
我在使用 Python API 将数据从 Google Earth Engine 导入本地阵列时遇到问题。
我的代码的简化版本:
import ee
ee.Initialize()
#Load a collection
TERRA = ee.ImageCollection("MODIS/006/MOD09A1").select(['sur_refl_b02', 'sur_refl_b07',"StateQA"])
TERRA = TERRA.filterDate('2003-01-01', '2019-12-31')
#Extract an image
TERRA_list = TERRA.toList(TERRA.size())
Terra_img = ee.Image(TERRA_list.get(1))
#Load as array
Terra_img = Terra.get('sur_refl_b02')
np_arr_b2 = np.array(Terra_img.getInfo())
但是np_arr_b2
好像是空的
有人知道我做错了什么吗?
谢谢!
您似乎想从 earth engine 下载数据,然后将它们与 numpy 一起使用。你在这里做错了两件事:
您正在将 Google Earth Engine 视为下载服务。这不是 Earth Engine 的目的。如果您想下载大量数据(例如一年的 Terra Surface Reflectance),您应该直接从服务提供商处下载。您唯一应该从 Earth Engine 下载的是您在 Earth Engine 中进行的分析的最终结果。
.getInfo
不会为您提供卫星数据,它只会以 JSON 对象的形式为您提供 ImageCollection 的元数据。如果你想要实际的栅格数据,你必须导出它(如 1 中所述,你不应该为这个数据量做)。
你离目标不远了,至少在一定程度上是这样。通过这样的请求可以传输多少像素是有限制的,即 262144。您的图像在覆盖整个地球时(就像您正在做的那样)有 3732480000 - 超过 10000 倍。尽管如此,您还是可以取样一小块区域并放入 numpy:
import ee
import numpy as np
import matplotlib.pyplot as plt
ee.Initialize()
#Load a collection
TERRA = ee.ImageCollection("MODIS/006/MOD09A1").select(['sur_refl_b02', 'sur_refl_b07',"StateQA"])
TERRA = TERRA.filterDate('2003-01-01', '2019-12-31')
#Extract an image
TERRA_list = TERRA.toList(TERRA.size())
Terra_img = ee.Image(TERRA_list.get(1))
img = Terra_img.select('sur_refl_b02')
sample = img.sampleRectangle()
numpy_array = np.array(sample.get('sur_refl_b02').getInfo())
它是波兰弗罗茨瓦夫的一个区域,通过 imshow
传递给 matplotlib 时看起来像这样:
如果你真的需要整张图片怎么办?这就是 Export.image.toDrive
发挥作用的地方。以下是将图像下载到 Google 驱动器的方法:
bbox = img.getInfo()['properties']['system:footprint']['coordinates']
task = ee.batch.Export.image.toDrive(img,
scale=10000,
description='MOD09A1',
fileFormat='GeoTIFF',
region=bbox)
task.start()
任务完成后(您也可以从 Python 进行监控),您可以从云端硬盘下载图像并像访问任何其他 GeoTIFF 一样访问它(参见 this GIS Stack Exchange post).
我在使用 Python API 将数据从 Google Earth Engine 导入本地阵列时遇到问题。
我的代码的简化版本:
import ee
ee.Initialize()
#Load a collection
TERRA = ee.ImageCollection("MODIS/006/MOD09A1").select(['sur_refl_b02', 'sur_refl_b07',"StateQA"])
TERRA = TERRA.filterDate('2003-01-01', '2019-12-31')
#Extract an image
TERRA_list = TERRA.toList(TERRA.size())
Terra_img = ee.Image(TERRA_list.get(1))
#Load as array
Terra_img = Terra.get('sur_refl_b02')
np_arr_b2 = np.array(Terra_img.getInfo())
但是np_arr_b2
好像是空的
有人知道我做错了什么吗?
谢谢!
您似乎想从 earth engine 下载数据,然后将它们与 numpy 一起使用。你在这里做错了两件事:
您正在将 Google Earth Engine 视为下载服务。这不是 Earth Engine 的目的。如果您想下载大量数据(例如一年的 Terra Surface Reflectance),您应该直接从服务提供商处下载。您唯一应该从 Earth Engine 下载的是您在 Earth Engine 中进行的分析的最终结果。
.getInfo
不会为您提供卫星数据,它只会以 JSON 对象的形式为您提供 ImageCollection 的元数据。如果你想要实际的栅格数据,你必须导出它(如 1 中所述,你不应该为这个数据量做)。
你离目标不远了,至少在一定程度上是这样。通过这样的请求可以传输多少像素是有限制的,即 262144。您的图像在覆盖整个地球时(就像您正在做的那样)有 3732480000 - 超过 10000 倍。尽管如此,您还是可以取样一小块区域并放入 numpy:
import ee
import numpy as np
import matplotlib.pyplot as plt
ee.Initialize()
#Load a collection
TERRA = ee.ImageCollection("MODIS/006/MOD09A1").select(['sur_refl_b02', 'sur_refl_b07',"StateQA"])
TERRA = TERRA.filterDate('2003-01-01', '2019-12-31')
#Extract an image
TERRA_list = TERRA.toList(TERRA.size())
Terra_img = ee.Image(TERRA_list.get(1))
img = Terra_img.select('sur_refl_b02')
sample = img.sampleRectangle()
numpy_array = np.array(sample.get('sur_refl_b02').getInfo())
它是波兰弗罗茨瓦夫的一个区域,通过 imshow
传递给 matplotlib 时看起来像这样:
如果你真的需要整张图片怎么办?这就是 Export.image.toDrive
发挥作用的地方。以下是将图像下载到 Google 驱动器的方法:
bbox = img.getInfo()['properties']['system:footprint']['coordinates']
task = ee.batch.Export.image.toDrive(img,
scale=10000,
description='MOD09A1',
fileFormat='GeoTIFF',
region=bbox)
task.start()
任务完成后(您也可以从 Python 进行监控),您可以从云端硬盘下载图像并像访问任何其他 GeoTIFF 一样访问它(参见 this GIS Stack Exchange post).