3D 地图中的海拔模式和功能

当您为 3D 地图上的地图项(例如线条、多边形、模型或标记)指定高度时,有几个因素可能会影响其在场景中的位置,以及场景的渲染与该地图项的交互方式。本文档介绍了如何在 3D 地图上使用 'AltitudeMode',以及如何管理地图项的高度。

以下是您如何将 AltitudeMode 与多种特征类型搭配使用:

如何在 3D 环境中使用海拔高度

在 3D 场景中放置点时,其最终位置会受到捕获的 3D 建筑或树木等对象的影响。理解两个关键概念至关重要:

  • 数字地形模型 (DTM):表示“裸地”高程。您可以将其视为没有任何建筑物、树木或其他结构的土地的自然形状。所有区域都以 DTM 为基础,DTM 构成了地球海拔高度的基础(使用 EGM96 计算)。
  • 数字表面模型 (DSM):表示“顶面”高程,包括建筑物、树木和其他结构。在已捕获特征的区域(尤其是建筑物占据主导地位的城市环境),可见表面会高于基础地形。

区分 DTM 和 DSM 对于了解不同高度模式如何与这些数字高程模型 (DEM) 交互至关重要,因为地表模型可能会遮挡或影响地图项的放置。 您可以在下图中看到这些差异:

一张 3D 地图,展示了数字地形模型 (DTM) 和数字表面模型 (DSM) 之间的区别。

当地物缺少海拔数据时

如果您的数据缺少海拔测量值,或者您使用的是来自其他 Google 服务(例如路线或地点服务)的数据,则返回的几何图形中通常不会提供任何海拔。在这种情况下,将特征放置在场景中需要您仔细选择 AltitudeMode:

  • 贴地:最简单的方法,地图项会自动贴合地形。此模式使用 DTM 模型。
  • 为其指定任意高度 + 相对模式:您可以指定所选高度,然后使用 RELATIVE_TO_GROUND(相对于 DTM 模型放置地图项)或 RELATIVE_TO_MESH(使地图项浮动在 DSM 模型上方)。
  • 使用其他服务获取海拔高度:如需获取地图项所在位置的精确 DTM 海拔高度,您可以使用 Google Maps Platform 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 };

您可以在下面的场景中看到这个白色图钉:

一个带有白色图钉标记的 3D 地图场景,展示了标记的默认放置位置。

现在,请看下图,其中显示了使用不同高度模式定位的各种颜色的图钉。

一个 3D 地图场景,显示了使用不同高度模式定位的多个图钉(白色、紫色、橙色、蓝色),所有图钉都以巨石阵为中心。

我们来看看不同的 AltitudeMode 如何影响标记在海拔高度升序排列中的定位。

CLAMP_TO_GROUND(紫色图钉)

此图钉会忽略海拔值,并附着到最近的地面海拔。您可以在白色图钉下方看到它,它实际上“固定”在地形上。

从技术上讲,此模式会忽略实际海拔高度,并将图钉固定到最近的 DTM 高度。

绝对(白色图钉)

此图钉使用确切的海拔高度值 (102.23m) 将标记放置在高于海平面 (EGM96) 的该高度,并根据其提供的海拔高度显示在其中一块巨石阵石头的顶部。

从技术上讲,此模式使用实际提供的海拔值将图钉放置在指定的海拔高度,在本例中,该位置是巨石阵的位置,但位于其中一块石头的顶部。

RELATIVE_TO_GROUND(橙色图钉)

此图钉以地面 (DTM) 为基准,并将其自身放置在地面上方 102.23 米处,看起来像是漂浮在巨石阵中石头下方的自然地面上方。

从技术上讲,此模式会将其基准设置为地面上实际 DTM 的高度,然后将图钉放置在 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 }
];

您可以在下图中看到这条线,它使用绝对定位,以白色表示。

一幅 3D 地图,其中显示了使用绝对定位在巨石阵周围放置的一条白线。

下图再次显示了使用不同高度模式的线条。 我们来逐一讨论,从最低到最高。

一张 3D 地图,显示了使用不同高度模式在巨石阵周围放置的多条彩色线条(紫色、白色、橙色、蓝色)。

CLAMP_TO_GROUND(紫色线条)

此线会忽略每个点的指定海拔高度,而是直接将线“覆盖”在底层地面 (DTM) 上。它会沿着地形延伸,忽略其上方的任何特征(例如建筑物或石头)。

从技术上讲,此模式会忽略实际海拔值,并根据底层地形将线条覆盖在 DTM 上,同时忽略其上方的特征网格。

绝对(白线)

此线使用每个点的确切海拔高度,导致该线穿过一些石头。它通过每个点之间的直线连接,如果点不够频繁,有时可能会使其看起来穿过对象。

