Проблемы с загрузкой Google Earth Engine, это вызвано неизменными объектами на стороне сервера? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть функция, которая загружает коллекцию изображений в виде TFrecord или geotiff.

Вот функция -

def download_image_collection_to_drive(collection, aois, bands, limit, export_format):
    if collection.size().lt(ee.Number(limit)):
        bands = [band for band in bands if band not in ['SCL', 'QA60']]
        for aoi in aois:
            cluster = aoi.get('cluster').getInfo()
            geom = aoi.bounds().getInfo()['geometry']['coordinates']
            aoi_collection = collection.filterMetadata('cluster', 'equals', cluster)

            for ts in range(1, 11):
                print(ts)
                ts_collection = aoi_collection.filterMetadata('interval', 'equals', ts)
                if ts_collection.size().eq(ee.Number(1)):
                    image = ts_collection.first()
                    p_id = image.get("PRODUCT_ID").getInfo()
                    description = f'{cluster}_{ts}_{p_id}'
                    task_config = {
                        'fileFormat': export_format,
                        'image': image.select(bands),
                        'region': geom,
                        'description': description,
                        'scale': 10,
                        'folder': 'output'
                    }
                    if export_format == 'TFRecord':
                        task_config['formatOptions'] = {'patchDimensions': [256, 256], 'kernelSize': [3, 3]}
                    task = ee.batch.Export.image.toDrive(**task_config)
                    task.start()
                else:
                    logger.warning(f'no image for interval {ts}')
    else:
        logger.warning(f'collection over {limit} aborting drive download')

Кажется, что когда он попадает во второй AOI, он терпит неудачу , Я смущен этим, поскольку if ts_collection.size().eq(ee.Number(1)) подтверждает, что там есть изображение, поэтому он должен получить из него идентификатор продукта.

line 24, in download_image_collection_to_drive
    p_id = image.get("PRODUCT_ID").getInfo()
  File "/lib/python3.7/site-packages/ee/computedobject.py", line 95, in getInfo
    return data.computeValue(self)
  File "/lib/python3.7/site-packages/ee/data.py", line 717, in computeValue
    prettyPrint=False))['result']
  File "/lib/python3.7/site-packages/ee/data.py", line 340, in _execute_cloud_call
    raise _translate_cloud_exception(e)
ee.ee_exception.EEException: Element.get: Parameter 'object' is required.

Я где-то падаю неизменными объектами на стороне сервера?

1 Ответ

0 голосов
/ 24 марта 2020

Это значение на стороне сервера, проблема, да, но неизменность не имеет к этому отношения - ваш оператор if не работает так, как вы предполагаете.

ts_collection.size().eq(ee.Number(1)) - это значение на стороне сервера - вы описали сравнение, которого еще не было. Это означает, что выполнение любой локальной операции, такой как оператор Python if, не может принять во внимание результат сравнения, а просто будет рассматривать его как истинное значение.

Использование getInfo будет быстрым решением:

if ts_collection.size().eq(ee.Number(1)).getInfo():

, но было бы более эффективно избегать использования getInfo больше, чем необходимо, путем извлечения информации всей коллекции только один раз, включая информацию об изображении.

...
ts_collection_info = ts_collection.getInfo()
if ts_collection['features']:  # Are there any images in the collection?
    image = ts_collection.first()
    image_info = ts_collection['features'][0]  # client-side image info already downloaded
    p_id = image_info['properties']['PRODUCT_ID']  # get ID from client-side info
    ...

Таким образом вы делаете только два запроса на ts: один для проверки на совпадение и один для начала экспорта.

Обратите внимание, что я на самом деле не запускал этот код Python, и могут быть некоторые мелкие ошибки; если это доставляет вам какие-либо проблемы, print(ts_collection_info) и изучите структуру, которую вы фактически получили, чтобы выяснить, как ее интерпретировать.

...