Proyeksi

Earth Engine dirancang agar Anda jarang perlu khawatir dengan proyeksi peta saat melakukan komputasi. Seperti halnya skala, proyeksi tempat komputasi dilakukan ditentukan berdasarkan "pull". Secara khusus, input diminta dalam proyeksi output. Output dapat ditentukan dari parameter fungsi (misalnya crs), Editor Kode, dan objek peta geemap (yang memiliki proyeksi maps mercator (EPSG:3857)), atau dengan panggilan reproject(). Saat Anda menampilkan gambar di Code Editor atau geemap, input diminta dalam maps mercator. Pertimbangkan operasi sederhana berikut pada gambar MODIS, yang memiliki Proyeksi sinusoidal:

// The input image has a SR-ORG:6974 (sinusoidal) projection.
var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0);

// Normalize the image and add it to the map.
var rescaled = image.unitScale(-2000, 10000);
var visParams = {min: 0.15, max: 0.7};
Map.addLayer(rescaled, visParams, 'Rescaled');

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection.
image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0)

# Normalize the image and add it to the map.
rescaled = image.unitScale(-2000, 10000)
vis_params = {'min': 0.15, 'max': 0.7}
m = geemap.Map()
m.add_layer(rescaled, vis_params, 'Rescaled')
m

Urutan operasi untuk contoh kode ini digambarkan dalam Gambar 1. Perhatikan bahwa proyeksi input ditentukan oleh output, khususnya proyeksi maps mercator dari tampilan peta di Code Editor. Proyeksi ini ditransmisikan kembali melalui urutan operasi sehingga input diminta dalam peta mercator, pada skala yang ditentukan oleh tingkat zoom peta.

projection
Gambar 1. Diagram alir operasi yang sesuai dengan tampilan gambar MODIS di peta Editor Kode. Proyeksi (sisi kiri diagram alir) dari setiap operasi ditentukan dari output. Garis melengkung menunjukkan alur informasi ke proyeksi ulang: khususnya, proyeksi dan skala output.

Di Earth Engine, proyeksi ditentukan oleh Sistem Referensi Koordinat (CRS atau parameter crs dari banyak metode). Anda dapat memeriksa proyeksi gambar dengan memanggil projection() di atasnya:

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0);
print('Projection, crs, and crs_transform:', image.projection());
print('Scale in meters:', image.projection().nominalScale());

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0)
display('Projection, crs, and crs_transform:', image.projection())
display('Scale in meters:', image.projection().nominalScale())

Perhatikan bahwa dengan memanggil nominalScale() pada ee.Projection yang ditampilkan oleh projection(), Anda dapat menentukan resolusi native gambar. Resolusi native adalah skala piksel nominal dalam meter dari tingkat terendah piramida gambar. Karena setiap band gambar dapat memiliki skala dan/atau proyeksi yang berbeda, jika Anda memanggil projection() pada gambar dengan minimal satu band yang tidak memiliki proyeksi yang sama dengan yang lain, Anda mungkin melihat error seperti:

Proyeksi default

Kecuali jika Anda memerlukan komputasi untuk terjadi dalam proyeksi tertentu, umumnya tidak perlu menentukan proyeksi. Earth Engine hanya akan mengharuskan Anda menentukan proyeksi dan/atau skala untuk output yang ambigu. Ambiguitas dapat terjadi karena mengurangi ImageCollection yang berisi gambar dengan proyeksi yang berbeda (yaitu membuat komposit). Gambar yang merupakan gabungan atau mosaik gambar input dengan proyeksi yang berbeda akan memiliki proyeksi default, yaitu WGS84 dengan skala 1 derajat. Contoh:

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic();
print(mosaic.projection());

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic()
display(mosaic.projection())

Jika Anda mencoba menggunakan gambar seperti ini dalam komputasi, Anda mungkin melihat error seperti:

Umumnya, agregasi pada skala 1 derajat tidak diinginkan atau dimaksudkan, sehingga Earth Engine memberikan pengingat ini untuk memberikan spesifikasi lengkap untuk output.

