การคาดการณ์

Earth Engine ได้รับการออกแบบมาเพื่อให้คุณไม่ต้องกังวลเกี่ยวกับโปรเจ็กชันแผนที่เมื่อทำการคํานวณ เช่นเดียวกับสเกล การฉายที่ใช้คำนวณจะกำหนดตาม "การดึง" กล่าวโดยละเอียดคือ ระบบจะขออินพุตในการคาดการณ์เอาต์พุต เอาต์พุตอาจกำหนดจากพารามิเตอร์ฟังก์ชัน (เช่น crs) เครื่องมือแก้ไขโค้ด และออบเจ็กต์แผนที่ geemap (ซึ่งมีโปรเจ็กชัน maps Mercator (EPSG:3857)) หรือใช้การเรียก reproject() เมื่อคุณแสดงรูปภาพในเครื่องมือแก้ไขโค้ดหรือ geemap ระบบจะขออินพุตใน maps mercator ลองดูการดำเนินการง่ายๆ ต่อไปนี้กับรูปภาพ MODIS ซึ่งมีโปรเจ็กชันไซน์

// 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');

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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

ลําดับการดําเนินการของตัวอย่างโค้ดนี้มีแผนภาพแสดงอยู่ในรูปที่ 1 โปรดทราบว่าการโปรเจ็กต์ของอินพุตจะกำหนดโดยเอาต์พุต โดยเฉพาะการโปรเจ็กต์ maps mercator ของการแสดงแผนที่ในเครื่องมือแก้ไขโค้ด การฉายภาพนี้จะส่งต่อกลับผ่านลำดับการดำเนินการต่างๆ เพื่อให้ระบบขออินพุตในแผนที่ Mercator ที่มาตราส่วนซึ่งกำหนดโดยระดับการซูมของแผนที่

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

ใน Earth Engine การฉายภาพจะระบุด้วยระบบพิกัดอ้างอิง (CRS หรือพารามิเตอร์ crs ของหลายวิธี) คุณสามารถตรวจสอบการฉายภาพได้โดยเรียกใช้ projection() กับรูปภาพ

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());

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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())

โปรดทราบว่าการเรียก nominalScale() ใน ee.Projection ที่ projection() แสดงผลจะช่วยให้คุณระบุความละเอียดของภาพแบบเนทีฟได้ ความละเอียดระดับต้นฉบับคือสเกลพิกเซลโดยประมาณเป็นเมตรของระดับต่ำสุดของปิรามิดรูปภาพ เนื่องจากแต่ละย่านของรูปภาพอาจมีมาตราส่วนและ/หรือการฉายภาพที่แตกต่างกัน หากคุณเรียกใช้ projection() ในรูปภาพที่มีย่านอย่างน้อย 1 ย่านซึ่งไม่มีการฉายภาพเดียวกันกับย่านอื่นๆ คุณอาจเห็นข้อผิดพลาด เช่น

การฉายภาพเริ่มต้น

โดยทั่วไปแล้ว คุณไม่จำเป็นต้องระบุการประมาณ เว้นแต่จะต้องการคำนวณในโปรเจ็กชันที่เฉพาะเจาะจง Earth Engine จะกำหนดให้คุณระบุการฉายและ/หรือมาตราส่วนเฉพาะในกรณีที่ผลลัพธ์มีความคลุมเครือเท่านั้น ความคลุมเครืออาจเกิดจาก การลด ImageCollection ที่มีรูปภาพที่มีการฉายภาพต่างกัน (เช่น การสร้างภาพรวม) รูปภาพที่เกิดจากการรวมหรือต่อภาพโมเสคของรูปภาพอินพุตที่มีการฉายภาพต่างกันจะมีการฉายภาพเริ่มต้น ซึ่งเป็น WGS84 ที่ใช้มาตราส่วน 1 องศา เช่น

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

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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())

หากพยายามใช้รูปภาพเช่นนี้ในการคำนวณ คุณอาจเห็นข้อผิดพลาด เช่น

