การอัปโหลดไฟล์ Manifest ของรูปภาพ

หากต้องการความยืดหยุ่นในการอัปโหลดรูปภาพไปยัง Google Earth Engine (EE) มากกว่าที่UI ของตัวแก้ไขโค้ดหรือคำสั่ง upload ของเครื่องมือบรรทัดคำสั่ง "earthengine" มีให้ คุณสามารถทำได้โดยอธิบายการอัปโหลดรูปภาพโดยใช้ไฟล์ JSON ที่เรียกว่า "ไฟล์ Manifest" และใช้คำสั่ง upload image --manifest ของเครื่องมือบรรทัดคำสั่ง

ดูตัวอย่างที่สมบูรณ์ใน Colab Notebook นี้ ซึ่งสาธิตการอัปโหลดชิ้นส่วนรูปภาพเป็นชิ้นงานเดียวโดยใช้ไฟล์ Manifest

การตั้งค่าเพียงครั้งเดียว

  1. การอัปโหลดไฟล์ Manifest ใช้ได้กับไฟล์ที่อยู่ใน Google Cloud Storage เท่านั้น หากต้องการเริ่มใช้ Google Cloud Storage ให้สร้างโปรเจ็กต์ Google Cloud หากยังไม่มี โปรดทราบว่าการตั้งค่าต้องระบุบัตรเครดิตสำหรับการเรียกเก็บเงิน EE เองไม่ได้เรียกเก็บเงินจากผู้ใช้ในขณะนี้ แต่การโอนไฟล์ไปยัง Google Cloud Storage ก่อนอัปโหลดไปยัง EE จะมีค่าใช้จ่ายเล็กน้อย สำหรับขนาดข้อมูลการอัปโหลดทั่วไป (หลายสิบหรือหลายร้อยกิกะไบต์) ค่าใช้จ่ายจะค่อนข้างต่ำ
  2. ภายในโปรเจ็กต์ ให้เปิด Cloud Storage API และสร้างที่เก็บข้อมูล
  3. ติดตั้งไคลเอ็นต์ Python ของ Earth Engine ซึ่งรวมถึงเครื่องมือบรรทัดคำสั่ง earthengine ที่เราจะใช้ในการอัปโหลดข้อมูล
  4. สำหรับการอัปโหลดอัตโนมัติ คุณอาจต้องใช้บัญชีบริการ Google Cloud ที่เชื่อมโยงกับโปรเจ็กต์ของคุณ คุณไม่จำเป็นต้องใช้บัญชีบริการสำหรับการทดสอบ แต่หากมีเวลา โปรดเริ่มทำความคุ้นเคยกับการใช้บัญชีบริการ

ไฟล์ต้นฉบับขนาดใหญ่มาก (100 GB ขึ้นไป) อาจอัปโหลดได้เร็วขึ้นหากแบ่งออกเป็นหลายๆ ไฟล์

รหัสเนื้อหาและชื่อ

สำหรับชิ้นงานที่โปรเจ็กต์ที่อยู่ในระบบคลาวด์เป็นเจ้าของ ให้ใช้รูปแบบชื่อชิ้นงานต่อไปนี้ projects/some-project-id/assets/some-asset-id

ดูข้อมูลเกี่ยวกับชื่อชิ้นงานสำหรับโปรเจ็กต์เดิมและชิ้นงานที่ผู้ใช้เป็นเจ้าของ

สำหรับโปรเจ็กต์เดิมที่เก่ากว่า ชื่อเนื้อหาในไฟล์ Manifest จะต้องแตกต่างจากรหัสเนื้อหาที่มองเห็นได้ในที่อื่นๆ ใน Earth Engine เล็กน้อย หากต้องการอัปโหลดเนื้อหาที่มีรหัสเนื้อหาขึ้นต้นด้วย users/some_user หรือ projects/some_project ชื่อเนื้อหาในไฟล์ Manifest ต้องมีสตริง projects/earthengine-legacy/assets/ นำหน้ารหัส เช่น ควรอัปโหลดรหัสเนื้อหา EE users/username/my_geotiff โดยใช้ชื่อ projects/earthengine-legacy/assets/users/username/my_geotiff

ใช่ ซึ่งหมายความว่ารหัสอย่าง projects/some_projects/some_asset จะแปลงเป็นชื่อที่มีการพูดถึง projects 2 ครั้ง ดังนี้ projects/earthengine-legacy/assets/projects/some_projects/some_asset ซึ่งอาจทำให้สับสน แต่จำเป็นต้องทำเพื่อให้เป็นไปตามมาตรฐาน Google Cloud API

