Earth Engine ออกแบบมาเพื่อให้คุณไม่ต้องกังวลเรื่องการฉายแผนที่เมื่อทำการคำนวณ เช่นเดียวกับสเกล การฉายภาพที่การคำนวณเกิดขึ้นจะกำหนดตามพื้นฐาน "การดึง" โดยเฉพาะอย่างยิ่ง ระบบจะขออินพุตในการคาดการณ์เอาต์พุต
เอาต์พุตอาจกำหนดจากพารามิเตอร์ฟังก์ชัน (เช่น crs)
เครื่องมือแก้ไขโค้ดและออบเจ็กต์แผนที่ geemap (ซึ่งมีการฉายภาพ maps
mercator (EPSG:3857)) หรือด้วยการเรียกใช้ reproject() เมื่อคุณ
แสดงรูปภาพในเครื่องมือแก้ไขโค้ดหรือ geemap ระบบจะขอข้อมูลนำเข้าใน
Mercator ของแผนที่ พิจารณาการดำเนินการต่อไปนี้ในรูปภาพ MODIS ซึ่งมีการฉายภาพแบบไซนูซอยด์
ตัวแก้ไขโค้ด (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
ลำดับการดำเนินการสำหรับตัวอย่างโค้ดนี้แสดงในแผนภาพที่ 1 โปรดทราบ ว่าการฉายภาพของอินพุตจะกำหนดโดยเอาต์พุต ซึ่งก็คือการฉายภาพ maps mercator ของการแสดงแผนที่ใน โปรแกรมแก้ไขโค้ด การฉายภาพนี้จะเผยแพร่กลับผ่านลำดับการดำเนินการเพื่อให้ระบบขอข้อมูลนำเข้าใน Mercator ของแผนที่ที่ระดับซึ่งกำหนดโดยระดับการซูมของแผนที่
ใน Earth Engine การฉายภาพจะระบุโดยระบบอ้างอิงพิกัด (CRS หรือพารามิเตอร์ crs ของหลายๆ วิธี) คุณตรวจสอบการฉายภาพ
ได้โดยเรียกใช้ projection() ในภาพนั้น
ตัวแก้ไขโค้ด (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())
โปรดทราบว่าการเรียกใช้ nominalScale() ใน ee.Projection ที่ projection() ส่งคืนจะช่วยให้คุณกำหนดความละเอียดดั้งเดิมของรูปภาพได้
ความละเอียดดั้งเดิมคือมาตราส่วนพิกเซลที่กำหนดในหน่วยเมตรของระดับต่ำสุดของ
พีระมิดรูปภาพ เนื่องจากแต่ละแถบของรูปภาพอาจมี
การปรับขนาดและ/หรือการฉายภาพที่แตกต่างกัน หากคุณเรียกใช้ projection() ในรูปภาพ
ที่มีอย่างน้อย 1 แถบซึ่งมีการฉายภาพไม่เหมือนกับแถบอื่นๆ คุณอาจเห็นข้อผิดพลาด
เช่น
การฉายเริ่มต้น
โดยทั่วไปแล้ว คุณไม่จำเป็นต้องระบุการฉายภาพ เว้นแต่คุณต้องการให้การคำนวณเกิดขึ้นในการฉายภาพที่เฉพาะเจาะจง
Earth Engine จะกำหนดให้คุณระบุการฉายภาพและ/หรือมาตราส่วนสำหรับเอาต์พุตที่ไม่ชัดเจนเท่านั้น
ความคลุมเครืออาจเกิดจาก
การลดImageCollectionที่มีรูปภาพที่มีการฉายภาพที่แตกต่างกัน
(เช่น การสร้างคอมโพสิต) รูปภาพที่เป็น
ภาพคอมโพสิตหรือภาพโมเสกของรูปภาพอินพุตที่มีการฉายภาพต่างกันจะมีการฉายภาพเริ่มต้น
ซึ่งคือ WGS84 ที่มีสเกล 1 องศา
เช่น
ตัวแก้ไขโค้ด (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())
หากพยายามใช้รูปภาพเช่นนี้ในการคำนวณ คุณอาจเห็นข้อผิดพลาด เช่น
โดยทั่วไปแล้ว การรวมที่ระดับ 1 องศาไม่เป็นที่ต้องการหรือไม่ได้ตั้งใจไว้ ดังนั้น Earth Engine จึงส่งการแจ้งเตือนที่เป็นมิตรนี้เพื่อระบุเอาต์พุตให้ครบถ้วน
ผู้ใช้มักจะสับสนกับลักษณะการทำงานนี้และกังวลเกี่ยวกับข้อมูลการฉายภาพที่ "สูญหาย" แต่ในความเป็นจริงแล้ว ระบบจะไม่คำนวณพิกเซลจนกว่าจะจำเป็น (ดูข้อมูลเพิ่มเติม) และในเวลานั้น จะมีการฉายภาพเอาต์พุตเสมอ ซึ่งมาพร้อมกับคำขอที่ระบุวิธีคำนวณคอมโพสิต
ในกรณีการใช้งานส่วนใหญ่ การไม่มีการฉายภาพไม่ใช่ปัญหา และจริงๆ แล้วเป็นการเพิ่มประสิทธิภาพที่มีประโยชน์ เนื่องจากช่วยให้ดูตัวอย่างผลลัพธ์ ที่ระดับการซูมใดก็ได้โดยไม่ต้องรอให้การคำนวณความละเอียดเต็ม เสร็จสมบูรณ์ แต่หมายความว่าเอาต์พุตอาจปรากฏแตกต่างกันที่ ระดับการซูมต่างๆ
หากรูปภาพ Display ที่เพิ่มประสิทธิภาพแล้วไม่เพียงพอ การคำนวณใน การฉายภาพที่เฉพาะเจาะจงสามารถบังคับได้โดยการฉายภาพเอาต์พุตซ้ำตามที่อธิบายไว้ในส่วนต่อไปนี้
การฉายซ้ำ
คุณบังคับให้ดำเนินการในโปรเจ็กชันที่เฉพาะเจาะจงได้ด้วยเมธอด
reproject() การใช้ reproject() จะทำให้ระบบขอข้อมูลที่ป้อน
ในการฉายภาพที่ระบุในการเรียก reproject()
การคำนวณในโค้ดก่อนเรียกใช้ฟังก์ชัน reproject() จะดำเนินการ
ในการฉายที่ระบุ เช่น หากต้องการบังคับให้สร้างคอมโพสิตใน
การฉายภาพที่เฉพาะเจาะจง ให้ทำดังนี้
ตัวแก้ไขโค้ด (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)
กรณีที่ต้องมีการคาดการณ์ที่แน่นอนมีดังนี้
- การคำนวณการไล่ระดับสี (เช่น
ee.Terrain.gradientหรือee.Terrain.slope) reduceResolutionสำหรับกรณีที่คุณต้องการรวมพิกเซลที่มีความละเอียดสูง ให้มีความละเอียดต่ำลง (ดูข้อมูลเพิ่มเติมเกี่ยวกับ การลดความละเอียด)
มีหลายเหตุผลที่คุณควรหลีกเลี่ยงการใช้ reproject() เว้นแต่จะจำเป็นจริงๆ เช่น สมมติว่าคุณฉายภาพใหม่และเพิ่มลงใน
แผนที่ หากมาตราส่วนที่คุณระบุในการเรียกใช้ reproject() มีขนาดเล็กกว่าระดับการซูมของแผนที่มาก Earth Engine จะขออินพุตทั้งหมดในมาตราส่วนที่เล็กมาก
ในช่วงเชิงพื้นที่ที่กว้างมาก ซึ่งอาจส่งผลให้มีการขอข้อมูลมากเกินไปพร้อมกันและทำให้เกิดข้อผิดพลาด
หากเอาต์พุตสุดท้ายอยู่ในการฉายภาพที่แตกต่างจากการฉายภาพที่ระบุไว้ใน
reproject()การเรียกใช้ ระบบจะทำการฉายภาพอีกครั้ง นี่เป็น
อีกเหตุผลหนึ่งที่ควรระมัดระวังในการใช้ reproject() ในโค้ด พิจารณา
ตัวอย่างต่อไปนี้ ซึ่งบังคับให้มีการฉายภาพ MODIS ใหม่เป็น WGS84 ก่อน แล้วจึงฉายภาพใหม่เป็น
maps mercator เพื่อแสดงในแผนที่ Code Editor
ตัวแก้ไขโค้ด (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
รูปที่ 2 แสดงแผนภาพลำดับการดำเนินการที่สอดคล้องกับตัวอย่างการฉายซ้ำอย่างง่ายนี้
โปรดทราบว่าการฉายภาพใหม่ครั้งแรกเป็นแบบชัดแจ้งตามที่ระบุไว้ใน
การเรียก reproject() การฉายภาพซ้ำครั้งที่ 2 เป็นการฉายภาพโดยนัย ซึ่ง Earth Engine จะดำเนินการโดยอัตโนมัติเพื่อแสดงผลลัพธ์บนแผนที่ นอกจากนี้ โปรดสังเกตว่า
ข้อมูลเกี่ยวกับภาพฉายที่จะใช้จะแพร่กระจายจากคำขอไปยังอินพุต