मेरे पास एक ऐसा फ़ंक्शन है जो एक छवि संग्रह को 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')

ऐसा लगता है कि जब भी यह दूसरी एओआई तक पहुंच जाता है तो यह विफल हो जाता है, मैं इससे भ्रमित हूं क्योंकि 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
Javrel 24 मार्च 2020, 15:11

1 उत्तर

सबसे बढ़िया उत्तर

यह एक सर्वर-साइड मान है, समस्या है, हाँ, लेकिन अपरिवर्तनीयता का इससे कोई लेना-देना नहीं है - आपका if स्टेटमेंट आपके इरादे के अनुसार काम नहीं कर रहा है।

ts_collection.size().eq(ee.Number(1)) एक सर्वर-साइड मान है — आपने एक ऐसी तुलना का वर्णन किया है जो अभी तक नहीं हुई है। इसका मतलब यह है कि पाइथन 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 केवल दो अनुरोध करते हैं: एक मैच की जांच के लिए, और दूसरा निर्यात शुरू करने के लिए।

ध्यान दें कि मैंने वास्तव में यह पायथन कोड नहीं चलाया है, और कुछ छोटी गलतियाँ हो सकती हैं; यदि यह आपको कोई परेशानी देता है, तो print(ts_collection_info) और उस संरचना की जांच करें जो आपको वास्तव में प्राप्त हुई थी ताकि यह पता लगाया जा सके कि इसकी व्याख्या कैसे की जाए।

1
Kevin Reid 24 मार्च 2020, 15:04