การใช้ไฟล์ Manifest

ไฟล์ Manifest พื้นฐานจะแสดงในบล็อกโค้ดต่อไปนี้ โดยจะอัปโหลดไฟล์ชื่อ small.tif จากที่เก็บข้อมูล Google Cloud Storage ชื่อ gs://earthengine-test

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://earthengine-test/small.tif"
          ]
        }
      ]
    }
  ]
}

หากต้องการใช้ ให้บันทึกเป็นไฟล์ชื่อ manifest.json แล้วเรียกใช้คำสั่งต่อไปนี้

earthengine upload image --manifest /path/to/manifest.json

(ไฟล์ gs://earthengine-test/small.tif มีอยู่และอ่านได้แบบสาธารณะ คุณสามารถใช้ไฟล์นี้เพื่อทดสอบได้)

ชุดชิ้นส่วนแผนที่

โครงสร้างไฟล์ Manifest ที่ค่อนข้างซับซ้อนของ JSON จำเป็นต่อการให้ความยืดหยุ่นที่เพียงพอในการจัดการกับความท้าทายในการอัปโหลดที่พบบ่อย ซึ่งก็คือวิธีอธิบายวิธีที่เป็นไปได้ทั้งหมดในการรวมพิกเซลจากไฟล์ต้นฉบับหลายไฟล์เป็นเนื้อหาเดียว โดยเฉพาะอย่างยิ่ง มี 2 วิธีในการจัดกลุ่มไฟล์เข้าด้วยกันอย่างอิสระ ดังนี้

  • ภาพโมเสค บางครั้งไฟล์หลายไฟล์จะแสดงไทล์หลายรายการ (เช่น ไทล์แต่ละรายการเป็นสี่เหลี่ยมจัตุรัสขนาด 1x1 องศา) ไฟล์ดังกล่าวต้องโมเสก (ผสานรวมเข้าด้วยกัน) เป็นแบนด์เดียวกันในชิ้นงาน EE
  • แยกย่านความถี่ บางครั้งไฟล์หลายไฟล์อาจแสดงถึงย่านความถี่หลายย่าน ไฟล์ดังกล่าวต้องซ้อนกันเป็นแบนด์ในชิ้นงาน EE

(คุณอาจต้องใช้วิธีทั้ง 2 วิธีพร้อมกัน แต่เป็นสถานการณ์ที่เกิดขึ้นไม่บ่อยนัก)

เพื่ออธิบายตัวเลือกเหล่านี้ ไฟล์ Manifest จะแนะนำแนวคิดของ tileset ชุดชิ้นส่วนเดียวจะสอดคล้องกับแหล่งที่มา GDAL แหล่งเดียว ด้วยเหตุนี้ แหล่งที่มาทั้งหมดในชุดชิ้นส่วนเดียวจึงต้องมีโครงสร้าง GDAL เดียวกัน (จำนวนและประเภทของแบนด์, การฉายภาพ, การเปลี่ยนรูปแบบ, ค่าที่ขาดหายไป) เนื่องจากแหล่งที่มา GDAL มีได้หลายแบนด์ ชุดชิ้นส่วนหนึ่งจึงอาจมีข้อมูลสำหรับแบนด์ EE หลายแบนด์

สำหรับการส่งผ่านข้อมูลโมเสก ไฟล์ Manifest จะมีลักษณะดังนี้

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://bucket/N30W22.tif"
          ]
        },
        {
          "uris": [
            "gs://bucket/N31W22.tif"
          ]
        }
      ]
    }
  ]
}

สำหรับแบนด์แยก ไฟล์ Manifest จะมีลักษณะดังนี้ (คุณต้องเพิ่มส่วน bands ด้วยตามที่อธิบายไว้ด้านล่าง)

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "bands": ...,
  "tilesets": [
    {
      "id": "tileset_for_band1",
      "sources": [
        {
          "uris": [
            "gs://bucket/band1.tif"
          ]
        }
      ]
    },
    {
      "id": "tileset_for_band2",
      "sources": [
        {
          "uris": [
            "gs://bucket/band2.tif"
          ]
        }
      ]
    }
  ]
}

