כשמציינים גובה של תכונות במפה תלת-ממדית – כמו קווים, פוליגונים, מודלים או סמנים – יש כמה גורמים שיכולים להשפיע על המיקום שלהם, גם בתוך הסצנה וגם באופן שבו הרינדור של הסצנה משפיע על התכונה הזו. במסמך הזה מוסבר איך להשתמש ב-AltitudeMode במפה תלת-ממדית ואיך לנהל את הגובה של תכונות.
כך אפשר להשתמש ב-AltitudeMode עם כמה סוגי תכונות:
סמנים: Marker3DElement, Marker3DInteractiveElement
מציינים את הגובה במיקום, וגם את ההבלטה.
מודלים: Model3DElement, Model3DInteractiveElement
ציינו את הגובה בנקודת העיגון של המודל, שצריך להשתמש בה עם הכיוון שלו כדי למקם אותו נכון בסצנה.
קווים פוליגוניים: Polyline3DElement, Polyline3DInteractiveElement
מציינים איך הגובה מוחל על נקודות המיקום לאורך קו פוליגוני.
פוליגונים: Polygon3DElement, Polygon3DInteractiveElement
מציינים איך הגובה מוחל על נקודות המיקום לאורך פוליגון.
איך משתמשים בגובה בסביבות תלת-ממדיות
כשמציבים נקודות בסצנה תלת-ממדית, המיקום הסופי שלהן מושפע מהנוכחות של אובייקטים או מבנים תלת-ממדיים שצולמו, כמו עצים. חשוב להבין שני מושגים מרכזיים:
- מודל פני שטח דיגיטלי (DTM): מייצג את הגובה של "האדמה החשופה". אפשר לחשוב על זה כעל הצורה הטבעית של הקרקע בלי מבנים, עצים או מבנים אחרים מעליה. כל האזורים מבוססים על מודל השטח הדיגיטלי (DTM), שמהווה את הבסיס לגובה של כדור הארץ (מחושב באמצעות EGM96).
- מודל פני שטח דיגיטלי (DSM): מייצג את הגובה של "פני השטח העליונים", כולל מבנים, עצים ומבנים אחרים. באזורים שבהם צולמו מאפיינים (במיוחד בסביבות עירוניות שבהן בניינים שולטים בנוף), פני השטח הגלויים ייראו גבוהים יותר מפני השטח הבסיסיים.
ההבחנה בין DTM ל-DSM חיונית כדי להבין איך מצבי גובה שונים פועלים עם המודלים האלה של גובה דיגיטלי (DEM), כי מיקום המאפיינים עשוי להיות מוסתר או מושפע מהמודל של פני השטח. אפשר לראות את ההבדלים בתרשים הבא:

