เนื้อหา Earth Engine ที่เก็บไว้ในระบบคลาวด์ซึ่งอิงตาม GeoTIFF

Earth Engine รองรับชิ้นงานที่สร้างจาก Cloud Optimized GeoTIFF (COG) ข้อดีของชิ้นงานที่สร้างจาก COG คือระบบจะจัดทำดัชนีฟิลด์เชิงพื้นที่และข้อมูลเมตาของรูปภาพในเวลาที่สร้างชิ้นงาน ซึ่งจะทำให้รูปภาพมีประสิทธิภาพมากขึ้นในคอลเล็กชัน ประสิทธิภาพของชิ้นงานที่สร้างจาก COG เทียบได้กับชิ้นงานที่นำเข้าในกรณีการใช้งานทั่วไป

โปรดทราบว่าชิ้นงานเดียวอาจสร้างจาก COG หลายรายการ (เช่น อาจมี COG 1 รายการต่อแบนด์) อย่างไรก็ตาม ระบบไม่รองรับการใช้ไทล์ COG จำนวนมากสำหรับแบนด์เดียว

(หรือ Earth Engine สามารถโหลดรูปภาพจาก COG ใน Google Cloud Storage ได้โดยตรง (ดูข้อมูล เพิ่มเติม) อย่างไรก็ตาม รูปภาพที่โหลดผ่าน ee.Image.loadGeoTIFF และเพิ่มลงในคอลเล็กชันรูปภาพจะต้องอ่าน GeoTiff สำหรับการดำเนินการกรองในคอลเล็กชัน)

วิธีสร้างชิ้นงานที่สร้างจาก COG

  1. วางไฟล์ COG ลงใน Bucket ของ GCS (ดูภูมิภาคที่อนุญาต)
  2. เขียนไฟล์ Manifest สำหรับการอัปโหลดรูปภาพ
  3. ใช้ยูทิลิตีบรรทัดคำสั่ง earthengine เพื่อส่งคำสั่งอัปโหลด
earthengine upload external_image --manifest my_manifest.json

ตัวอย่างไฟล์ Manifest ของรูปภาพที่มี Tileset เดียว

ImageManifest ที่ง่ายที่สุดคือไฟล์ Manifest ที่มี Tileset เดียว หากไม่ได้ระบุแบนด์ ชิ้นงานที่ได้จะมีแบนด์ทั้งหมดของ GeoTIFF โดยมีชื่อแบนด์เข้ารหัสใน GeoTIFF (ในกรณีนี้คือ "vis-red", "vis-green" และ "vis-blue")

request = {
  'imageManifest': {
    'name': f'projects/{ee_project}/assets/cogdemo1',
    'tilesets': [
      { 'id': '0', 'sources': [ { 'uris': [
        'gs://ee-docs-demos/COG_demo.tif'] } ] }
    ],
    'properties': {
      'version': '1.1'
    },
    'startTime': '2016-01-01T00:00:00.000000000Z',
    'endTime': '2016-12-31T15:01:23.000000000Z',
  },
}

pprint(request)

Tileset มากกว่า 1 รายการ

คุณระบุ ImageManifest ที่มี Tileset มากกว่า 1 รายการได้ โดยแต่ละแบนด์ของชิ้นงานที่ได้จะสร้างจากแบนด์หนึ่งของ Tileset โดยใช้ฟิลด์ tilesetId และ tilesetBandIndex วิธีนี้มีประโยชน์ในกรณีที่แบนด์ต่างๆ มีความละเอียดหรือประเภทข้อมูลที่แตกต่างกัน คุณสามารถแสดงรายการแบนด์ตามลำดับใดก็ได้จาก Tileset ที่พร้อมใช้งาน ในตัวอย่างต่อไปนี้

  • "b4b3b2.tif" มีสเกล 10 ม. ขณะที่ "b5b6b7" มีสเกล 20 ม.
  • ลำดับแบนด์ของชิ้นงานที่ได้จะผสมกันจาก COG อินพุต (เช่น แบนด์เอาต์พุต 0 มาจาก Tileset 0 ขณะที่แบนด์เอาต์พุต 1 มาจาก Tileset 1)