โปรดทราบว่าในกรณีของย่านความถี่ที่แยกกัน เราต้องกำหนดรหัสชุดชิ้นส่วนที่แตกต่างกันให้กับชุดชิ้นส่วนแต่ละชุดเพื่อความชัดเจน รหัสชุดชิ้นส่วนอาจเป็นสตริงที่กำหนดเอง โดยระบบจะไม่เก็บสตริงเหล่านี้ไว้ในชิ้นงานที่อัปโหลด รหัสชุดชิ้นส่วนจะใช้ในการนำเข้าเท่านั้นเพื่อแยกความแตกต่างระหว่างชุดชิ้นส่วนที่ซ้อนกัน

ย่านความถี่

แนวคิดสำคัญประการที่ 2 คือการจับคู่ไฟล์ต้นฉบับกับย่านความถี่ของเนื้อหา EE ซึ่งทำได้โดยใช้ส่วน bands ของไฟล์ Manifest

คุณสามารถละเว้นส่วน bands ได้ ซึ่งในกรณีนี้ ระบบจะสร้างแบนด์จากไฟล์ในชุดไทล์แรกก่อน จากนั้นจึงสร้างจากชุดไทล์ถัดไป และต่อไปเรื่อยๆ โดยค่าเริ่มต้น แบนด์จะชื่อ "b1", "b2" ฯลฯ หากต้องการลบล้างชื่อแบนด์เริ่มต้น ให้ใส่ส่วน "bands" ไว้ที่ส่วนท้าย ดังนี้

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://bucket/rgb.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "R",
      "tilesetBandIndex": 0
    },
    {
      "id": "G",
      "tilesetBandIndex": 1
    },
    {
      "id": "B",
      "tilesetBandIndex": 2
    }
  ]
}

จำนวนแบนด์ EE ต้องเท่ากับจำนวนแบนด์ทั้งหมดในชุดภาพทั้งหมด

หากไม่ต้องการนำเข้าแบนด์ทั้งหมดจากไฟล์ คุณสามารถใช้ช่อง tilesetBandIndex เพื่อระบุแบนด์ GDAL ที่ควรนำเข้า แถบแรกมี tilesetBandIndex เป็น 0

ตัวอย่าง

สมมติว่าไฟล์ต้นฉบับมี 4 แบนด์ ได้แก่ "tmin", "tmin_error", "tmax", "tmax_error" เราต้องการนำเข้าเฉพาะ "tmin" และ "tmax" เท่านั้น ส่วนไฟล์ Manifest ที่เกี่ยวข้องจะมีลักษณะดังนี้

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "id": "temperature",
      "sources": [
        {
          "uris": [
            "gs://bucket/temperature.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "tmin",
      "tilesetBandIndex": 0,
      "tilesetId": "temperature"
    },
    {
      "id": "tmax",
      "tilesetBandIndex": 2,
      "tilesetId": "temperature"
    }
  ]
}

สายรัดหน้ากาก

การมาสก์แบนด์จะควบคุมโดยคอมโพเนนต์ maskBands ของไฟล์ Manifest ระบบรองรับการกำหนดค่ามาสก์ที่เป็นไปได้ 3 แบบ (แต่ระบบจะถือว่าแถบมาสก์เป็นแถบสุดท้ายในไฟล์หนึ่งๆ เสมอ)

  1. มาสก์สำหรับย่านข้อมูลทั้งหมดในไฟล์เดียวกัน
  2. มาสก์สำหรับย่านข้อมูลทั้งหมดที่มาจากไฟล์อื่นๆ ทั้งหมด
  3. มาสก์สำหรับย่านข้อมูลบางย่าน

1. กรณีที่พบบ่อยที่สุดคือ GeoTIFF รายการเดียวที่มีการใช้แบนด์สุดท้ายเป็นมาสก์สำหรับแบนด์อื่นๆ วิธีนี้ใช้ได้กับ GeoTIFF ประเภทไบต์เท่านั้น ใช้ไฟล์ Manifest ต่อไปนี้

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "id": "data_tileset",
      "sources": [
        {
          "uris": [
            "gs://bucket/data_file.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "data_band",
      "tilesetId": "data_tileset"
    },
    {
      "id": "qa_band",
      "tilesetId": "data_tileset"
    }
  ],
  "maskBands": [
    {
      "tilesetId": "data_tileset"
    }
  ]
}

