為 3D 地圖上的特徵 (例如線條、多邊形、模型或標記) 指定高度時,有幾項因素可能會影響特徵的放置位置,包括在場景內的位置,以及場景的算繪方式與該特徵的互動方式。本文說明如何在 3D 地圖上使用「AltitudeMode」,以及如何管理地圖項目的海拔高度。
以下說明如何搭配多種功能類型使用 AltitudeMode
:
標記: Marker3DElement、 Marker3DInteractiveElement
指定位置的高度和擠出量。
型號: Model3DElement、 Model3DInteractiveElement
在模型的錨點上指定高度,這應與模型的方向搭配使用,才能在場景中正確定位。
折線: Polyline3DElement、 Polyline3DInteractiveElement
指定如何將海拔高度套用至折線上的位置點。
多邊形: Polygon3DElement、 Polygon3DInteractiveElement
指定如何將海拔高度套用至多邊形沿線的位置點。
如何在 3D 環境中使用海拔高度
在 3D 場景中放置點時,最終位置會受到擷取的 3D 建築物或樹木等物件影響。請務必瞭解以下兩個重要概念:
- 數位地形模型 (DTM):代表「裸地」海拔高度。這就像是沒有任何建築物、樹木或其他結構的自然地貌。所有區域都以 DTM 為基礎,構成地球海拔高度的基礎 (使用 EGM96 計算)。
- 數位表面模型 (DSM):代表「頂部表面」海拔高度,包括建築物、樹木和其他結構。在已擷取特徵的區域 (特別是建築物林立的都市環境),可見地表會高於基本地形。
區分 DTM 和 DSM 至關重要,有助於瞭解不同高度模式如何與這些數位高程模型 (DEM) 互動,因為特徵的放置位置可能會受到表面模型遮蔽或影響。下圖顯示兩者的差異:
缺少海拔資料的特徵
如果資料缺少海拔高度測量值,或是使用其他 Google 服務 (例如「路線」或「地點」服務) 的資料,通常不會在傳回的幾何圖形中提供任何海拔高度。在這種情況下,將功能放置在場景中時,需要謹慎選擇 AltitudeMode
:
- 夾到地面:這是最簡單的方法,功能會自動符合地形。這個模式會使用 DTM 模型。
- 任意指定高度 + 相對模式:您可以指派所選高度,然後使用 RELATIVE_TO_GROUND (根據 DTM 模型放置特徵) 或 RELATIVE_TO_MESH (根據 DSM 模型放置特徵)。
- 使用其他服務取得海拔高度:如要取得特徵位置的精確 DTM 海拔高度,可以使用 Google 地圖平台 Elevation API 等服務。 如果是線條或多邊形,則必須針對組成線條或多邊形的每個點執行這項操作。
AltitudeMode
選項的意義和適用時機。
定義特徵時,可以指定四個 AltitudeMode
選項:
絕對
假設飛機在海平面上方 10,000 英尺的高度飛行,無論飛越山脈或山谷,高度都固定不變。
如何使用:物體海拔高度是以平均海平面為基準 (使用 EGM96 計算)。這項功能的海拔座標會解讀為高於平均海平面的精確海拔高度。
適用時機:適用於已知精確海拔高度的功能,例如飛行路徑、具有確切深度的水下物體,或固定點科學儀器。
CLAMP_TO_GROUND
想像一下,直接在山坡上鋪野餐墊。無論山丘多麼陡峭或平坦,毯子都會平鋪在可見表面上。
使用方式:物件高度會直接顯示在地面上。無論提供任何海拔高度值,這些標記都會保持在地面層級,並遵循地形。系統會忽略特徵的海拔高度座標,直接投影到地形表面 (DTM)。
適用時機:適用於應一律符合地形的特徵,例如道路、圍籬、步道、地界或建築物底部。
RELATIVE_TO_GROUND
想像熱氣球在自然地表海拔高度 (DTM) 上方 100 公尺處。如果地面上升,氣球也會跟著上升,與「裸露地面」保持 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 高度。
絕對 (白色圖釘)
這個圖釘使用精確的海拔高度值 (102.23 公尺),將標記放置在該海拔高度 (EGM96),並顯示在巨石陣其中一塊石頭的頂端,如提供的海拔高度所指定。
從技術上來說,這個模式會使用實際提供的海拔高度值,將圖釘放置在指定海拔高度的位置 (以海平面為基準),在本例中為巨石陣的位置,但位於其中一塊石頭的頂端。
RELATIVE_TO_GROUND (橘色圖釘)
這個圖釘以地面 (DTM) 為基準,並將自身放置在該地面高度上方 102.23 公尺處,因此會顯示在巨石陣中石頭下方的自然地面上方。
從技術上來說,這個模式會將基準設為地面上的實際 DTM 級別,然後將圖釘放在基準上方 102.23 公尺處。
RELATIVE_TO_MESH (Blue Pin)
這個圖釘會以可見表面 (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 上,沿著底層地形,忽略其上方的特徵網格。
絕對值 (白線)
這條線會使用每個點的確切海拔高度,因此會越過部分石頭。各點之間以直線連接,如果點不夠密集,有時會看起來像是穿過物件。
從技術上來說,這個模式會依據每個點的指定海拔高度,以直線連接這些點,因此如果海拔高度值有所規定,這個模式可能會穿過網格 (例如石頭)。後續章節會說明這種情況。
RELATIVE_TO_GROUND (Orange Line)
這條線以自然地面 (DTM) 為基準,並將每個點放置在該地面以上指定高度。
從技術上來說,這個模式會以 DTM 為基準,並將線條位置放在相對於 DTM 的列出高度。
相對於網狀網路 (藍線)
這條線會以可見表面 (包括建築物和石頭) 做為基準。然後將每個點放置在該網格上方指定的海拔高度,有效複製與可見地景相關的線條形狀。
從技術上來說,這個模式會以網格 (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) 為基準。由於未指定海拔高度,系統只會將點直接疊加在網格上。請注意,這項工具不會在網格「上」繪製線條,而是以直線連接網格上的指定點。雖然在某些範例中,這種做法可能可以接受,但如果被其他功能遮蓋,可能會導致顯示問題。下一節會說明這個問題。
網格和線條的互動。 現在我們可以查看另一條折線。這張圖片與前一張圖片位於同一區域,但涵蓋更多地面範圍 (或 DTM 頂端的 DSM 包含更多細節)。
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 層級,網格中上方額外的詳細資料有限。如果地形模型上方沒有 3D 涵蓋範圍,也會發生這種情況。讓我們看看以下指定位置:
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):使用相對海拔高度值時,沿著線或多邊形建立更多點,可讓功能放置在更適當的高度,更符合海拔高度剖面圖。如果資料中沒有這些中繼點,可以使用插補函式 (例如 Google 地圖平台幾何程式庫中的 Interpolate 函式) 新增。接著,這些新點可以賦予相對值,放置在相關高度剖面圖上方,然後限制任何連接點的線條長度,並改善視覺化呈現效果。
- 絕對特徵 (ABSOLUTE):如果是 ABSOLUTE 特徵,更多點需要有實際海拔高度值。在現有的絕對值之間插補,不會產生準確反映網格上方任何值的分數,因為這只會是 A 點和 B 點之間的平均值。
摘要
希望本文能提供實景 3D 地圖中 AltitudeMode
選項的完整總覽,詳細說明 ABSOLUTE、CLAMP_TO_GROUND、RELATIVE_TO_GROUND 和 RELATIVE_TO_MESH 如何影響標記、線條和多邊形等各種功能的放置和算繪方式。
瞭解這些模式如何與基礎數位地形模型 (DTM) 和數位地表模型 (DSM) 搭配運作,對於建立準確且引人入勝的 3D 地圖表示法至關重要,可盡量減少視覺構件。
希望您能在自己的專案中試用這些高度模式,充分發揮 3D 地圖的潛力,為使用者打造引人入勝的沉浸式體驗,並提供意見回饋。
貢獻者
Matt Toon | 地理位置開發人員解決方案工程師