תחזיות

מערכת Earth Engine מתוכננת כך שרק לעיתים רחוקות צריך לדאוג לגבי היטלי מפה כשמבצעים חישובים. בדומה לקנה מידה, ההיטל שבו מתבצעים החישובים נקבע על בסיס 'משיכה'. באופן ספציפי, הקלטים נדרשים בהקרנת הפלט. יכול להיות שהפלט ייקבע מפרמטר של פונקציה (למשל crs), מ-Code Editor ומאובייקטים של מפות geemap (שיש להם הקרנה של maps mercator (EPSG:3857)), או באמצעות קריאה ל-reproject(). כשמציגים תמונות בעורך הקוד או ב-geemap, הבקשות לקלט מתבצעות בפורמט maps mercator. נניח שיש פעולה על תמונה של MODIS עם הטלה סינוסואידית:

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

// 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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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 מציג את סדר הפעולות בדוגמת הקוד הזו. הערה ההטלה של הקלט נקבעת לפי הפלט, ובאופן ספציפי לפי ההטלה של מפות מרקטור של תצוגת המפה בכלי לעריכת קוד. ההקרנה הזו מתפשטת אחורה ברצף הפעולות, כך שהנתונים מוזמנים בהקרנת מרקטור של המפה, בקנה מידה שנקבע לפי רמת הזום של המפה.

היטל
איור 1. תרשים זרימה של פעולות שמתאים לתצוגה של תמונת MODIS במפה של עורך הקוד. התחזיות (בצד ימין של תרשים הזרימה) של כל פעולה נקבעות על סמך הפלט. הקווים המעוקלים מציינים את זרימת המידע אל ההיטל מחדש: באופן ספציפי, היטל הפלט והקנה מידה.

ב-Earth Engine, ההטלות מוגדרות על ידי מערכת ייחוס קואורדינטות (CRS או הפרמטר crs של הרבה שיטות). אפשר לבדוק את ההטלה של תמונה על ידי קריאה ל-projection():

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

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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() בתמונה עם פס אחד לפחות שלא כולל את אותו היטל כמו האחרים, יכול להיות שתופיע שגיאה כמו:

ההטלה שמוגדרת כברירת מחדל

בדרך כלל אין צורך לציין הקרנה, אלא אם אתם צריכים שהחישוב יתבצע בהקרנה ספציפית. רק אם הפלט לא חד-משמעי, מערכת Earth Engine תדרוש מכם לציין היטל או קנה מידה. אי בהירות יכולה לנבוע מ צמצום של ImageCollection שמכיל תמונות עם הקרנות שונות (כלומר יצירת קומפוזיציה). תמונה שהיא קומפוזיציה או פסיפס של תמונות קלט עם הקרנות שונות תכלול את הקרנת ברירת המחדל, שהיא WGS84 עם קנה מידה של מעלה אחת. לדוגמה:

Code Editor (JavaScript)

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

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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 נותן את התזכורת הידידותית הזו כדי לספק מפרט מלא לפלט.

לעתים קרובות המשתמשים מתבלבלים מההתנהגות הזו ודואגים לגבי מידע ההקרנה 'האבוד', אבל הפיקסלים לא מחושבים בפועל עד שהם נדרשים (מידע נוסף), ובשלב הזה תמיד יש הקרנת פלט שמצורפת לבקשה שבה צוין איך לחשב את הקומפוזיציה.

ברוב המקרים, העובדה שלא מוצגת תחזית לא מהווה בעיה, ולמעשה היא מאפשרת אופטימיזציה חשובה. כך אפשר לראות תצוגה מקדימה של התוצאות בכל רמת זום, בלי לחכות לסיום החישוב של הרזולוציה המלאה. אבל זה כן אומר שהפלט יכול להיראות שונה ברמות זום שונות.

אם התמונה המוצגת שעברה אופטימיזציה לא מספיקה מסיבה כלשהי, אפשר לחשב הקרנה ספציפית על ידי הקרנה מחדש של הפלט, כמו שמתואר בקטע הבא.

הקרנה מחדש

אפשר לכפות על פעולות להתבצע בהקרנה ספציפית באמצעות השיטה reproject(). שימוש ב-reproject() גורם לבקשת הקלט בהקרנה שצוינה בקריאה ל-reproject(). חישובים בקוד לפני הקריאה reproject() יתבצעו בהטלה שצוינה. לדוגמה, כדי לכפות יצירת קומפוזיציה בהטלה ספציפית:

Code Editor (JavaScript)

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

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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:

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

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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(). ההקרנה השנייה היא מרומזת, ומבוצעת על ידי Earth Engine באופן אוטומטי כדי להציג את התוצאה במפה. כדאי גם לשים לב שהמידע על ההטלה שבה צריך להשתמש מועבר מהבקשה בחזרה אל הקלט.

הקרנה מחדש
איור 2. תרשים זרימה של פעולות שמתאים להקרנה מחדש של תמונת MODIS במפה של עורך הקוד. הקווים המעוקלים מציינים את זרימת המידע אל ההטלות מחדש: במיוחד, היטל הפלט והקנה מידה.