2. หากต้องการใช้มาสก์ GeoTIFF เป็นมาสก์สำหรับทุกแบนด์ใน GeoTIFF อื่น ให้ใช้ไฟล์ Manifest ต่อไปนี้

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "id": "data_tileset",
      "sources": [
        {
          "uris": [
            "gs://bucket/data_file.tif"
          ]
        }
      ]
    },
    {
      "id": "mask_tileset",
      "sources": [
        {
          "uris": [
            "gs://bucket/mask_file.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "data_band",
      "tilesetId": "data_tileset"
    },
    {
      "id": "qa_band",
      "tilesetId": "data_tileset"
    }
  ],
  "maskBands": [
    {
      "tilesetId": "mask_tileset"
    }
  ]
}

3. หากต้องการใช้ GeoTIFF เป็นมาสก์สำหรับแบนด์ที่เฉพาะเจาะจงในไฟล์อื่น ให้ใช้ไฟล์ Manifest ต่อไปนี้ (ความแตกต่างจากกรณีก่อนหน้าคือมีการตั้งค่าช่อง bandIds ใน maskBands)

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "id": "data_tileset",
      "sources": [
        {
          "uris": [
            "gs://bucket/data_file.tif"
          ]
        }
      ]
    },
    {
      "id": "mask_tileset",
      "sources": [
        {
          "uris": [
            "gs://bucket/mask_file.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "data_band",
      "tilesetId": "data_tileset"
    },
    {
      "id": "qa_band",
      "tilesetId": "data_tileset"
    }
  ],
  "maskBands": [
    {
      "tilesetId": "mask_tileset",
      "bandIds": ["data_band"]
    }
  ]
}

ในตัวอย่างสุดท้าย เรากำลังทำงานกับ 2 แบนด์จากชุดไทล์ data_tileset แต่ใช้มาสก์กับแบนด์เดียวเท่านั้น (data_band) ตามที่ระบุไว้ในช่อง bandIds ของออบเจ็กต์รายการ maskBands เพียงรายการเดียวที่มีให้

โปรดทราบว่าระบบจะใช้เฉพาะแบนด์สุดท้ายของชุดชิ้นส่วนที่กล่าวถึงใน maskBands เป็นแบนด์มาสก์

นโยบายการสร้างเครือข่ายแบบพีระมิด

เมื่อ Earth Engine สร้างปิรามิดรูปภาพระหว่างการนำเข้า จะต้องลดตารางกริดขนาด 2x2 พิกเซลให้เหลือพิกเซลเดียวซ้ำๆ เพื่อเปลี่ยนรูปแบบค่าพิกเซล โดยค่าเริ่มต้น ระบบจะหาค่าเฉลี่ยของค่าพิกเซล ซึ่งเป็นสิ่งที่ควรทำในกรณีส่วนใหญ่เมื่อแบนด์แรสเตอร์แสดงข้อมูลที่ต่อเนื่องไม่มากก็น้อย อย่างไรก็ตาม มี 2 สถานการณ์ที่การใช้ค่าเริ่มต้นจะทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง ซึ่งในกรณีนี้ต้องตั้งค่าฟิลด์ pyramidingPolicy ในคำจำกัดความของแบนด์ (หากไม่ได้ตั้งค่า ระบบจะถือว่าค่าเป็น "MEAN" โดยค่าเริ่มต้น)

สำหรับการจัดประเภทภาพแรสเตอร์ (เช่น สำหรับการจัดประเภทสิ่งปกคลุมดิน) วิธีที่สมเหตุสมผลที่สุดในการสร้างพีระมิดพิกเซลคือการใช้ค่าส่วนใหญ่จาก 4 ค่าเพื่อสร้างค่าถัดไป ซึ่งทำได้โดยใช้นโยบายการปิรามิด "MODE" ดังนี้

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://bucket/landcover.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "landcover",
      "pyramidingPolicy": "MODE"
    }
  ]
}

สำหรับแบนด์แรสเตอร์ที่ทั้ง "MEAN" และ "MODE" ไม่สมเหตุสมผล (เช่น พิกเซลที่แพ็กบิต) ควรใช้นโยบายการสร้างปิรามิด "SAMPLE" "SAMPLE" จะใช้ค่าของพิกเซลด้านซ้ายบนจากตารางกริด 2x2 แต่ละตารางเสมอ ตัวอย่างต่อไปนี้กำหนดนโยบายการสร้างพีระมิด "MEAN" ให้กับแบนด์ที่แสดงตัวแปรต่อเนื่อง ("NDVI") และ "SAMPLE" ให้กับแบนด์ "QA" ของข้อมูล

