Когда вы указываете высоту для объектов на 3D-карте, например линий, многоугольников, моделей или маркеров, на их размещение в сцене и на то, как они будут отрисовываться, могут влиять несколько факторов. В этом документе рассказывается, как использовать AltitudeMode на 3D-карте и управлять высотой объектов.
Ниже описано, как использовать AltitudeMode с различными типами объектов.
Маркеры: Marker3DElement, Marker3DInteractiveElement
Укажите высоту местоположения и экструзию.
Модели: Model3DElement, Model3DInteractiveElement
Укажите высоту опорной точки модели, которая должна использоваться вместе с ее ориентацией для правильного позиционирования в сцене.
Ломаные линии: Polyline3DElement, Polyline3DInteractiveElement.
Укажите, как высота применяется к точкам вдоль ломаной линии.
Многоугольники: Polygon3DElement, Polygon3DInteractiveElement.
Укажите, как высота применяется к точкам положения вдоль многоугольника.
Как высота используется в 3D-средах
При размещении точек в 3D-сцене на их конечное положение влияет наличие зафиксированных 3D-зданий или объектов, например деревьев. Важно понимать два ключевых понятия:
- Цифровая модель рельефа (ЦМР). Представляет высоту "голой земли". Это естественная форма земли без зданий, деревьев и других объектов. Все области опираются на цифровую модель рельефа, которая формирует основу для высоты земного шара (рассчитывается с использованием EGM96).
- Цифровая модель поверхности (ЦМП). Представляет высоту верхней поверхности, включая здания, деревья и другие объекты. В областях, где были зафиксированы объекты (особенно в городских условиях, где преобладают здания), видимая поверхность будет казаться выше, чем базовая местность.
Различие между ЦМР и ЦМП важно для понимания того, как разные режимы высоты взаимодействуют с этими цифровыми моделями рельефа (ЦМР), поскольку на размещение объектов может влиять модель поверхности. Различия показаны на диаграмме ниже.

Если у объектов нет данных о высоте
Если у вас есть данные, в которых отсутствует измерение высоты, или вы используете данные из другого сервиса Google, например Routes или Places, в возвращаемой геометрии часто не будет указана высота. В таких случаях, чтобы разместить объект в сцене, нужно тщательно выбрать AltitudeMode:
- Привязка к земле. Самый простой подход, при котором объект автоматически подстраивается под рельеф. В этом режиме используется модель DTM.
- Задать произвольную высоту и относительный режим. Вы можете задать высоту, а затем использовать RELATIVE_TO_GROUND (объекты размещаются относительно модели DTM) или RELATIVE_TO_MESH (объекты размещаются над моделью DSM).
- Используйте другой сервис, чтобы получить высоту. Чтобы узнать точную высоту ЦМР в местоположении объекта, вы можете использовать такой сервис, как Elevation API платформы Google Карт. Если это линия или многоугольник, вам нужно будет сделать это для каждой из точек, составляющих линию или многоугольник.
Что означают варианты AltitudeMode и когда их использовать?
При определении функции можно указать четыре варианта AltitudeMode:
АБСОЛЮТНЫЙ
Представьте самолет, летящий на определенной высоте над уровнем моря,например 10 000 футов. Высота полета фиксированная, независимо от того, летит ли самолет над горой или долиной.
Как использовать. Высота объекта указывается относительно среднего уровня моря (рассчитывается с помощью EGM96). Координата высоты объекта интерпретируется как точная высота над средним уровнем моря.
Когда использовать. Для объектов с известной точной высотой, например траекторий полета, погруженных объектов с точной глубиной или научных приборов с фиксированной точкой.
CLAMP_TO_GROUND
Представьте, что вы расстилаете плед для пикника на склоне холма. Независимо от того, насколько крутой или пологий холм, одеяло всегда лежит ровно на видимой поверхности.
Как использовать. Высота объекта указывается так, как если бы он находился непосредственно на земле. Они будут оставаться на уровне земли, повторяя рельеф местности, независимо от указанного значения высоты. Координата высоты объекта игнорируется, он проецируется непосредственно на поверхность рельефа (DTM).
Когда использовать. Для объектов, которые должны всегда соответствовать рельефу, например дорог, заборов, троп, границ собственности или оснований зданий.
RELATIVE_TO_GROUND
Представьте воздушный шар, который находится на высоте 100 метров над поверхностью земли (ЦМР). Если высота поверхности увеличивается, то и шар поднимается, сохраняя расстояние в 100 метров от земли.
Как использовать. Высота объекта указывается относительно поверхности земли (DTM). Координата высоты объекта интерпретируется как смещение относительно высоты рельефа в его горизонтальном положении.
Когда использовать. Для объектов, которые должны находиться на определенной высоте над естественным рельефом, например вышек связи или воздушных линий электропередачи в сельской местности.
RELATIVE_TO_MESH
Представьте, что дрон летит на фиксированной высоте над поверхностью, будь то земля, крыша здания или верхушка дерева. Она подстраивается под самую высокую видимую поверхность (DSM).
Как использовать. Высота объекта выражается относительно самой высокой точки поверхности земли, здания или водной поверхности (ЦМП). Координата высоты объекта интерпретируется как смещение относительно высоты цифровой модели поверхности.
Когда использовать. Для объектов, которые должны парить на определенной высоте над тем, что физически находится под ними (цифровая модель рельефа, здания, вода). Полезно для маркеров на крышах или объектов, которые динамически подстраиваются под видимую сцену.
Подробную информацию можно найти в документации по константам AltitudeMode.
Визуальные примеры и практическое применение
В примерах ниже используется конкретное местоположение – Стоунхендж. Они показывают, как разные значения AltitudeMode влияют на размещение объекта. В примерах ниже сначала рассматривается позиционирование маркеров, а затем – линий и областей, для которых действуют другие правила.
Маркеры позиций
Рассмотрим маркер-булавку, размещенный следующим образом:
const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };
На изображении ниже он показан белым маркером.

