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');
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 ที่มาตราส่วนซึ่งกำหนดโดยระดับการซูมของแผนที่

ใน 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());
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());
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);
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)
ตัวอย่างบางกรณีที่ต้องใช้การฉายภาพแบบคงที่ ได้แก่
- การประมวลผลไล่ระดับสี (เช่น
ee.Terrain.gradient
หรือee.Terrain.slope
) reduceResolution
สำหรับกรณีที่คุณต้องการรวบรวมพิกเซลที่มีความละเอียดสูงกว่าให้เป็นความละเอียดต่ำ (ดูข้อมูลเพิ่มเติมเกี่ยวกับการลดความละเอียด)
มีเหตุผลหลายประการที่คุณควรหลีกเลี่ยงการใช้ 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');
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 จะดำเนินการโดยอัตโนมัติเพื่อแสดงผลลัพธ์บนแผนที่ และโปรดสังเกตว่าข้อมูลเกี่ยวกับโปรเจ็กชันที่จะใช้จะส่งกลับจากคำขอไปยังอินพุต