从技术上讲,此模式会遵循每个点的指定高度,并用直线连接这些点,这意味着如果高度值有要求,它可以穿过网格(例如:石头)。后面的部分将介绍此场景。

RELATIVE_TO_GROUND(橙色线)

此线以自然地面 (DTM) 为基准,并将每个点放置在高于该地面高度的指定高度。

从技术上讲,此模式以 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 }
];

在这种情况下,由于未提供海拔高度,这些线条通常会出现在相似的位置。白色、橙色和紫色线条可能会合并为一条线条(橙色,因为通常最后绘制),因为它们都默认采用类似的地面定位。您可以在下方看到:

一张 3D 地图,显示巨石阵周围有多条彩色线条(橙色、蓝色),其中白色和紫色线条因缺少海拔数据而合并。

蓝线 (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 },
];

当我们使用与之前相同的方法(和颜色)查看表示形式时,会看到以下视图:

一张 3D 地图,在树木和不同海拔的地形上显示多条彩色线条(紫色、白色、橙色、蓝色)。

紫色是 CLAMP_TO_GROUND,您可以看到它沿着地面延伸。白色是绝对值,您可以看到直线连接了在空间中绝对定位的点。橙色和蓝色是关于表面 (DTM) 或网格 (DSM) 的相对版本,请注意,由于下方特征的高度不同,蓝色线条的形状略有不同。

同样,我们可以注意到,线条创建的性质意味着线条会穿过网格,因为这些点是通过直线连接在一起的。这种情况可能会导致无法看到线条,因此您可以将 drawsOccludedSegments 设置为 true,以确保线条在树木遮挡下仍然可见,如下图所示,其中穿过网格的线条仍然可见。

一张 3D 地图,其中显示了穿过树木的线条,被遮挡的线段可见,以说明 segments: 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)。

一张 3D 地图,在相对平坦的地形上显示各种颜色的线条(白色、蓝色、紫色、橙色),突出显示线条消失在地下的视觉伪影。

在这里,我们可以看到许多伪影,其中第一个伪影是由于缺少表面覆盖,橙色 (RELATIVE_TO_GROUND) 和蓝色 (RELATIVE_TO_MESH) 线位于(大部分)相同的位置(蓝色线显示为最后绘制)。

我们还可以看到,紫色 (CLAMP_TO_GROUND) 线条沿着地面延伸,在山上可以看到,而白色 (ABSOLUTE) 线条则消失在山中,因为只有点是连接的,直线穿过了地面。

当紫色线条隐藏时,您可以在此图片中具体看到这一点。

一张 3D 地图,其中白色和蓝色线条消失在山丘中,紫色线条隐藏,展示了绝对线条和相对于网格的线条的视觉伪影。

因此,这可能会导致一些奇怪的视觉伪影,即由于点之间的线只是遵循直线路径,因此可以看到线在地面下(甚至穿过网格)消失。您可以通过使用插值方法在各条线之间添加更多点,从而改善此类线的视觉显示效果,这可能会影响视觉效果,具体取决于所使用的方法:

  • 对于相对测量(RELATIVE_TO_GROUND 或 RELATIVE_TO_MESH):使用相对海拔值时,沿线条或多边形创建更多点可让地图项放置在更合适的水平面上,从而更好地符合纵剖面图。如果您的数据中没有这些中间点,您可以使用插值函数(例如 Google Maps Platform 几何图形库中的 Interpolate 函数)来添加这些点。然后,可以为这些新点指定相对值,这些值将放置在相关纵剖面图上方,然后限制连接这些点的任何线的长度,并改进视觉表示。
  • 对于绝对特征 (ABSOLUTE):对于 ABSOLUTE 特征,需要有更多点具有实际海拔值。在现有绝对值之间进行插值不会得到准确反映网格上方任何值的点,因为它只是点 A 和点 B 之间的平均值。

摘要

希望本文档能让您全面了解 3D 摄影实景地图中的 AltitudeMode 选项,并详细说明 ABSOLUTE、CLAMP_TO_GROUND、RELATIVE_TO_GROUND 和 RELATIVE_TO_MESH 如何影响标记、线条和多边形等各种地图项的放置和渲染。

了解这些模式如何与底层数字地形模型 (DTM) 和数字表面模型 (DSM) 协同工作,对于创建准确且具有视觉吸引力的 3D 地图表示(同时尽可能减少视觉伪影)至关重要。

我们希望您在自己的项目中尝试这些高度模式,充分发挥 3D 地图的潜力,为用户打造引人入胜的沉浸式体验,并提供反馈。

贡献者

Matt Toon | 解决方案工程师,Geo 开发者