Earth Engine תוכנן כך שבדרך כלל לא צריך לדאוג לגבי הקרנות של מפות כשמבצעים חישובים. בדומה לסולם, התצוגה שבה מתבצעים החישובים נקבעת על בסיס 'משיכה'. באופן ספציפי, הבקשות לקלט מופיעות בתחזית הפלט. אפשר לקבוע את הפלט לפי פרמטר של פונקציה (למשל crs
), לפי אובייקטים של מפה ב-Code Editor וב-geemap (עם הקרנה של maps Mercator (EPSG:3857)) או באמצעות קריאה ל-reproject()
. כשמציגים תמונות ב-Code Editor או ב-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. חשוב לזכור שהמיקום של הקלט נקבע לפי הפלט, ובמיוחד לפי המיקום של מפות 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()
בתמונה עם לפחות פס אחד שאין לו את אותה פרויקציה כמו שאר הפסים, עשויה להופיע הודעת שגיאה כמו:
הקרנה שמוגדרת כברירת מחדל
בדרך כלל אין צורך לציין הקרנה, אלא אם אתם צריכים שהחישוב יתבצע בהקרנה ספציפית. רק בפלט לא ברור תתבקשו ב-Earth Engine לציין הקרנה ו/או קנה מידה. אי-בהירות יכולה לנבוע מצמצום של ImageCollection
שמכיל תמונות עם תצוגות שונות (כלומר יצירת קומפוזיציה). תמונה שהיא תמונה מורכבת או פסיפס של תמונות קלט עם תצוגות שונות תהיה עם תצוגת ברירת המחדל, WGS84 עם קנה מידה של מעלה אחת.
לדוגמה:
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())
אם תנסו להשתמש בתמונה כזו במהלך חישוב, יכול להיות שתופיע הודעת שגיאה כמו:
בדרך כלל, לא רוצים או מתכוונים לקבל צבירת נתונים ברמת דגימה של מעלה אחת, ולכן מוצגת ב-Earth Engine תזכורת ידידותית עם המלצה לספק מפרט מלא של הפלט.
לרוב, המשתמשים מתבלבלים מההתנהגות הזו ומדאיגים אותם פרטי התצוגה 'האבודים', אבל בפועל, החישוב של הפיקסלים מתבצע רק כשיש צורך בהם (מידע נוסף). בשלב הזה, תמיד יש תצוגה של פלט שמצורפת לבקשה, שבה מצוין איך לחשב את התצוגה המשולבת.
ברוב תרחישים לדוגמה, היעדר הקרנה לא מהווה בעיה, אלא למעשה אופטימיזציה שימושית, כי היא מאפשרת להציג תצוגה מקדימה של התוצאות בכל רמת זום בלי לחכות לסיום החישוב ברזולוציה המלאה. עם זאת, פירוש הדבר הוא שהפלט יכול להיראות שונה ברמות זום שונות.
אם התמונה הממוטבת של המסך לא מספיקה מסיבה כלשהי, אפשר לאלץ את החישוב ב投影 ספציפי על ידי הקרנה מחדש של הפלט, כפי שמתואר בקטע הבא.
הקרנה מחדש
אפשר לאלץ את הפעולות להתבצע בתצוגה ספציפית באמצעות השיטה 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 כדי להציג אותה במפה של 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');
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()
. הקרנת המשנה השנייה היא משתמעת, והיא מתבצעת באופן אוטומטי על ידי Earth Engine כדי להציג את התוצאה במפה. שימו לב גם שהמידע על הישות שבה צריך להשתמש מופץ חזרה מהבקשה לקלט.