כשאין נתוני גובה בישויות
אם יש לכם נתונים שאין בהם מדידת גובה, או כשאתם משתמשים בנתונים משירות אחר של Google, כמו שירותי המסלולים או המקומות, לעיתים קרובות לא תקבלו גובה בגיאומטריה שמוחזרת. במקרים כאלה, כדי להציב את התכונה בסצנה צריך לבחור בקפידה את הערך של AltitudeMode:
- הצמדה לקרקע: הגישה הפשוטה ביותר, שבה התכונה תתאים את עצמה אוטומטית לפני השטח. במצב הזה נעשה שימוש במודל DTM.
- הגדרת גובה שרירותי ומצב יחסי: אתם יכולים להקצות גובה מסוים ואז להשתמש ב-RELATIVE_TO_GROUND (שממקם את התכונות ביחס למודל ה-DTM) או ב-RELATIVE_TO_MESH (שמציב אותן מעל למודל ה-DSM).
- שימוש בשירות אחר כדי לקבל את הגובה: כדי לקבל את הגובה המדויק של ה-DTM במיקום של הישות, אתם יכולים להשתמש בשירות כמו Elevation API של Google Maps Platform. אם מדובר בקו או בפוליגון, צריך לעשות את זה בכל אחת מהנקודות שמרכיבות את הקו או הפוליגון.
מה המשמעות של האפשרויות ב-AltitudeMode ומתי כדאי להשתמש בהן?
יש ארבע אפשרויות של AltitudeMode שאפשר לציין כשמגדירים תכונה:
מוחלט
דמיינו מטוס שטס בגובה מסוים מעל פני הים, נניח 10,000 רגל. הגובה שלו קבוע, גם אם הוא טס מעל הר או עמק.
איך משתמשים בו: גובה האובייקט מבוטא ביחס לגובה הממוצע של פני הים (מחושב באמצעות EGM96). קואורדינטת הגובה של התכונה מפורשת כגובה מדויק מעל גובה פני הים הממוצע.
מתי משתמשים בזה: כשמדובר בתכונות עם גבהים ידועים ומדויקים, כמו נתיבי טיסה, עצמים שקועים עם עומק מדויק או מכשירים מדעיים עם נקודה קבועה.
CLAMP_TO_GROUND
תחשבו על פריסה של שמיכת פיקניק על צלע הר. לא משנה אם הגבעה תלולה או שטוחה, השמיכה תמיד מונחת בצורה שטוחה על פני השטח הגלויים.
איך משתמשים בזה: גובה האובייקט מוגדר כאילו הוא ממוקם ישירות על הקרקע. הם יישארו בגובה הקרקע, בהתאם לתוואי השטח, בלי קשר לערך הגובה שצוין. המערכת מתעלמת מקואורדינטת הגובה של הישות, והיא מוצגת ישירות על פני השטח (DTM).
מתי להשתמש: לתכונות שצריכות תמיד להתאים לשטח, כמו כבישים, גדרות, שבילים, גבולות של נכסים או בסיס של מבנים.
RELATIVE_TO_GROUND
דמיינו כדור פורח שנשאר בגובה 100 מטרים מעל פני הקרקע הטבעיים (DTM) שמתחתיו. אם הקרקע עולה, הבלון עולה איתה, ושומר על המרחק של 100 מטרים מ "האדמה החשופה".
אופן השימוש: גובה האובייקט מבוטא ביחס לפני הקרקע (DTM). קואורדינטת הגובה של הישות מפורשת כהיסט מגובה פני השטח במיקום האופקי שלה.
מתי משתמשים בזה: לאובייקטים שצריכים לשמור על גובה עקבי מעל פני השטח הטבעיים, כמו מגדלי תקשורת או קווי חשמל עיליים באזורים כפריים.
RELATIVE_TO_MESH
זה כמו רחפן שטס בגובה קבוע מעל מה שהוא טס מעליו, בין אם מדובר בקרקע חשופה, בגג של בניין או בצמרת של עץ. הוא מתאים את עצמו למשטח הגלוי הגבוה ביותר (DSM).
איך משתמשים בו: הגובה של האובייקט מבוטא ביחס לנקודה הגבוהה ביותר של הקרקע, המבנה או פני המים (DSM). קואורדינטת הגובה של הישות מפורשת כהיסט מגובה ה-DSM.
מתי להשתמש: לאובייקטים שצריכים לרחף בגובה מסוים מעל מה שנמצא שם פיזית (DTM, בניינים, מים). שימושי לסמנים על גגות או לתכונות שמתאימות את עצמן באופן דינמי לסצנה הגלויה.
לפרטים נוספים, עיינו במסמכי התיעוד של הקבועים של AltitudeMode.
דוגמאות ויזואליות ויישום התובנות בפועל
בדוגמאות האלה נעשה שימוש במיקום ספציפי, סטונהנג', כדי להמחיש איך אפשרויות שונות של AltitudeMode משפיעות על מיקום התכונה. הדוגמאות האלה עוסקות קודם כל במיקום של סמנים, ואחר כך בקווים ובאזורים, שיש להם כמה שיקולים שונים.
סמני מיקום
נניח שסיכת המיקום ממוקמת באופן הבא:
const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };
אפשר לראות את זה בסיכה הלבנה בסצנה הבאה:

עכשיו תסתכלו על התמונה הבאה, שבה מוצגות סיכות בצבעים שונים שמוצבות באמצעות מצבי הגובה השונים.