Теперь посмотрите на изображение ниже, на котором показаны маркеры разных цветов, расположенные с использованием разных режимов высоты.

Давайте посмотрим, как разные AltitudeMode влияют на положение маркера в порядке возрастания высоты.
CLAMP_TO_GROUND (фиолетовый маркер)
Маркер игнорирует значение высоты и прикрепляется к ближайшей точке на поверхности земли. Вы можете увидеть его прямо под белым маркером, эффективно "прикрепляющимся" к местности.
Технически в этом режиме игнорируется фактическая высота и маркер привязывается к ближайшей высоте цифровой модели рельефа.
ABSOLUTE (белый маркер)
Этот маркер использует точное значение высоты (102,23 м), чтобы разместить маркер на этой высоте над уровнем моря (EGM96), появляясь на вершине одного из камней Стоунхенджа, как указано в его высоте.
Технически в этом режиме используется фактическое значение высоты, чтобы разместить маркер на указанной высоте над уровнем моря. В этом примере маркер размещается на вершине одного из камней Стоунхенджа.
RELATIVE_TO_GROUND (оранжевый маркер)
Этот маркер использует в качестве основы землю (DTM) и размещается на высоте 102,23 м над уровнем земли, как бы паря над естественной землей, которая находится под камнем в хендже.
Технически в этом режиме основание маркера устанавливается на уровне фактической ЦМР на земле, а затем маркер размещается на высоте 102,23 м над ним.
RELATIVE_TO_MESH (синий маркер)
Этот маркер использует видимую поверхность (DSM) в качестве основы и размещается на высоте 102,23 м над этой поверхностью. В этом режиме учитывается высота камня, поэтому он находится немного выше оранжевого маркера.
Технически в этом режиме в качестве основы используется сетка (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). Она повторяет рельеф местности, игнорируя наличие любых объектов, таких как здания или камни над ней.
Технически в этом режиме игнорируются фактические значения высоты, а линия накладывается на цифровую модель рельефа, следуя за рельефом местности и игнорируя сетку объектов над ним.
АБСОЛЮТНЫЙ (белая линия)
Эта линия использует точную высоту для каждой точки, в результате чего линия проходит над некоторыми камнями. Точки соединены прямыми линиями, которые могут проходить сквозь объекты, если точки расположены недостаточно близко друг к другу.
Технически этот режим следует заданной высоте для каждой точки, соединяя их прямыми линиями, что означает, что он может проходить через сетку (например, камни), если этого требуют значения высоты. Этот сценарий рассматривается в следующем разделе.
RELATIVE_TO_GROUND (оранжевая линия)
В качестве основы для этой линии используется естественный рельеф (DTM), и каждая точка размещается на указанной высоте над уровнем земли.
Технически в этом режиме в качестве основы используется ЦМР, а точки линии размещаются на указанной высоте относительно нее.
RELATIVE_TO_MESH (синяя линия)
В качестве основы используется видимая поверхность, включая здания и камни. Затем каждая точка размещается на указанной высоте над этой сеткой, эффективно воспроизводя форму линии по отношению к видимому ландшафту.
Технически в этом режиме в качестве основы используется сетка (ЦМП), а местоположения размещаются на указанной высоте над ней. В зависимости от сетки линия может изменяться с учетом различных объектов на земле.
Если высота линий не указана
Теперь рассмотрим те же координаты, но без указания высоты:
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) в качестве основы. Поскольку высота не указана, точки накладываются непосредственно на сетку. Обратите внимание, что линия не накладывается на сетку, а соединяет указанные точки на сетке прямыми линиями. В некоторых случаях это может выглядеть приемлемо, но если на вырез накладываются другие элементы, могут возникнуть проблемы с видимостью. Эта проблема рассматривается в следующем разделе.
Взаимодействие сеток и линий. Теперь мы можем посмотреть на другую ломаную линию. На этом изображении показана та же область, но с большим охватом поверхности (или с более подробной информацией о ЦМП поверх ЦМР).
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 (на уровне земли). Белый – это АБСОЛЮТНЫЙ, и вы можете видеть, что прямые линии соединяют точки, которые абсолютно позиционированы в пространстве. Оранжевая и синяя линии – это относительные версии, которые относятся к ЦМР или ЦММ. Обратите внимание, что синяя линия немного отличается по форме из-за высоты объектов под ней.
Опять же, мы можем отметить, что характер создания линии означает, что линия проходит через сетку, поскольку точки соединены прямыми линиями. В этом случае линии могут быть не видны. Чтобы они отображались сквозь деревья, задайте для свойства drawsOccludedSegments значение true. На изображении ниже показано, как линии, проходящие через сетку, остаются видимыми.

