Earth Engine didesain agar Anda jarang perlu khawatir tentang proyeksi peta saat
melakukan penghitungan. Seperti skala, proyeksi tempat penghitungan dilakukan ditentukan berdasarkan basis "tarik".
Secara khusus, input diminta dalam proyeksi output. Output dapat ditentukan dari parameter fungsi (misalnya, crs),
objek peta Code Editor dan geemap (yang memiliki proyeksi peta mercator (EPSG:3857)), atau dengan panggilan reproject(). Saat Anda
menampilkan gambar di Code Editor atau geemap, input akan diminta di
peta mercator. Pertimbangkan operasi berikut pada gambar MODIS, yang memiliki proyeksi sinusoidal:
Editor Kode (JavaScript)
// 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');
import ee import geemap.core as geemap
Colab (Python)
# 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 Diagram 1. Perhatikan bahwa proyeksi input ditentukan oleh output, khususnya proyeksi peta mercator dari tampilan peta di Code Editor. Proyeksi ini menyebar kembali melalui urutan operasi sehingga input diminta di peta mercator, pada skala yang ditentukan oleh tingkat zoom peta.
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 gambar tersebut:
Editor Kode (JavaScript)
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());
import ee import geemap.core as geemap
Colab (Python)
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 asli gambar. Resolusi asli 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 setidaknya satu band yang tidak memiliki proyeksi yang sama dengan yang lain, Anda mungkin akan melihat error seperti:
Proyeksi default
Kecuali jika Anda memerlukan penghitungan terjadi dalam proyeksi tertentu, umumnya
tidak perlu menentukan proyeksi. Hanya untuk output yang ambigu, Earth Engine
akan meminta Anda menentukan proyeksi dan/atau skala. Ambiguitas dapat terjadi karena
mengurangi ImageCollection yang berisi gambar dengan proyeksi yang berbeda
(yaitu membuat komposit). Gambar yang merupakan
komposit atau mosaik gambar input dengan proyeksi yang berbeda akan memiliki proyeksi default, yaitu WGS84 dengan skala 1 derajat.
Jika proyeksi default ini tidak sesuai untuk analisis Anda (misalnya, terlalu
kasar, atau Anda perlu mencegah artefak pengambilan sampel ulang dalam penghitungan hilir
seperti analisis medan), Anda dapat menetapkan default yang berbeda menggunakan
image.setDefaultProjection(crs). Hal ini memastikan bahwa jika Earth
Engine perlu memilih proyeksi untuk penghitungan yang melibatkan gambar,
proyeksi yang akan digunakan adalah proyeksi yang ditentukan, bukan WGS84 pada skala 1 derajat.
Contoh:
Editor Kode (JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
Colab (Python)
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 penghitungan, Anda mungkin akan melihat error seperti:
Umumnya, agregasi pada skala 1 derajat tidak diinginkan atau dimaksudkan, sehingga Earth Engine memberikan pengingat yang mudah dipahami ini untuk memberikan spesifikasi lengkap untuk output.
Pengguna sering kali merasa bingung dengan perilaku ini dan khawatir tentang 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 penghitungan resolusi penuh selesai. Namun, hal ini berarti output dapat terlihat berbeda pada tingkat zoom yang berbeda.
Jika gambar tampilan yang dioptimalkan entah bagaimana tidak cukup, penghitungan dalam proyeksi tertentu dapat dipaksakan dengan memproyeksikan ulang output seperti yang dijelaskan di bagian berikut.
Memproyeksikan ulang
Anda dapat memaksa operasi untuk dilakukan dalam proyeksi tertentu dengan metode
reproject(). Penggunaan reproject() akan menyebabkan input diminta dalam proyeksi yang ditentukan dalam panggilan reproject().
Penghitungan dalam kode Anda sebelum panggilan reproject() akan dilakukan
dalam proyeksi yang ditentukan. Misalnya, untuk memaksa komposit diproduksi dalam a
proyeksi tertentu:
Editor Kode (JavaScript)
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
Colab (Python)
# 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.gradientatauee.Terrain.slope). reduceResolution, untuk saat Anda ingin menggabungkan piksel resolusi yang lebih tinggi ke resolusi yang lebih rendah. (Pelajari lebih lanjut cara mengurangi resolusi).
Fungsi dalam paket ee.Terrain (misalnya, slope,
aspect, hillshade) menghitung nilai berdasarkan piksel tetangga
dan sensitif terhadap artefak pengambilan sampel ulang yang diperkenalkan selama
proyeksi ulang. Jika proyeksi penghitungan berbeda dengan proyeksi asli DEM, pengambilan sampel ulang tetangga terdekat default dapat membuat
pola buatan dalam output. Untuk hasil terbaik, lakukan analisis medan dalam proyeksi asli DEM. Jika menggunakan
ImageCollection ubin DEM, buat mosaik dan gunakan
setDefaultProjection() dengan proyeksi asli koleksi untuk memastikan analisis berjalan di petak yang benar, seperti yang dijelaskan
di bagian Proyeksi default.
Ada beberapa alasan mengapa Anda harus menghindari penggunaan reproject() kecuali jika Anda
benar-benar memerlukannya. Misalnya, Anda memproyeksikan ulang sesuatu dan menambahkannya ke
peta. Jika skala yang Anda tentukan dalam panggilan reproject() jauh lebih kecil
daripada tingkat zoom peta, Earth Engine akan meminta semua input pada skala yang sangat kecil
di atas rentang spasial yang sangat luas. Hal ini dapat menyebabkan terlalu banyak data yang
diminta sekaligus dan menyebabkan error.
Jika output akhir berada dalam proyeksi yang berbeda dari yang ditentukan dalam the
reproject() panggilan, hal tersebut akan menghasilkan proyeksi ulang lain. Ini adalah
alasan lain untuk berhati-hati dalam menggunakan reproject() dalam kode Anda. Pertimbangkan
contoh berikut, yang memaksa gambar MODIS untuk diproyeksikan ulang terlebih dahulu ke
WGS84, lalu diproyeksikan ulang ke
peta mercator untuk ditampilkan di peta Code Editor:
Editor Kode (JavaScript)
// 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');
import ee import geemap.core as geemap
Colab (Python)
# 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
Diagram 2 menggambarkan alur operasi yang sesuai dengan contoh proyeksi ulang sederhana ini. Perhatikan bahwa proyeksi ulang pertama bersifat eksplisit, seperti yang ditentukan dalam
reproject() panggilan. Proyeksi ulang kedua bersifat implisit, yang dilakukan oleh
Earth Engine secara otomatis untuk menampilkan hasil di peta. Perhatikan juga bahwa informasi tentang proyeksi yang akan digunakan menyebar kembali dari permintaan ke input.