Đăng ký thành phần GeoTIFF (COG) được tối ưu hoá cho đám mây

Earth Engine hỗ trợ các thành phần được sao lưu bằng GeoTIFF được tối ưu hoá cho đám mây (COG) được lưu trữ trong Google Cloud Storage (GCS).

Khi bạn đăng ký một thành phần được sao lưu bằng COG, Earth Engine sẽ lập chỉ mục các trường siêu dữ liệu và không gian của hình ảnh tại thời điểm tạo. Điều này giúp hình ảnh hoạt động hiệu quả khi được dùng trong các bộ sưu tập, với hiệu suất tương đương với các thành phần được tiếp nhận tiêu chuẩn (xem phần Tổng quan về GeoTIFF được tối ưu hoá cho đám mây (COG)).

Điều kiện tiên quyết và cách thiết lập Cloud Storage

Trước khi đăng ký COG, bạn phải thiết lập đúng cách các tài nguyên Google Cloud Storage.

1. Vị trí bộ chứa (yêu cầu nghiêm ngặt)

Để Earth Engine truy cập vào bộ chứa Cloud Storage, bộ chứa đó phải nằm ở một trong các khu vực trung tâm dữ liệu hoặc nhiều khu vực sau:

  • Nhiều khu vực us
  • Mọi khu vực kép ở Hoa Kỳ bao gồm us-central1
  • Khu vực us-central1

Nếu bộ chứa của bạn được đặt ở bất kỳ trung tâm dữ liệu khu vực nào khác (chẳng hạn như us-east4 hoặc europe-west1), Earth Engine sẽ từ chối yêu cầu đăng ký và đọc.

2. Lớp bộ nhớ và tính năng thanh toán

  • Bạn nên sử dụng lớp bộ nhớ Tiêu chuẩn. Bộ nhớ tiêu chuẩn không có quy tắc về thời gian lưu trữ tối thiểu, giúp ngăn chặn các khoản phạt thanh toán khi xoá sớm nếu bạn cập nhật hoặc thay thế các tệp tạm thời.
  • Mặc dù các vòng lặp tính toán của Earth Engine không phải chịu phụ phí truy xuất dữ liệu Cloud Storage, nhưng việc truy cập vào các bậc bộ nhớ không phải là bậc Tiêu chuẩn từ các công cụ bên ngoài (chẳng hạn như phần mềm GIS trên máy tính) sẽ phải chịu phí truy xuất tốn kém.
  • Bạn phải bật tính năng thanh toán trong dự án Google Cloud để sử dụng GCS. Hãy xem bài viết Bắt đầu nhanh với Google Cloud Storage để bắt đầu.

Bước 1: Chuẩn bị COG

Bạn phải tối ưu hoá các tệp TIFF cho đám mây. Tệp TIFF phải là:

  • Được xếp theo ô, với kích thước ô là: 256x256, 512x512, 1024x1024 hoặc 2048x2048. Bạn nên dùng kích thước 512x512 trở lên để có hiệu suất tốt nhất.
  • Được sắp xếp sao cho tất cả Thư mục tệp hình ảnh (IFD) đều ở đầu.
  • Bao gồm thông tin tổng quan về luỹ thừa của 2.
  • Sử dụng phương thức xen kẽ BAND.

Bạn có thể dùng GDAL để chuyển đổi hình ảnh.

Sử dụng trình điều khiển GDAL COG (nên dùng GDAL >= 3.1):

gdal_translate in.tif out.tif \
  -of COG \
  -co BIGTIFF=YES \
  -co OVERVIEWS=IGNORE_EXISTING \
  -co COMPRESS=ZSTD \
  -co LEVEL=16 \
  -co BLOCKSIZE=512 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS \
  -co PREDICTOR=2  # 2 for integers, 3 for floating point

Sử dụng trình điều khiển GTiff tiêu chuẩn:

Trước tiên, hãy tạo thông tin tổng quan về luỹ thừa của 2 (sử dụng gdal raster overview add hoặc gdaladdo), sau đó sao chép hình ảnh và thông tin tổng quan vào bố cục COG được xếp theo ô:

gdaladdo -r nearest in.tif 2 4 8 16 32  # or -r cubic for continuous/float data

gdal_translate in.tif out.tif \
  -co BIGTIFF=YES \
  -co COPY_SRC_OVERVIEWS=YES \
  -co TILED=YES \
  -co BLOCKXSIZE=512 \
  -co BLOCKYSIZE=512 \
  -co COMPRESS=ZSTD \
  -co ZSTD_LEVEL=16 \
  -co INTERLEAVE=BAND \
  -co NUM_THREADS=ALL_CPUS \
  -co PREDICTOR=2  # 2 for integers, 3 for floating point

Bước 2: Tạo tệp kê khai