Pengguna sering kali merasa perilaku ini membingungkan dan khawatir dengan informasi proyeksi yang "hilang", tetapi piksel sebenarnya tidak dihitung hingga diperlukan (pelajari lebih lanjut), dan pada saat itu, selalu ada proyeksi output yang menyertai permintaan yang menentukan cara menghitung komposit.

Dalam sebagian besar kasus penggunaan, tidak memiliki proyeksi bukanlah masalah dan sebenarnya merupakan pengoptimalan yang berharga, karena memungkinkan pratinjau hasil pada tingkat zoom apa pun tanpa harus menunggu komputasi resolusi penuh selesai. Namun, hal ini berarti bahwa output dapat muncul berbeda pada tingkat zoom yang berbeda.

Jika gambar tampilan yang dioptimalkan tidak memadai, komputasi dalam proyeksi tertentu dapat dipaksa dengan memproyeksikan ulang output seperti yang dijelaskan di bagian berikut.

Melakukan re-project

Anda dapat memaksa operasi untuk dilakukan dalam proyeksi tertentu dengan metode reproject(). Penggunaan reproject() akan menghasilkan input yang diminta dalam proyeksi yang ditentukan dalam panggilan reproject(). Komputasi dalam kode Anda sebelum panggilan reproject() akan dilakukan dalam proyeksi yang ditentukan. Misalnya, untuk memaksa komposit dibuat dalam proyeksi tertentu:

// Some projection that is suitable for your area of interest.
var proj = ee.Projection(...);
var output = collection.reduce(...).reproject(proj);

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap
# Some projection that is suitable for your area of interest.
proj = ee.Projection(...)
output = collection.reduce(...).reproject(proj)

Beberapa kasus yang memerlukan proyeksi tetap mencakup:

  • Menghitung gradien (misalnya, ee.Terrain.gradient atau ee.Terrain.slope).
  • reduceResolution, untuk saat Anda ingin menggabungkan piksel resolusi yang lebih tinggi ke dalam resolusi yang lebih rendah. (Pelajari lebih lanjut cara mengurangi resolusi).

Ada beberapa alasan Anda harus menghindari penggunaan reproject() kecuali jika benar-benar diperlukan. Misalnya, Anda mereproject sesuatu dan menambahkannya ke peta. Jika skala yang Anda tentukan dalam panggilan reproject() jauh lebih kecil dari tingkat zoom peta, Earth Engine akan meminta semua input dalam skala yang sangat kecil, di atas cakupan spasial yang sangat luas. Hal ini dapat menyebabkan terlalu banyak data diminta sekaligus dan menyebabkan error.

Jika output akhirnya berada dalam proyeksi yang berbeda dengan yang ditentukan dalam panggilan reproject(), hal itu akan menghasilkan re-proyeksi lain. Ini adalah alasan lain untuk berhati-hati dalam menggunakan reproject() dalam kode Anda. Pertimbangkan contoh berikut, yang memaksa gambar MODIS untuk pertama-tama diproyeksikan ulang ke WGS84, lalu diproyeksikan ulang ke maps mercator untuk ditampilkan di peta Code Editor:

// The input image has a SR-ORG:6974 (sinusoidal) projection.
var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0);

// Operations *before* the reproject call will be done in the projection
// specified by reproject().  The output results in another reprojection.
var reprojected = image
    .unitScale(-2000, 10000)
    .reproject('EPSG:4326', null, 500);
Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

import ee
import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection.
image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0)

# Operations *before* the reproject call will be done in the projection
# specified by reproject(). The output results in another reprojection.
reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500)
m = geemap.Map()
m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected')
m

Gambar 2 menggambarkan alur operasi yang sesuai dengan contoh reproject sederhana ini. Perhatikan bahwa re-proyeksi pertama bersifat eksplisit, seperti yang ditentukan dalam panggilan reproject(). Proyeksi ulang kedua bersifat implisit, yang dilakukan oleh Earth Engine secara otomatis untuk menampilkan hasilnya di peta. Perhatikan juga bahwa informasi tentang proyeksi yang akan digunakan disebarkan kembali dari permintaan ke input.

proyeksi ulang
Gambar 2. Diagram alir operasi yang sesuai dengan proyeksi ulang gambar MODIS di peta Editor Kode. Garis melengkung menunjukkan alur informasi ke proyeksi ulang: khususnya, proyeksi dan skala output.