בואו נראה איך הערכים השונים של AltitudeMode משפיעים על מיקום הסמן בסדר עולה של גובה.
CLAMP_TO_GROUND (סיכה סגולה)
הסיכה הזו מתעלמת מערך הגובה ומתחברת לגובה הקרקע הקרוב ביותר. הוא מופיע ממש מתחת לסיכה הלבנה, ובעצם "מוצמד" לפני השטח.
מבחינה טכנית, במצב הזה המערכת מתעלמת מהגובה בפועל ומצמידה את הסיכה לגובה הקרוב ביותר במודל השטח הדיגיטלי (DTM).
ABSOLUTE (סיכה לבנה)
הסיכה הזו משתמשת בערך הגובה המדויק (102.23 מ') כדי למקם את הסמן בגובה הזה מעל פני הים (EGM96), והיא מופיעה מעל אחת מאבני סטונהנג' כפי שצוין בגובה שסופק.
מבחינה טכנית, במצב הזה נעשה שימוש בערך הגובה שסופק בפועל כדי למקם את הסיכה בגובה שצוין מעל פני הים. בדוגמה הזו, המיקום הוא סטונהנג', אבל בחלק העליון של אחת האבנים.
RELATIVE_TO_GROUND (סיכה כתומה)
הסיכה הזו מתייחסת לקרקע (DTM) כבסיס, וממוקמת בגובה 102.23 מטרים מעל פני הקרקע. היא נראית כאילו היא מרחפת מעל הקרקע הטבעית שמתחת לאבן במעגל האבנים.
מבחינה טכנית, במצב הזה הבסיס מוגדר לרמה של ה-DTM בפועל על הקרקע, ואז הסיכה ממוקמת בגובה של 102.23 מטרים מעליו.
RELATIVE_TO_MESH (סיכה כחולה)
הסיכה הזו משתמשת במשטח הגלוי (DSM) כבסיס, וממוקמת בגובה 102.23 מטרים מעל המשטח הזה. במצב הזה, גובה האבן נכלל במדידה, והיא מיושרת קצת יותר גבוה מהסיכה הכתומה.
מבחינה טכנית, במצב הזה המערכת משתמשת במודל פני השטח (DSM) כבסיס וממקמת את המיקום בגובה הנתון מעליו. מכיוון שה-DSM נמצא בחלק העליון של האבן, הסיכה הזו כוללת את הגובה הנוסף הזה במדידה כשהיא קובעת את הגובה היחסי שלה, ומיישרת אותה מעט גבוה יותר מהסיכה RELATIVE_TO_GROUND.
קווים ואזורים של מיקום
כשמדובר בקווים ובאזורים, גם הגובה של הנקודות בתוך המאפיין (בין אם הוא צוין ובין אם לא) וגם AltitudeMode שבו משתמשים הם קריטיים. נבחן קו לאורך סטונהנג' עם הגבהים הבאים:
const lineCoords = [
{ lat: 51.1786, lng : -1.8266, altitude: 101.36 },
{ lat: 51.1787, lng : -1.8264, altitude: 101.18 },
{ lat: 51.178778, lng : -1.826354, altitude: 104.89 },
{ lat: 51.178815, lng : -1.826275, altitude: 107.55 },
{ lat: 51.178923, lng : -1.825980, altitude: 105.53 },
{ lat: 51.1791, lng : -1.8258, altitude: 100.29 },
{ lat: 51.1792, lng : -1.8257, altitude: 100.29 }
];
הקו הזה מיוצג בתמונה הבאה בלבן, באמצעות מיקום מוחלט.

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

CLAMP_TO_GROUND (קו סגול)
הקו הזה מתעלם מהגובה שצוין לכל נקודה, ובמקום זאת "מכסה" את הקו ישירות מעל הקרקע שמתחת (DTM). הוא עוקב אחרי פני השטח, ומתעלם מנוכחות של מאפיינים כמו בניינים או אבנים מעליו.
מבחינה טכנית, במצב הזה המערכת מתעלמת מערכי הגובה בפועל ומציבה את הקו מעל ה-DTM, בהתאם לפני השטח שמתחתיו, ומתעלמת מהרשת של המאפיינים שמעליו.
ABSOLUTE (White Line)
הקו הזה משתמש בגובה המדויק של כל נקודה, ולכן הוא עובר מעל חלק מהאבנים. הוא מחובר בקווים ישרים בין כל נקודה, ולפעמים נראה שהוא עובר דרך אובייקטים אם הנקודות לא קרובות מספיק.
מבחינה טכנית, המצב הזה עוקב אחרי הגובה שצוין לכל נקודה, ומחבר ביניהן בקווים ישרים. כלומר, הוא יכול לעבור דרך הרשת (למשל: אבנים) אם ערכי הגובה מכתיבים זאת. התרחיש הזה מוסבר בהמשך.
RELATIVE_TO_GROUND (קו כתום)
הקו הזה משתמש בקרקע הטבעית (DTM) כבסיס ומציב כל נקודה בגובה שצוין מעל פני הקרקע.
מבחינה טכנית, המצב הזה משתמש ב-DTM כבסיס וממקם את הקווים בגובה שצוין ביחס אליו.
RELATIVE_TO_MESH (קו כחול)
הקו הזה משתמש בפני השטח הגלויים, כולל מבנים ואבנים, כבסיס. לאחר מכן, הוא ממקם כל נקודה בגובה שצוין מעל הרשת הזו, ומשכפל ביעילות את צורת הקו ביחס לנוף הנראה לעין.
מבחינה טכנית, המצב הזה משתמש ברשת (DSM) כבסיס וממקם את המיקומים בגובה שצוין מעליה. בהתאם לרשת, הקו עשוי להשתנות בהתאם למאפיינים השונים בשטח.
כשלא מצוין גובה לקווים
עכשיו נבחן את אותן קואורדינטות של קו, אבל בלי לציין גובה:
const lineCoords = [
{ lat: 51.1786, lng : -1.8266 },
{ lat: 51.1787, lng : -1.8264 },
{ lat: 51.178778, lng : -1.826354 },
{ lat: 51.178815, lng : -1.826275 },
{ lat: 51.178923, lng : -1.825980 },
{ lat: 51.1791, lng : -1.8258 },
{ lat: 51.1792, lng : -1.8257 }
];
במצב כזה, כשלא מצוין גובה, הקווים מופיעים בדרך כלל במיקומים דומים. הקווים הלבן, הכתום והסגול עשויים להתמזג לקו אחד (כתום, כי בדרך כלל הוא משורטט אחרון) כי כולם מוגדרים כברירת מחדל למיקום דומה בגובה הקרקע. אפשר לראות את זה כאן:

הקו הכחול (RELATIVE_TO_MESH) משתמש שוב ברשת (DSM) כבסיס. מכיוון שלא צוין גובה, הוא פשוט מציב את הנקודות ישירות מעל הרשת. חשוב לציין שהקו לא מונח על הרשת, אלא מחבר את הנקודות שצוינו ברשת באמצעות חיבורים ישרים. למרות שזה נראה בסדר בחלק מהדוגמאות, זה יכול לגרום לבעיות חשיפה כשתכונות אחרות מכסות את זה. הבעיה הזו מוסברת בקטע הבא.
האינטראקציה בין רשתות וקווים. עכשיו אפשר להסתכל על קו פוליגוני אחר. התמונה הזו היא של אותו אזור, אבל עם כיסוי קרקע גדול יותר (או יותר פרטים ב-DSM מעל ה-DTM).
const lineCoords = [
{ lat: 51.188404, lng: -1.779059, altitude: 70.69 },
{ lat: 51.187955, lng: -1.780143, altitude: 77.25 },
{ lat: 51.187658, lng: -1.781552, altitude: 68.97 },
{ lat: 51.187376, lng: -1.782447, altitude: 99.02 },
{ lat: 51.186912, lng: -1.783692, altitude: 104.35 },
{ lat: 51.185855, lng: -1.788368, altitude: 86.91 },
];
כשמציגים את הייצוג באותן שיטות (וצבעים) כמו קודם, מקבלים את התצוגה הזו:

הסגול הוא CLAMP_TO_GROUND, ואפשר לראות אותו לאורך הקרקע. הלבן הוא ABSOLUTE, ואפשר לראות שקווים ישרים מחברים בין הנקודות שממוקמות באופן מוחלט במרחב. הגרסאות הכתומות והכחולות הן גרסאות יחסיות של פני השטח (DTM) או של הרשת (DSM). שימו לב שהקו הכחול שונה מעט בצורתו בגלל הגובה של המאפיינים שמתחתיו.
שוב, אפשר לראות שאופי היצירה של הקו גורם לכך שהקו עובר דרך הרשת, כי הנקודות מחוברות זו לזו בקווים ישרים. במצב כזה יכול להיות שיהיה קשה לראות את הקווים, ולכן אפשר להגדיר את drawsOccludedSegments לערך true כדי לוודא שהקו נראה דרך העצים, כמו שמוצג בפירוט רב יותר בתמונה הבאה, שבה עדיין אפשר לראות את הקווים שעוברים דרך הרשת.

בגלל אופי המיקום במרחב, יכול להיות שהנקודות והקווים שמחברים ביניהן ייפלו בתוך הרשת, מה שעלול לגרום לעיוותים חזותיים. בקטע הבא נראה איך אפשר לשפר את פריטי המידע שנוצרו, אם אפשר.
פתרון בעיות באינטראקציה בין קווים ופני שטח
בדוגמה אחרת, באותו אזור, אנחנו יכולים לראות עוד כמה פריטים שצריך לשים לב אליהם כשמשתמשים במצבי גובה ספציפיים.
כאן יש לנו אזור שטוח יחסית שנמצא בעיקר ברמת ה-DTM, עם פרטים נוספים מוגבלים מעליו ברשת. זה נכון גם לגבי אזור שאין בו כיסוי תלת-ממדי מעל מודל פני השטח. בואו נסתכל על המיקום הבא, כפי שמפורט בהמשך:
const lineCoords = [
{ lat: 51.194642, lng: -1.782636, altitude: 99.10 },
{ lat: 51.193974, lng: -1.783952, altitude: 99.86 },
{ lat: 51.192203, lng: -1.787175, altitude: 96.14 },
{ lat: 51.190024, lng: -1.790250, altitude: 105.92 },
{ lat: 51.187491, lng: -1.793580, altitude: 102.60 },
{ lat: 51.183690, lng: -1.798745, altitude: 95.69 },
];
אפשר לראות את זה בתמונה, כשהקווים מיוצגים באותם צבעים כמו קודם: (לבן : ABSOLUTE, כחול : RELATIVE_TO_MESH, סגול : CLAMP_TO_GROUND, כתום: RELATIVE_TO_GROUND).

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

לכן, יכול להיות שיופיעו פריטים חזותיים מוזרים, שבהם נראה שהקו נעלם מתחת לאדמה (או אפילו דרך הרשת) כי הקו בין הנקודות פשוט עוקב אחרי נתיב ישר. כדי לשפר את התצוגה החזותית של קו כזה, אפשר להוסיף עוד נקודות בין הקווים באמצעות שיטת אינטרפולציה. ההשפעה של השיטה על התצוגה החזותית תלויה בשיטה שבה משתמשים:
- למדידות יחסיות (RELATIVE_TO_GROUND או RELATIVE_TO_MESH): כשמשתמשים בערכי גובה יחסיים, יצירת נקודות נוספות לאורך קו או פוליגון תאפשר למקם את התכונה ברמה מתאימה יותר, בהתאם לפרופיל הגובה. אם נקודות הביניים האלה לא קיימות בנתונים שלכם, אתם יכולים להשתמש בפונקציית אינטרפולציה, כמו הפונקציה Interpolate בספריית הגיאומטריה של הפלטפורמה של מפות Google, כדי להוסיף אותן. אפשר לתת לנקודות החדשות האלה ערכים יחסיים שיוצבו מעל פרופיל הגובה הרלוונטי, ואז האורך של כל קו שמחבר בין הנקודות יוגבל והייצוג החזותי ישתפר.
- למאפיינים מוחלטים (ABSOLUTE): במאפיינים מוחלטים, צריך להוסיף ערכי גובה בפועל ליותר נקודות. אינטרפולציה בין ערכים מוחלטים קיימים לא תיתן נקודה שמשקפת במדויק ערך כלשהו מעל הרשת, כי היא תהיה רק ממוצע בין נקודה א' לנקודה ב'.
סיכום
אנחנו מקווים שהמסמך הזה סיפק לכם סקירה מקיפה על האפשרויות של AltitudeMode במפות תלת-ממדיות פוטו-ריאליסטיות, והסביר איך ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND ו-RELATIVE_TO_MESH משפיעים על המיקום והרינדור של תכונות שונות כמו סמנים, קווים ופוליגונים.
כדי ליצור ייצוגים מדויקים ומושכים מבחינה חזותית של מפות תלת-ממדיות עם מינימום פגמים חזותיים, חשוב להבין איך המצבים האלה פועלים בשילוב עם מודל פני השטח הדיגיטלי (DTM) ומודל פני השטח הדיגיטלי (DSM).
אנחנו מקווים שתתנסו במצבי הגובה האלה בפרויקטים שלכם כדי לממש את מלוא הפוטנציאל של מיפוי תלת-ממדי, ליצור חוויות מעניינות וסוחפות למשתמשים ולתת לנו משוב.
תורמים
מאט טון | מהנדס פתרונות, מפתח גיאוגרפי