הסבר על מצבי גובה ותכונות במפות תלת-ממד

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

כך משתמשים ב-AltitudeMode עם סוגים שונים של תכונות:

איך משתמשים בגובה בסביבות תלת-ממד

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

  • מודל של פני השטח הדיגיטליים (DTM): מייצג את הגובה של פני השטח ללא צמחייה או מבנים. אפשר לחשוב על זה כצורה הטבעית של הקרקע בלי מבנים, עצים או מבנים אחרים. כל האזורים מבוססים על DTM, שמהווה את הבסיס לגובה של כדור הארץ (מחושב באמצעות EGM96).
  • מודל דיגיטלי של פני השטח (DSM): המודל הזה מייצג את הגובה של "המשטח העליון", כולל בניינים, עצים ומבנים אחרים. באזורים שבהם תועדו מאפיינים (במיוחד בסביבות עירוניות שבהן בניינים הם המאפיין הדומיננטי), פני השטח שניתן לראות יהיו גבוהים יותר מהשטח הבסיסי.

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

מפה תלת-ממדית שמציגה את ההבדל בין מודל דיגיטלי של פני השטח (DTM) לבין מודל דיגיטלי של פני השטח (DSM).

כשחסרים נתוני גובה בתכונות

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

  • הצמדה לקרקע: הגישה הפשוטה ביותר, שבה הצורה תותאם אוטומטית לתוואי השטח. במצב הזה נעשה שימוש במודל DTM.
  • הקצאת גובה שרירותי + מצב יחסי: אפשר להקצות גובה נבחר ואז להשתמש ב-RELATIVE_TO_GROUND (שממקם את התכונות ביחס למודל DTM) או ב-RELATIVE_TO_MESH (שממקם את התכונות מעל מודל DSM).
  • שימוש בשירות אחר כדי לקבל את הגובה: כדי לקבל גובה מדויק של DTM במיקום התכונה, אפשר להשתמש בשירות כמו Elevation API בפלטפורמה של מפות Google. אם מדובר בקו או בפוליגון, צריך לעשות את זה לכל אחת מהנקודות שמרכיבות את הקו או הפוליגון.

מה המשמעות של האפשרויות AltitudeMode ומתי כדאי להשתמש בהן?

יש 4 אפשרויות AltitudeMode שאפשר לציין כשמגדירים תכונה:

ABSOLUTE

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

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

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

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

תורמים

מאט טון | מהנדס פתרונות, מפתח גיאוגרפי