Cho dù bạn đăng ký COG bằng thư viện ứng dụng Python của Earth Engine, công cụ dòng lệnh earthengine hay Earth Engine REST API, bạn phải xác định tệp kê khai tải hình ảnh lên, chỉ định đích đến của thành phần, URI Google Cloud Storage và siêu dữ liệu dải màu không bắt buộc.

Ví dụ: Một COG sao lưu tất cả dải màu Nếu COG của bạn chứa tất cả dải màu (ví dụ: RGB), thì tệp kê khai chỉ yêu cầu một bộ ô:

{
  "name": "projects/my-project/assets/my_cog_asset",
  "tilesets": [
    {
      "id": "default_tileset",
      "sources": [
        {
          "uris": [
            "gs://google-sample-bucket/my_optimized_image.tif"
          ]
        }
      ]
    }
  ]
}

Ví dụ: Nhiều COG (Mỗi dải màu một COG) Nếu bạn có các tệp riêng cho các dải màu khác nhau (ví dụ: Đỏ, Xanh lục, Xanh dương trong các tệp riêng):

{
  "name": "projects/my-project/assets/my_multi_band_cog",
  "tilesets": [
    {
      "id": "red_tileset",
      "sources": [ { "uris": [ "gs://google-sample-bucket/band_red.tif" ] } ]
    },
    {
      "id": "green_tileset",
      "sources": [ { "uris": [ "gs://google-sample-bucket/band_green.tif" ] } ]
    }
  ],
  "bands": [
    { "id": "R", "tilesetId": "red_tileset", "tilesetBandIndex": 0 },
    { "id": "G", "tilesetId": "green_tileset", "tilesetBandIndex": 0 }
  ]
}

Bước 3: Gửi yêu cầu đăng ký

Bạn có thể gửi tệp kê khai của mình đến Earth Engine bằng thư viện ứng dụng Python của Earth Engine, công cụ dòng lệnh earthengine hoặc Earth Engine REST API. Hãy chọn phương thức phù hợp nhất với quy trình làm việc của bạn.

Thư viện ứng dụng Python

Trong tập lệnh Python hoặc sổ tay Jupyter, hãy sử dụng thư viện ứng dụng Python của Earth Engine (ee.data) sau khi khởi chạy dự án:

import ee

# 1. Authenticate and initialize
ee.Authenticate()
ee.Initialize(project='your-project-id')

# 2. Define the manifest as a Python dictionary
manifest = {
  "name": "projects/your-project-id/assets/my_cog_asset",
  "tilesets": [
    {
      "id": "default_tileset",
      "sources": [
        {
          "uris": [
            "gs://google-sample-bucket/my_optimized_image.tif"
          ]
        }
      ]
    }
  ]
}

# 3. Start the ingestion task (allow_overwrite=True corresponds to --force)
result = ee.data.startExternalImageIngestion(manifest, allow_overwrite=True)
print(f"Asset registered: {result['name']}")
      

Công cụ dòng lệnh

Trong thiết bị đầu cuối, hãy lưu tệp kê khai vào một tệp có tên là manifest.json và chạy lệnh tải lên earthengine command:

# 1. Verify your environment is authenticated
earthengine authenticate

# 2. Submit the external image upload task
earthengine --project your-project-id \
  upload external_image \
  --manifest manifest.json
      

REST API (Python)

Đối với các quy trình làm việc tự động mà không có thư viện ứng dụng, hãy gửi trực tiếp yêu cầu được uỷ quyền POST đến điểm cuối Earth Engine API REST projects.image.importExternal (được minh hoạ ở đây bằng Python):

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

# 1. Authenticate and start an authorized HTTP session
ee.Authenticate()
ee_project = 'your-project-id'
session = AuthorizedSession(
    ee.data.get_persistent_credentials().with_quota_project(ee_project)
)

# 2. Define the REST request body wrapping the manifest
request = {
  'imageManifest': {
    'name': f'projects/{ee_project}/assets/my_cog_asset',
    'tilesets': [
      {
        'id': 'default_tileset',
        'sources': [
          {
            'uris': [
              'gs://google-sample-bucket/my_optimized_image.tif'
            ]
          }
        ]
      }
    ]
  }
}

# 3. Send the POST request
url = (
    'https://earthengine.googleapis.com/v1alpha/'
    f'projects/{ee_project}/image:importExternal'
)
response = session.post(url=url, data=json.dumps(request))
pprint(json.loads(response.content))
      

Sau khi gửi, yêu cầu đăng ký sẽ khởi chạy thao tác lập chỉ mục siêu dữ liệu đơn giản. Vì quá trình đăng ký COG không sao chép dữ liệu pixel, nên thao tác này thường hoàn tất trong vài giây.