request = {
  'imageManifest': {
    'name': f'projects/{ee_project}/assets/cogdemo2',
    'uriPrefix': 'gs://ee-docs-demos/external_image_demo/',
    'tilesets': [
      { 'id': '0', 'sources': [ { 'uris': ['b4b3b2.tif'] } ] },
      { 'id': '1', 'sources': [ { 'uris': ['b5b6b7.tif'] } ] },
    ],
    'bands': [
      { 'id': 'red', 'tilesetId': '0', 'tilesetBandIndex': 0 },
      { 'id': 'rededge3', 'tilesetId': '1', 'tilesetBandIndex': 2 },
      { 'id': 'rededge2', 'tilesetId': '1', 'tilesetBandIndex': 1 },
      { 'id': 'green', 'tilesetId': '0', 'tilesetBandIndex': 1 },
      { 'id': 'blue', 'tilesetId': '1', 'tilesetBandIndex': 0 },
      { 'id': 'rededge1', 'tilesetId': '0', 'tilesetBandIndex': 2 },
    ],
  },
}

pprint(request)

รายละเอียดเกี่ยวกับชิ้นงานที่สร้างจาก COG

ตำแหน่ง

ตำแหน่ง Bucket ของ Cloud Storage ต้องเป็นตำแหน่งใดตำแหน่งหนึ่งต่อไปนี้

  • สหรัฐอเมริกาหลายภูมิภาค
  • ภูมิภาคคู่ของสหรัฐอเมริกาทุกภูมิภาคที่มี US-CENTRAL1
  • ภูมิภาค US-CENTRAL1

คลาสพื้นที่เก็บข้อมูล

คลาสพื้นที่เก็บข้อมูล ของ Bucket ต้องเป็น "พื้นที่เก็บข้อมูลมาตรฐาน"

สิทธิ์สำหรับการแชร์

ระบบจะจัดการ ACL ของชิ้นงาน Earth Engine ที่สร้างจาก COG และข้อมูลพื้นฐานแยกกัน เมื่อแชร์ชิ้นงานที่สร้างจาก COG กับผู้ทำงานร่วมกันเพื่ออ่าน เจ้าของมีหน้าที่รับผิดชอบในการตรวจสอบว่าได้ให้สิทธิ์เข้าถึงเพื่ออ่านทั้ง ชิ้นงาน Earth Engine และไฟล์ COG พื้นฐานแล้ว

1. ให้สิทธิ์อ่าน Bucket ของ Google Cloud Storage

ผู้ทำงานร่วมกันต้องมีสิทธิ์อ่านไฟล์ COG พื้นฐานใน Bucket ของ Google Cloud Storage ก่อนจึงจะอ่านชิ้นงานที่สร้างจาก COG ได้ หากไม่มีสิทธิ์เหล่านี้ Earth Engine จะไม่สามารถดึงข้อมูลให้ผู้ทำงานร่วมกันได้ หากผู้ใช้ Earth Engine มองไม่เห็นข้อมูลใน Google Cloud Storage Earth Engine จะแสดงข้อผิดพลาดในรูปแบบ "Failed to load the GeoTIFF at gs://my-bucket/my-object#123456" (โดย 123456 คือเจเนอเรชันของออบเจ็กต์)

โดยเฉพาะอย่างยิ่ง ผู้ทำงานร่วมกันต้องมีสิทธิ์ต่อไปนี้

  • storage.buckets.get ใน Bucket (เพื่อดึงข้อมูลเมตาและตำแหน่งของ Bucket ซึ่งจะช่วยให้ Earth Engine แก้ไขแหล่งที่มาของชิ้นงานได้อย่างถูกต้อง)
  • storage.objects.get ใน Bucket (เพื่ออ่านข้อมูลชิ้นงานที่สร้างจาก COG จริง)

บทบาท "ผู้อ่าน Bucket เดิมของพื้นที่เก็บข้อมูล" และ "ผู้อ่านออบเจ็กต์เดิมของพื้นที่เก็บข้อมูล" จะให้สิทธิ์เหล่านี้ตามลำดับ รวมถึง บทบาทอื่นๆ

