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

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

以下介绍了如何将 AltitudeMode 与多种地图项类型搭配使用:

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

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

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

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

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

地图项缺少海拔高度数据时

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

  • 将其固定到地面:最简单的方法,地图项 将自动符合地形。此模式使用 DTM 模型。
  • 为其指定任意海拔高度 + 相对模式:您可以分配所选的海拔高度,然后使用 RELATIVE_TO_GROUND(将地图项相对于 DTM 模型放置)或 RELATIVE_TO_MESH(将地图项浮动在 DSM 模型上方)。
  • 使用其他服务获取海拔高度:如需获取地图项位置的精确 DTM 海拔高度,您可以使用 Google Maps PlatformElevation API等服务。如果是线条或多边形,您需要为构成线条或多边形的每个点执行此操作。

AltitudeMode 选项的含义以及何时使用它们?

定义地图项时,您可以指定以下四个 AltitudeMode 选项:

ABSOLUTE

想象一下,一架飞机在海平面以上特定海拔高度(例如 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 高度。

ABSOLUTE(白色图钉)

此图钉使用精确的海拔高度值 (102.23m) 将标记放置在海平面 (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 }
];

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

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

同样,下图显示了使用不同海拔高度模式的线条。 让我们从最低到最高依次讨论每个模式。

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

CLAMP_TO_GROUND(紫色线条)

此线条会忽略为每个点指定的海拔高度,而是将线条直接“覆盖”在底层地面 (DTM) 上。它遵循地形,忽略其上方任何地图项(例如建筑物或石头)的存在。

从技术上讲,此模式会忽略实际海拔高度值,并将线条覆盖在 DTM 上,遵循底层地形并忽略其上方地图项的网格。

ABSOLUTE(白色线条)

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

从技术上讲,此模式遵循为每个点指定的海拔高度,并使用直线连接这些点,这意味着如果海拔高度值指定,它可能会穿过网格(例如石头)。本单元稍后将会讨论此使用场景。

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 }
];

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

一张 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 ,您可以看到它沿着地面延伸。白色是 ABSOLUTE,您可以看到直线连接在空间中绝对定位的点。橙色和蓝色是相对于 SURFACE (DTM) 或 MESH (DSM) 的版本,请注意,由于下方地图项的高度,蓝色线条的形状略有不同。

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

一幅 3D 地图,显示穿过树木的线条,其中被遮挡的线段可见,用于说明线段的遮挡情况: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 Geometry 库中的 Interpolate 函数)来添加它们。然后,可以为这些新点指定相对值,这些值将放置在相关纵剖面图上方,然后任何连接点的线条的长度都将受到限制,视觉表示效果也会得到改善。
  • 对于绝对地图项 (ABSOLUTE):对于 ABSOLUTE 地图项,需要更多点 具有实际海拔高度值。在现有绝对值之间进行插值不会给出准确反映网格上方任何值的点,因为它只是点 A 和点 B 之间的平均值。

摘要

希望本文档为您全面介绍了逼真 3D 地图中的 AltitudeMode 选项,详细介绍了 ABSOLUTE、CLAMP_TO_GROUND、RELATIVE_TO_GROUND 和 RELATIVE_TO_MESH 如何影响各种地图项(例如标记、线条和多边形)的放置和渲染。

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

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

贡献者

Matt Toon | 解决方案 工程师,地理位置开发者