כשמציינים גובה לתכונות במפה תלת-ממדית – כמו קווים, מצולעים, מודלים או סמנים – יש כמה גורמים שיכולים להשפיע על המיקום שלהם, גם בתוך הסצנה וגם על האופן שבו הרינדור של הסצנה מתקשר עם התכונה הזו. במאמר הזה מוסבר איך להשתמש ב'AltitudeMode' במפה תלת-ממדית ואיך לנהל את הגובה של התכונות.
כך משתמשים ב-AltitudeMode עם מספר סוגים של תכונות:
סמנים: Marker3DElement, Marker3DInteractiveElement
מציינים גובה במיקום, וגם שחול.
Models: 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. אם מדובר בקו או בפוליגון, צריך לעשות את זה לכל אחת מהנקודות שמרכיבות את הקו או הפוליגון.
מה המשמעות של האפשרויות AltitudeMode ומתי כדאי להשתמש בהן?
יש 4 אפשרויות AltitudeMode שאפשר לציין כשמגדירים תכונה:
ABSOLUTE
תארו לעצמכם מטוס שטס בגובה מסוים מעל פני הים, נניח 3,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
הצמדה לקרקע (סיכה סגולה)
הסיכה הזו מתעלמת מערך הגובה ומוצמדת לגובה פני הקרקע הקרוב ביותר. הוא מופיע ממש מתחת לסיכה הלבנה, ובעצם הוא 'נצמד' לקרקע.
מבחינה טכנית, במצב הזה המערכת מתעלמת מהגובה בפועל ומצמידה את הסיכה לגובה הקרוב ביותר של מודל DTM.
ABSOLUTE (White Pin)
הסיכה הזו משתמשת בערך הגובה המדויק (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 (Purple Line)
הקו הזה מתעלם מהגובה שצוין לכל נקודה, ובמקום זאת הוא "נפרש" ישירות על הקרקע הבסיסית (DTM). היא עוקבת אחרי פני השטח, ולא מתייחסת לנוכחות של תכונות כמו בניינים או אבנים מעליה.
מבחינה טכנית, במצב הזה המערכת מתעלמת מערכי הגובה בפועל ומציגה את הקו על פני מודל DTM, בהתאם לטופוגרפיה הבסיסית, ומתעלמת מרשת התכונות שמעליו.
ABSOLUTE (White Line)
הקו הזה משתמש בגובה המדויק של כל נקודה, ולכן הוא עובר מעל חלק מהאבנים. הוא מחובר באמצעות קווים ישרים בין כל נקודה, ולפעמים נראה שהוא עובר דרך אובייקטים אם הנקודות לא תכופות מספיק.
מבחינה טכנית, במצב הזה המצלמה עוקבת אחרי הגובה שצוין לכל נקודה ומחברת ביניהן באמצעות קווים ישרים. כלומר, היא יכולה לעבור דרך הרשת (למשל: אבנים) אם ערכי הגובה מכתיבים זאת. התרחיש הזה מוסבר בהמשך המאמר.
RELATIVE_TO_GROUND (קו כתום)
הקו הזה משתמש בקרקע הטבעית (DTM) כבסיס שלו, וממקם כל נקודה בגובה שצוין מעל פני הקרקע.
מבחינה טכנית, במצב הזה נעשה שימוש ב-DTM כבסיס, והמיקומים של קווי המתאר מוצבים בגובה שמופיע ברשימה ביחס אליו.
RELATIVE_TO_MESH (Blue Line)
הקו הזה מבוסס על פני השטח הנראים, כולל מבנים ואבנים. לאחר מכן, כל נקודה ממוקמת בגובה שצוין מעל הרשת הזו, וכך משוכפל למעשה הצורה של הקו ביחס לנוף הנראה.
מבחינה טכנית, במצב הזה נעשה שימוש ברשת (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, ואפשר לראות אותו לאורך הקרקע. הצבע הלבן הוא מוחלט, ואפשר לראות שהקווים הישרים מחברים בין הנקודות שממוקמות באופן מוחלט במרחב. הצבעים הכתום והכחול הם גרסאות יחסיות של פני השטח (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 Maps Platform, כדי להוסיף אותן. אחר כך אפשר לתת לנקודות החדשות האלה ערכים יחסיים שיוצבו מעל פרופיל הגובה הרלוונטי, ואז אורך כל קו שמחבר בין הנקודות יהיה מוגבל והייצוג החזותי ישתפר.
- עבור מאפיינים מוחלטים (ABSOLUTE): עבור מאפיינים מוחלטים, צריך שיהיו יותר נקודות עם ערכי גובה בפועל. אינטרפולציה בין ערכים מוחלטים קיימים לא תיתן נקודה שמשקפת בצורה מדויקת ערך כלשהו מעל הרשת, כי היא תהיה רק ממוצע בין נקודה א' לנקודה ב'.
סיכום
המסמך הזה מספק סקירה מקיפה של אפשרויות AltitudeMode במפות תלת-ממד פוטוריאליסטיות, עם פירוט של ההשפעה של ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND ו-RELATIVE_TO_MESH על המיקום והעיבוד של תכונות שונות כמו סמנים, קווים ומצולעים.
כדי ליצור ייצוגים מדויקים ומושכים מבחינה ויזואלית של מפות תלת-ממדיות עם מינימום ארטיפקטים ויזואליים, חשוב להבין איך המצבים האלה פועלים יחד עם מודל השטח הדיגיטלי (DTM) ומודל פני השטח הדיגיטלי (DSM) שביסודם.
אנחנו מקווים שתנסו את מצבי הגובה האלה בפרויקטים שלכם כדי למצות את הפוטנציאל של מיפוי תלת-ממדי, ליצור חוויות מרתקות וסוחפות למשתמשים ולספק לנו משוב.
תורמים
מאט טון | מהנדס פתרונות, מפתח גיאוגרפי