Quy tắc hạn chế trong tệp kê khai đối với các thành phần COG

Khi tạo tệp kê khai cho các thành phần được sao lưu bằng COG, hãy lưu ý những quy tắc hạn chế nghiêm ngặt này (khác với tệp kê khai tiếp nhận tiêu chuẩn):

  • Một bộ chứa: Tất cả URI trong tệp kê khai phải nằm trong cùng một bộ chứa GCS.
  • Một URI cho mỗi nguồn: Mỗi ImageSource phải chứa chính xác một URI. Bạn không thể ghép nhiều tệp lại với nhau thành một nguồn bộ ô. Để ghép nhiều cảnh COG, hãy đăng ký từng COG dưới dạng một thành phần và kết hợp chúng thành một ee.ImageCollection bằng cách sử dụng .mosaic().
  • Không có mask_bands: Không hỗ trợ mask_bands ở cấp cao nhất. Sử dụng missingData trong tệp kê khai hoặc đảm bảo tệp TIFF của bạn có giá trị nodata nội bộ.
  • Không có data_type trong bộ ô: Không chỉ định data_type trong phần tilesets ; hệ thống sẽ tự động phát hiện.
  • Không có dimensions trong nguồn: Không chỉ định dimensions trong ImageSource.
  • Không có subdataset_prefix / subdataset_suffix.
  • Không có min_tile_area_ratio hoặc skip_metadata_read.

Bước 4: Định cấu hình quyền (rất quan trọng để chia sẻ)

Không giống như các thành phần Earth Engine tiêu chuẩn, dữ liệu pixel của COG vẫn nằm trong GCS. Khi chia sẻ một thành phần được sao lưu bằng COG với người khác, bạn phải cấp cho họ quyền đọc cả thành phần Earth Engine và các tệp GCS.

1. Cấp quyền cho bộ chứa GCS

Cộng tác viên cần có quyền đọc các tệp trong GCS.

Các quyền bắt buộc:

  • storage.buckets.get (để truy xuất siêu dữ liệu và vị trí của bộ chứa)
  • storage.objects.get (để đọc dữ liệu pixel)

Bạn có thể cấp các quyền này bằng các vai trò Cloud Storage tiêu chuẩn sau:

  • Storage Bucket Viewer (cung cấp storage.buckets.get để đọc siêu dữ liệu và vị trí của bộ chứa)
  • Storage Object Viewer (cung cấp storage.objects.get để đọc dữ liệu pixel)

Các bước định cấu hình trong Google Cloud Console:

  1. Chuyển đến Trình duyệt Cloud Storage.
  2. Nhấp vào tên bộ chứa của bạn.
  3. Chọn thẻ Permissions (Quyền).
  4. Nhấp vào GRANT ACCESS (CẤP QUYỀN TRUY CẬP).
  5. Thêm địa chỉ email của cộng tác viên (hoặc nhóm trên Google Groups hoặc allUsers để truy cập công khai).
  6. Chỉ định các vai trò Storage Bucket Viewer và Storage Object Viewer.
  7. Nhấp vào Lưu.

2. Chia sẻ thành phần Earth Engine

Chia sẻ chính thành phần đó bằng Trình quản lý thành phần Earth Engine hoặc CLI. Xem Hướng dẫn quản lý thành phần để biết thông tin chi tiết.

Quản lý các thế hệ đối tượng

Khi bạn đăng ký COG, Earth Engine sẽ lưu trữ thế hệ (phiên bản) cụ thể của đối tượng GCS. Nếu bạn cập nhật tệp trong GCS, thế hệ của tệp đó sẽ thay đổi.

  • Theo mặc định, Earth Engine sẽ không tải được thành phần và trả về lỗi: Failed to load the GeoTIFF at gs://google-sample-bucket/my-object#old-generation.
  • Điều này được thiết kế để ngăn siêu dữ liệu (chẳng hạn như phép chiếu hoặc vùng phủ sóng) không đồng bộ với các pixel cơ bản.
  • Phương pháp hay nhất: Nếu bạn cần cập nhật dữ liệu hình ảnh cơ bản, hãy đăng ký dữ liệu đó dưới dạng thành phần mới hoặc chạy lại lệnh tải lên bằng cờ --force thay vì ghi đè các tệp tại chỗ:

    earthengine --project your-project-id upload external_image --force --manifest manifest.json
    

Sử dụng các thành phần đã đăng ký

Sau khi đăng ký, bạn có thể truy cập vào một thành phần được sao lưu bằng COG trong các tập lệnh Earth Engine giống như bất kỳ thành phần hình ảnh được tiếp nhận tiêu chuẩn nào:

JavaScript

var image = ee.Image('projects/your-project-id/assets/my_cog_asset');

Python

image = ee.Image('projects/your-project-id/assets/my_cog_asset')