Из-за особенностей позиционирования в пространстве точки могут попадать в сетку, а соединяющие их линии также могут попадать в сетку, что может привести к визуальным артефактам. В следующем разделе мы рассмотрим, как можно улучшить такие артефакты.
Решение проблем, связанных с взаимодействием линий и рельефа
В том же районе можно увидеть и другие артефакты, которые нужно учитывать при использовании определенных режимов высоты.
Здесь мы видим относительно плоскую область, которая в основном находится на уровне ЦМР, с ограниченным количеством дополнительных деталей над ней в сетке. Такая же ситуация будет в регионе, где нет 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). При использовании относительных значений высоты создание большего количества точек вдоль линии или многоугольника позволит разместить объект на более подходящем уровне, лучше соответствующем профилю высот. Если в ваших данных нет таких промежуточных точек, вы можете добавить их с помощью функции интерполяции, например функции Interpolate в библиотеке Geometry платформы Google Карт. Этим новым точкам можно присвоить относительные значения, которые будут размещены над соответствующим профилем высот, а затем длина любой линии, соединяющей точки, будет ограничена, а визуальное представление улучшено.
- Для абсолютных объектов (ABSOLUTE). Для абсолютных объектов большему количеству точек потребуются фактические значения высоты. Интерполяция между существующими абсолютными значениями не даст точки, которая точно отражает любое значение над сеткой, поскольку это будет просто среднее значение между точкой A и точкой B.
Сводка
Надеемся, что эта статья помогла вам разобраться в том, как работают параметры AltitudeMode в фотореалистичных 3D-картах и как ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND и RELATIVE_TO_MESH влияют на размещение и отрисовку различных объектов, таких как маркеры, линии и многоугольники.
Чтобы создавать точные и визуально привлекательные трехмерные карты с минимальным количеством артефактов, важно понимать, как эти режимы работают вместе с цифровой моделью рельефа (ЦМР) и цифровой моделью поверхности (ЦМП).
Надеемся, что вы попробуете использовать эти режимы высоты в своих проектах, чтобы раскрыть весь потенциал 3D-карт и создать привлекательные и захватывающие впечатления для своих пользователей. Будем рады вашим отзывам.
Авторы
Мэтт Тун (Matt Toon) | инженер по решениям, Geo Developer