{
  "name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://bucket/ndvi.tif"
          ]
        }
      ]
    }
  ],
  "bands": [
    {
      "id": "NDVI",
      "tilesetBandIndex": 0,
      "pyramidingPolicy": "MEAN"
    },
    {
      "id": "QA",
      "tilesetBandIndex": 1,
      "pyramidingPolicy": "SAMPLE"
    }
  ]
}

เวลาเริ่มต้นและสิ้นสุด

เนื้อหาทั้งหมดควรระบุเวลาเริ่มต้นและสิ้นสุดเพื่อให้บริบทเพิ่มเติมแก่ข้อมูล โดยเฉพาะอย่างยิ่งหากรวมอยู่ในคอลเล็กชัน แม้ว่าฟิลด์เหล่านี้จะไม่บังคับ แต่เราขอแนะนำอย่างยิ่งให้ใช้ฟิลด์เหล่านี้ทุกครั้งที่ทำได้

โดยปกติแล้ว เวลาเริ่มต้นและเวลาสิ้นสุดจะหมายถึงเวลาของการสังเกตการณ์ ไม่ใช่เวลาที่สร้างไฟล์ต้นฉบับ

ระบบจะถือว่าเวลาสิ้นสุดเป็นขอบเขตที่ไม่รวมเพื่อความง่าย เช่น สำหรับเนื้อหาที่ครอบคลุมระยะเวลา 1 วันพอดี ให้ใช้เวลาเที่ยงคืนของ 2 วันติดต่อกัน (เช่น 1980-01-31T00:00:00 และ 1980-02-01T00:00:00) เป็นเวลาเริ่มต้นและเวลาสิ้นสุด หากเนื้อหาไม่มีระยะเวลา ให้ตั้งเวลาสิ้นสุดให้เหมือนกับเวลาเริ่มต้น แสดงเวลาในไฟล์ Manifest เป็นสตริง ISO 8601 เราขอแนะนำให้ถือว่าเวลาสิ้นสุดเป็นแบบไม่รวม (เช่น เที่ยงคืนของวันถัดไปสำหรับชิ้นงานรายวัน) เพื่อให้ค่าวันที่เข้าใจง่ายขึ้น

ตัวอย่าง

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "tilesets": [
    {
      "sources": [
        {
          "uris": [
            "gs://bucket/img_20190612.tif"
          ]
        }
      ]
    }
  ],
  "startTime": "1980-01-31T00:00:00Z",
  "endTime": "1980-02-01T00:00:00Z"
}

ข้อมูลอ้างอิงโครงสร้างไฟล์ Manifest

โครงสร้าง JSON ต่อไปนี้ประกอบด้วยช่องไฟล์ Manifest สำหรับการอัปโหลดรูปภาพที่เป็นไปได้ทั้งหมด ดูคำจำกัดความของช่องได้ในส่วนคำจำกัดความของช่องไฟล์ Manifestต่อไปนี้

{
  "name": <string>,
  "tilesets": [
    {
      "dataType": <string>,
      "id": <string>,
      "crs": <string>,
      "sources": [
        {
          "uris": [
            <stringn>>
          ],
          "affineTransform": {
            "scaleX": <double>,
            "shearX": <double>,
            "translateX": <double>,
            "shearY": <double>,
            "scaleY": <double>,
            "translateY": <double>
          }
        }
      ]
    }
  ],
  "bands": [
    {
      "id": <string>,
      "tilesetId": <string>,
      "tilesetBandIndex": <int32>,
      "missingData": {
        "values": [<doublen>>]
      },
      "pyramindingPolicy": <string>
    }
  ],
  "maskBands": [
    {
      "tilesetId": <string>,
      "bandIds": [
        <stringn>>
      ]
    }
  ],
  "footprint": {
    "points": [
      {
        "x": <double>,
        "y": <doublen>>
      }
    ],
    "bandId": <string>
  },
  "missingData": {
     "values": [<double>]
  },
  "pyramidingPolicy": <string>,
  "uriPrefix": <string>,
  "startTime": {
    "seconds": <integer>
  },
  "endTime": {
    "seconds": <integer>
  },
  "properties": {
    <unspecified>
  }
}

คำจำกัดความของช่องไฟล์ Manifest

name

string

ชื่อของชิ้นงานที่จะสร้าง name อยู่ในรูปแบบ "projects/*/assets/**" (เช่น "projects/earthengine-legacy/assets/users/USER/ASSET")

