תחזיות

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

פונקציות בחבילה ee.Terrain (לדוגמה, slope,‏ aspect,‏ hillshade) מחשבות ערכים על סמך פיקסלים סמוכים, והן רגישות לארטיפקטים של דגימה מחדש שנוצרים במהלך ההקרנה מחדש. אם ההטלה של החישוב שונה מההטלה המקורית של ה-DEM, הדגימה מחדש של השכן הקרוב ביותר שמוגדרת כברירת מחדל יכולה ליצור דפוסים מלאכותיים בפלט. כדי לקבל את התוצאות הטובות ביותר, מומלץ לבצע ניתוח של פני השטח בהיטל המקורי של ה-DEM. אם עובדים עם ImageCollection של משבצות DEM, יוצרים פסיפס ומשתמשים ב-setDefaultProjection() עם ההטלה המקורית של האוסף כדי לוודא שהניתוח יפעל ברשת הנכונה, כמו שמתואר בקטע ההטלה שמוגדרת כברירת מחדל.

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