โดยทั่วไปแล้ว การรวมข้อมูลในระดับ 1 องศาไม่ใช่สิ่งที่ต้องการหรือตั้งใจ ดังนั้น Earth Engine จึงขอแจ้งเตือนให้ระบุข้อกำหนดที่สมบูรณ์สำหรับเอาต์พุต

ผู้ใช้มักพบว่าลักษณะการทํางานนี้สร้างความสับสนและกังวลเกี่ยวกับข้อมูล "ที่หายไป" ของโปรเจ็กชัน แต่ระบบจะไม่ประมวลผลพิกเซลจนกว่าจะจําเป็น (ดูข้อมูลเพิ่มเติม) และเมื่อถึงจุดนั้น โปรเจ็กชันเอาต์พุตจะมาพร้อมกับคําขอที่ระบุวิธีคํานวณคอมโพสิตเสมอ

ใน Use Case ส่วนใหญ่ การไม่มีการแสดงผลภาพไม่ใช่ปัญหา และเป็นการเพิ่มประสิทธิภาพที่มีประโยชน์ เนื่องจากช่วยให้คุณดูตัวอย่างผลลัพธ์ในระดับการซูมใดก็ได้โดยไม่ต้องรอให้การคำนวณความละเอียดเต็มรูปแบบเสร็จสมบูรณ์ แต่หมายความว่าเอาต์พุตอาจปรากฏแตกต่างกันไปตามระดับการซูม

หากรูปภาพที่แสดงซึ่งได้รับการเพิ่มประสิทธิภาพไม่เพียงพอ คุณสามารถบังคับให้ใช้การประมาณในโปรเจ็กชันที่เฉพาะเจาะจงได้โดยการโปรเจ็กต์เอาต์พุตอีกครั้งตามที่อธิบายไว้ในส่วนต่อไปนี้

การเปลี่ยนโปรเจ็กต์

คุณสามารถบังคับให้ดำเนินการในโปรเจ็กชันที่เฉพาะเจาะจงด้วยเมธอด reproject() การใช้ reproject() จะส่งผลให้มีการขออินพุตในโปรเจ็กชันที่ระบุในการเรียกใช้ reproject() การคํานวณในโค้ดก่อนการเรียกใช้ reproject() จะทําในโปรเจ็กชันที่ระบุ เช่น หากต้องการบังคับให้สร้างภาพคอมโพสิตในโปรเจ็กชันที่เจาะจง ให้ทำดังนี้

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

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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)

ตัวอย่างบางกรณีที่ต้องใช้การฉายภาพแบบคงที่ ได้แก่

มีเหตุผลหลายประการที่คุณควรหลีกเลี่ยงการใช้ reproject() เว้นแต่คุณจะจําเป็นต้องใช้จริงๆ ตัวอย่างเช่น สมมติว่าคุณปรับโปรเจ็กต์ใหม่และเพิ่มลงในแผนที่ หากมาตราส่วนที่ระบุในคําเรียก reproject() เล็กกว่าระดับการซูมของแผนที่มาก Earth Engine จะขออินพุตทั้งหมดในมาตราส่วนที่เล็กมากในพื้นที่ที่กว้างมาก ซึ่งอาจส่งผลให้มีการขอข้อมูลมากเกินไปในครั้งเดียวและทำให้เกิดข้อผิดพลาด

หากเอาต์พุตสุดท้ายอยู่ในการฉายภาพอื่นจากที่กำหนดไว้ในreproject()การเรียกใช้ จะเป็นการฉายภาพใหม่อีกครั้ง นี่เป็นเหตุผลอีกประการหนึ่งที่คุณควรระมัดระวังในการใช้ reproject() ในโค้ด ลองดูตัวอย่างต่อไปนี้ ซึ่งจะบังคับให้โปรเจ็กต์รูปภาพ MODIS ใหม่เป็น WGS84 ก่อน จากนั้นโปรเจ็กต์ใหม่เป็น maps mercator เพื่อแสดงในแผนที่ตัวแก้ไขโค้ด

// 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');

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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

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

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