วิธีกำหนดบทบาทเหล่านี้ให้กับผู้ทำงานร่วมกัน

  1. ไปที่หน้าสิทธิ์สำหรับ Bucket: https://console.cloud.google.com/storage/browser/{MY-BUCKET};tab=permissions
  2. คลิก "ให้สิทธิ์เข้าถึง"
  3. เพิ่มผู้ใช้หลักทั้งหมด (เช่น ผู้ใช้ กลุ่ม บัญชีบริการ) ที่ควรได้รับสิทธิ์เข้าถึงเพื่ออ่าน
  4. กำหนดบทบาทต่อไปนี้
    • "ผู้อ่าน Bucket เดิมของพื้นที่เก็บข้อมูล" (ให้สิทธิ์ storage.buckets.get และ สิทธิ์อ่านระดับ Bucket อื่นๆ)
    • "ผู้อ่านออบเจ็กต์เดิมของพื้นที่เก็บข้อมูล" (ให้สิทธิ์ storage.objects.get)
    • (หรือคุณจะสร้างบทบาทที่กำหนดเองใหม่ที่มีเพียงสิทธิ์ storage.buckets.get และ storage.objects.get แล้วกำหนดบทบาทนั้นก็ได้)
  5. บันทึก

2. แชร์ชิ้นงาน Earth Engine เพื่ออ่าน

หลังจากตรวจสอบว่าผู้ทำงานร่วมกันมีสิทธิ์ที่จำเป็นใน Bucket และออบเจ็กต์ของ GCS พื้นฐานแล้ว คุณต้องแชร์ชิ้นงาน Earth Engine เองด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสิทธิ์ของชิ้นงาน Earth Engine ได้ที่ คู่มือการจัดการชิ้นงาน Earth Engine

เจเนอเรชัน

เมื่อสร้างชิ้นงานที่สร้างจาก COG แล้ว Earth Engine จะอ่านข้อมูลเมตาของ TIFF ที่ระบุไว้ในไฟล์ Manifest และสร้างรายการพื้นที่เก็บข้อมูลชิ้นงาน แต่ละ URI ที่เชื่อมโยงกับรายการนั้นจะมีเจเนอเรชันได้ ดูรายละเอียดเกี่ยวกับ เจเนอเรชันได้ที่เอกสารประกอบ การกำหนดเวอร์ชันออบเจ็กต์ หากระบุเจเนอเรชันไว้ เช่น gs://foo/bar#123 Earth Engine จะจัดเก็บ URI นั้นตามที่ระบุ หากไม่ได้ระบุเจเนอเรชัน Earth Engine จะจัดเก็บ URI นั้นพร้อมเจเนอเรชันของ TIFF ในเวลาที่เรียกใช้ ImportExternalImage

ซึ่งหมายความว่าหากมีการอัปเดต TIFF ใดๆ ที่ประกอบขึ้นเป็นชิ้นงานภายนอกใน GCS (จึงทำให้เจเนอเรชันเปลี่ยนแปลง) Earth Engine จะแสดงข้อผิดพลาด "Failed to load the GeoTIFF at gs://my-bucket/my-object#123456" เนื่องจากออบเจ็กต์ที่คาดไว้ไม่มีอยู่อีกต่อไป (เว้นแต่ Bucket จะเปิดใช้เวอร์ชันออบเจ็กต์หลายเวอร์ชัน) นโยบายนี้ออกแบบมาเพื่อให้ข้อมูลเมตาของชิ้นงานซิงค์กับข้อมูลเมตาของออบเจ็กต์

การกำหนดค่า

ในส่วนของการกำหนดค่า COG นั้น TIFF ต้องมีลักษณะดังนี้

  • เป็นไทล์ โดยมีขนาดไทล์ดังนี้

    • 256x256
    • 512x512
    • 1024x1024
    • 2048x2048
  • จัดเรียงเพื่อให้ IFD ทั้งหมดอยู่ที่จุดเริ่มต้น

เพื่อให้ได้ประสิทธิภาพสูงสุด

  • ใช้ขนาดไทล์ 512x512 ขึ้นไป
  • รวมภาพรวมที่เป็นกำลังของ 2