ชุดชิ้นส่วนแผนที่

list

รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้สำหรับชุดชิ้นส่วนแผนที่ ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม tilesets ต่อไปนี้

tilesets[i].dataType

string

ระบุประเภทข้อมูลตัวเลขของข้อมูล ค่าเริ่มต้นคือประเภทที่ GDAL รายงาน ซึ่งในกรณีนี้ไม่จำเป็นต้องกำหนด

ประเภทข้อมูล ค่า
ไม่ระบุ "DATA_TYPE_UNSPECIFIED"
จำนวนเต็มแบบมีเครื่องหมาย 8 บิต "INT8"
จำนวนเต็มแบบไม่มีเครื่องหมาย 8 บิต "UINT8"
จำนวนเต็มแบบมีเครื่องหมาย 16 บิต "INT16"
จำนวนเต็มแบบไม่มีเครื่องหมาย 16 บิต "UINT16"
จำนวนเต็มแบบมีเครื่องหมาย 32 บิต "INT32"
จำนวนเต็มแบบ 32 บิตที่ไม่ใช่ค่าลบ "UINT32"
32-bit float "FLOAT32"
64-bit float "FLOAT64"

tilesets[i].id

string

รหัสของชุดชิ้นส่วน ต้องไม่ซ้ำกันในชุดชิ้นส่วนที่ระบุในไฟล์ Manifest ของชิ้นงาน ระบบจะทิ้งรหัสนี้ในระหว่างขั้นตอนการประมวลผล โดยจะใช้เพื่อลิงก์ชุดชิ้นส่วนกับแบนด์เท่านั้น สตริงว่างเป็นรหัสที่ถูกต้อง

tilesets[i].crs

string

ระบบอ้างอิงพิกัดของตารางกริดพิกเซล ซึ่งระบุเป็นรหัสมาตรฐานหากเป็นไปได้ (เช่น รหัส EPSG) และในรูปแบบ WKT หากเป็นไปไม่ได้

tilesets[i].sources

list

รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของไฟล์ภาพและไฟล์ Sidecar ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม sources ต่อไปนี้

tilesets[i].sources[j].uris

list

รายการ URI ของข้อมูลที่จะนำเข้า ระบบรองรับเฉพาะ URI ของ Google Cloud Storage เท่านั้น URI แต่ละรายการต้องระบุในรูปแบบต่อไปนี้ gs://bucket-id/object-id ออบเจ็กต์หลักควรเป็นองค์ประกอบแรกของรายการ และรายการที่เกี่ยวข้องจะแสดงอยู่หลังจากนั้น URI แต่ละรายการจะมีคำนำหน้าเป็น ImageManifest.uriPrefix หากตั้งค่าไว้

tilesets[i].sources[j].affineTransform

dictionary

การเปลี่ยนรูปแบบแอฟฟีน (ไม่บังคับ) ควรระบุเฉพาะในกรณีที่ข้อมูลจาก uris (รวมถึงไฟล์ Sidecar) ไม่เพียงพอที่จะวางพิกเซล ระบุเป็นพจนานุกรมที่มีคีย์ต่อไปนี้ "scaleX", "shearX", "translateX", "shearY", "scaleY", "translateY" ดูข้อมูลเพิ่มเติมได้ในข้อมูลอ้างอิงนี้

ตัวอย่างคีย์และค่า

{
  "scaleX": 0.1,
  "shearX": 0.0,
  "translateX": -180.0,
  "shearY": 0.0,
  "scaleY": -0.1,
  "translateY": 90.0
}

สายนาฬิกา

list

รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของแบนด์เดียวที่มาจากชุดไทล์ โปรดทราบว่าลำดับแบนด์ของชิ้นงานจะเหมือนกับลำดับของ bands ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม bands ต่อไปนี้

bands[i].id

string

รหัส (ชื่อ) ของวงดนตรี

bands[i].tilesetId

string

รหัสของชุดชิ้นส่วนที่สอดคล้องกับย่านความถี่

bands[i].tilesetBandIndex

int32

ดัชนีแถบแบบ 0 จากชุดชิ้นส่วนที่สอดคล้องกับแถบ

bands[i].missingData.values

list

รายการค่า (ประเภท Double) ที่แสดงถึงไม่มีข้อมูลในย่านความถี่

bands[i].pyramidingPolicy

string