ตัวเลือกการสร้าง 'INTERLEAVE' อาจส่งผลต่อประสิทธิภาพการทำงาน ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานที่ต้องการ เราขอแนะนำให้ใช้การสอดแทรกแบนด์ในทุกกรณี

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่าที่เพิ่มประสิทธิภาพได้ในthis page for หน้านี้

คำสั่ง gdal_translate ต่อไปนี้จะแปลงแรสเตอร์เป็น Cloud Optimized GeoTIFF ที่มีการสอดแทรกแบนด์และบีบอัดด้วย zstd ซึ่งจะทำงานได้ดีใน Earth Engine

gdal_translate in.tif out.tif \
  -co COPY_SRC_OVERVIEWS=YES \
  -co TILED=YES \
  -co BLOCKXSIZE=512 \
  -co BLOCKYSIZE=512 \
  -co COMPRESS=ZSTD \
  -co ZSTD_LEVEL=22 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS

คุณอาจลดขนาดไฟล์เอาต์พุตเพิ่มเติมได้โดยการระบุตัวคาดการณ์ (-co PREDICTOR=2 สำหรับประเภทข้อมูลจำนวนเต็ม และ -co PREDICTOR=3 สำหรับประเภทข้อมูลทศนิยม)

สำหรับผู้ใช้ที่มี GDAL >= 3.11 ไดรเวอร์ COG สามารถสร้าง ไฟล์ได้โดยไม่ต้องกังวลเกี่ยวกับการสร้างและเก็บรักษาภาพรวม

gdal_translate in.tif out.tif \
  -of COG \
  -co OVERVIEWS=IGNORE_EXISTING \
  -co COMPRESS=ZSTD \
  -co LEVEL=22 \
  -co PREDICTOR=2 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS \

การสร้างชิ้นงานที่สร้างจาก Cloud GeoTiff โดยใช้ REST API

หมายเหตุ: REST API มีฟีเจอร์ใหม่และขั้นสูงซึ่งอาจไม่เหมาะสำหรับผู้ใช้บางราย หากคุณเพิ่งเริ่มใช้ Earth Engine เราขอแนะนำให้เริ่มต้นใช้งานด้วย คู่มือ JavaScript

หากต้องการสร้างชิ้นงานที่สร้างจาก COG โดยใช้ REST API ให้ส่งคำขอ POST ไปยัง ปลายทาง ImportExternalImage ของ Earth Engine คำขอนี้ต้องได้รับสิทธิ์ในการสร้างชิ้นงานในโฟลเดอร์ผู้ใช้ ดังที่แสดงในตัวอย่างต่อไปนี้

เริ่มเซสชันที่ได้รับสิทธิ์

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

import ee
import json
from pprint import pprint
from google.auth.transport.requests import AuthorizedSession

ee.Authenticate()  #  or !earthengine authenticate --auth_mode=gcloud

# Specify the cloud project you want associated with Earth Engine requests.
ee_project = 'your-project'

session = AuthorizedSession(
    ee.data.get_persistent_credentials().with_quota_project(ee_project)
)

เนื้อความของคำขอ

เนื้อความของคำขอคืออินสแตนซ์ของ ImageManifest ซึ่งเป็นที่ที่คุณระบุเส้นทางไปยัง COG พร้อมกับพร็อพเพอร์ตี้ที่เป็นประโยชน์อื่นๆ

ดูรายละเอียดเกี่ยวกับวิธีกำหนดค่า ImageManifest ได้ในคู่มือนี้ คุณสามารถกำหนด Tileset อย่างน้อย 1 รายการ โดยแต่ละรายการจะสร้างจากแบนด์อย่างน้อย 1 แบนด์ สำหรับ ImportExternalImage ระบบรองรับ ImageSource อย่างมาก 1 รายการต่อ Tileset

ดูรายละเอียดเกี่ยวกับการส่งออก COG ได้ในเอกสารนี้

ส่งคำขอ

ส่งคำขอ POST ไปยังปลายทาง Earth Engine projects.images.importExternal

url = f'https://earthengine.googleapis.com/v1alpha/projects/{ee_project}/image:importExternal'

response = session.post(
  url = url,
  data = json.dumps(request)
)

pprint(json.loads(response.content))