นโยบายการปิรามิด ดูข้อมูลเพิ่มเติมได้ที่ลิงก์นี้ โดยมีตัวเลือกดังนี้

  • "MEAN" (ค่าเริ่มต้น)
  • "MODE"
  • "SAMPLE"

maskBands

list

รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของแถบมาสก์เดียวที่มาจากชุดไทล์ ระบุแถบมาสก์ได้สูงสุด 1 แถบ ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม maskBands ต่อไปนี้

maskBands[i].tilesetId

string

รหัสของชุดไทล์ที่สอดคล้องกับแถบมาสก์ ระบบจะใช้แบนด์สุดท้ายของชุดชิ้นส่วนเป็นแบนด์มาสก์เสมอ

maskBands[i].bandIds

list of strings

รายการรหัสของย่านความถี่ที่ใช้ย่านความถี่มาสก์ หากเว้นว่างไว้ ระบบจะใช้แถบมาสก์กับแถบทั้งหมดในชิ้นงาน แต่ละย่านความถี่จะมีแถบมาสก์ที่สอดคล้องกันได้เพียงแถบเดียวเท่านั้น

รอยเท้า

dictionary

พจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของฟุตพริ้นท์ของพิกเซลที่ถูกต้องทั้งหมดในรูปภาพ หากเว้นว่างไว้ ฟุตพริ้นท์เริ่มต้นจะเป็นทั้งรูปภาพ ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม footprint ต่อไปนี้

footprint.points

list

รายการจุดที่กำหนดรอยเท้าของพิกเซลที่ถูกต้องทั้งหมดในรูปภาพ จุดจะกำหนดโดยพจนานุกรมที่มีคีย์ "x" และ "y" ที่มีค่าแบบ Float รายการจุดต่างๆ จะอธิบายวงแหวนที่สร้างภายนอกของรูปหลายเหลี่ยมแบบง่ายซึ่งต้องมีจุดศูนย์กลางของพิกเซลที่ถูกต้องทั้งหมดของรูปภาพ ซึ่งต้องเป็นวงแหวนเชิงเส้น โดยจุดสุดท้ายต้องเท่ากับจุดแรก พิกัดจะอยู่ในการฉายภาพของย่านความถี่ที่ระบุโดย bandId

หมายเหตุ: ใช้พิกัดที่ไม่ใช่จำนวนเต็ม เช่น จุดศูนย์กลางของแต่ละพิกเซล เนื่องจากระบบจะถือว่า footprint มีพิกเซลหากพิกเซล (สี่เหลี่ยมผืนผ้าขนาด 1x1) ตัดกับพื้นที่ครอบคลุม เพื่อหลีกเลี่ยงการเลือกพิกเซลข้างเคียงโดยไม่ตั้งใจ อย่าใช้พิกัดที่มีค่าเป็นจำนวนเต็ม เนื่องจากพิกัดดังกล่าวเป็นขอบเขตระหว่างพิกเซล การวาดฟุตพริ้นท์ตามศูนย์กลางพิกเซลจะช่วยป้องกันไม่ให้รวมพิกเซลที่ไม่ได้ตั้งใจ ซึ่งอาจทำให้เกิดข้อผิดพลาดเมื่อพิกเซลที่ต้องการอยู่ติดกับขอบเขตแผนที่ เช่น เส้นแอนติเมอริเดียนหรือขั้วโลก

ตัวอย่างเช่น สำหรับรูปภาพขนาด 2x2 ที่มีพิกเซลที่ถูกต้องทั้ง 4 พิกเซล ต่อไปนี้คือวงแหวนที่เป็นไปได้ 1 วง

[
  {
    "x": 0.5,
    "y": 0.5
  },
  {
    "x": 0.5,
    "y": 1.5
  },
  {
    "x": 1.5,
    "y": 1.5
  },
  {
    "x": 1.5,
    "y": 0.5
  },
  {
    "x": 0.5,
    "y": 0.5
  }
]

footprint.bandId

string

รหัสของย่านความถี่ที่ CRS กำหนดพิกัดของพื้นที่ครอบคลุม หากเว้นว่างไว้ ระบบจะใช้ย่านความถี่แรก

missingData.values

list

รายการค่า (ประเภท Double) ซึ่งแสดงถึงไม่มีข้อมูลในทุกแบนด์ของรูปภาพ มีผลกับทุกย่านความถี่ที่ไม่ได้ระบุ missingData ของตัวเอง

pyramidingPolicy

string

นโยบายการปิรามิด หากไม่ได้ระบุ ระบบจะใช้นโยบาย "MEAN" โดยค่าเริ่มต้น มีผลกับทุกย่านความถี่ที่ไม่ได้ระบุย่านความถี่ของตนเอง ดูข้อมูลเพิ่มเติมได้ที่ลิงก์นี้ โดยมีตัวเลือกดังนี้

  • "MEAN" (ค่าเริ่มต้น)
  • "MODE"
  • "SAMPLE"

uriPrefix

string

คำนำหน้าที่ไม่บังคับซึ่งเพิ่มไว้หน้า uris ทั้งหมดที่กำหนดไว้ในไฟล์ Manifest

startTime

integer

การประทับเวลาที่เชื่อมโยงกับเนื้อหา (หากมี) ซึ่งโดยปกติจะสอดคล้องกับเวลาที่ถ่ายภาพจากดาวเทียม สำหรับเนื้อหาที่สอดคล้องกับช่วงเวลา เช่น ค่าเฉลี่ยในช่วง 1 เดือนหรือ 1 ปี การประทับเวลานี้จะสอดคล้องกับจุดเริ่มต้นของช่วงเวลานั้น ระบุเป็นวินาทีและ (ไม่บังคับ) นาโนวินาทีตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970 (Epoch) ระบบจะถือว่าอยู่ในเขตเวลา UTC

endTime

integer

สำหรับเนื้อหาที่สอดคล้องกับช่วงเวลา เช่น ค่าเฉลี่ยในระยะเวลา 1 เดือนหรือ 1 ปี การประทับเวลานี้จะสอดคล้องกับจุดสิ้นสุดของช่วงเวลานั้น (ไม่รวม) ระบุเป็นวินาทีและ (ไม่บังคับ) นาโนวินาทีตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970 (Epoch) ระบบจะถือว่าอยู่ในเขตเวลา UTC

พร็อพเพอร์ตี้

dictionary

พจนานุกรมแบบแฟลตที่กำหนดเองของคู่คีย์-ค่า คีย์ต้องเป็นสตริงและค่าอาจเป็นตัวเลขหรือสตริงก็ได้ ชิ้นงานที่ผู้ใช้อัปโหลดยังไม่รองรับค่ารายการ

ข้อจำกัด

ขนาดไฟล์ Manifest ของ JSON

ไฟล์ Manifest ของ JSON ต้องมีขนาดไม่เกิน 10 MB หากมีไฟล์จำนวนมากที่ต้องอัปโหลด ให้พิจารณาวิธีลดจำนวนอักขระที่จำเป็นในการอธิบายชุดข้อมูล เช่น ใช้ช่อง uriPrefix เพื่อไม่ให้ต้องระบุเส้นทางที่เก็บข้อมูล Google Cloud สำหรับ URI แต่ละรายการในรายการ uris หากต้องการลดขนาดเพิ่มเติม ให้ลองย่อชื่อไฟล์ให้สั้นลง

รูปแบบไฟล์ภาพ

ไฟล์ภาพแต่ละไฟล์ต้องเป็นภาพ TIFF หากไม่ได้ระบุ CRS ในไฟล์ Manifest ไฟล์นั้นต้องเป็น GeoTIFF ที่มี CRS แบบฝัง

ไฟล์ TIFF สามารถบีบอัดด้วย DEFLATE, JPEG-XL/JXL, LERC, LERC_DEFLATE, LERC_ZSTD, LZMA, LZW, WEBP หรือ ZSTD

คำแนะนำเพื่อให้ได้รับประสบการณ์การอัปโหลดไฟล์ขนาดใหญ่ที่ดีที่สุดมีดังนี้

  • ตัวเลือกที่ดีที่สุด: ZSTD มีความสมดุลที่ดีระหว่างความเร็วและการบีบอัด
  • หลีกเลี่ยง: LZMA อาจทำงานช้ามากแม้ว่าจะบีบอัดได้ดีก็ตาม
  • ไฟล์ที่ไม่ได้บีบอัด: จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและใช้เวลาอัปโหลดนานขึ้น
  • การบีบอัดแบบสูญเสียบางส่วน (เช่น JPEG): อาจเปลี่ยนแปลงค่าพิกเซล ใช้การบีบอัดแบบไม่สูญเสียรายละเอียด (เช่น DEFLATE, LZMA, LZW, ZSTD) เว้นแต่คุณจะเข้าใจผลกระทบที่อาจเกิดขึ้นกับข้อมูล