Понимание режимов и характеристик высоты на 3D-картах

При указании высоты для объектов на 3D-карте, таких как линии, полигоны, модели или маркеры, существует ряд факторов, которые могут влиять на их расположение как внутри сцены, так и на взаимодействие рендеринга сцены с этим объектом. В этом документе рассматривается использование режима AltitudeMode на 3D-карте и управление высотой объектов.

Вот как можно использовать AltitudeMode с различными типами объектов:

  • Маркеры: Marker3DElement , Marker3DInteractiveElement

    Укажите высоту над уровнем моря, а также выдавливание.

  • Модели: Model3DElement , Model3DInteractiveElement

    Укажите высоту точки привязки модели, которую следует использовать вместе с ее ориентацией для правильного позиционирования в сцене.

  • Полилинии: Polyline3DElement , Polyline3DInteractiveElement

    Укажите, как высота применяется к расположению точек вдоль полилинии.

  • Полигоны: Polygon3DElement , Polygon3DInteractiveElement

    Укажите, как высота применяется к расположению точек вдоль многоугольника.

Как высота используется в 3D-средах

При размещении точек в 3D-сцене их конечное положение зависит от наличия в кадре 3D-зданий или других объектов, например, деревьев. Важно понимать два ключевых момента:

  • Цифровая модель рельефа (ЦМР) : представляет собой рельеф «голой земли». Представьте себе естественную форму рельефа без зданий, деревьев и других сооружений на поверхности. Все территории основаны на ЦМР, которая служит основой для определения рельефа земного шара (рассчитанного с помощью EGM96 ).
  • Цифровая модель поверхности (DSM) : представляет собой высоту «верхней поверхности», включая здания, деревья и другие сооружения. В областях, где были запечатлены объекты (особенно в городской среде, где здания доминируют в поле зрения), видимая поверхность будет казаться выше базовой поверхности.

Различие между ЦМР и ЦМП крайне важно для понимания того, как различные режимы высот взаимодействуют с цифровыми моделями рельефа (ЦМР), поскольку расположение объектов может быть перекрыто или подвержено влиянию модели поверхности. Различия показаны на диаграмме ниже:

Трехмерная карта, показывающая различие между цифровой моделью рельефа (ЦМР) и цифровой моделью поверхности (ЦМП).

Когда отсутствуют данные о высоте

Если у вас есть данные, в которых отсутствует измерение высоты, или вы используете данные из другого сервиса Google, например, сервисов Routes или Places, в возвращаемой геометрии часто не будет указана высота. В таких случаях размещение объекта в сцене требует тщательного выбора AltitudeMode :

  • Прикрепить к земле : самый простой подход, при котором объект автоматически подстраивается под рельеф. В этом режиме используется модель ЦМР.
  • Задайте ему произвольную высоту + относительный режим : вы можете назначить выбранную высоту, а затем использовать RELATIVE_TO_GROUND (который размещает объекты относительно модели DTM) или RELATIVE_TO_MESH (который перемещает их над моделью DSM).
  • Воспользуйтесь другим сервисом для получения высоты : для точного определения высоты DTM в месте расположения объекта можно использовать такой сервис, как Google Maps Platform Elevation API . Если это линия или многоугольник, вам потребуется выполнить это для каждой точки, составляющей линию или многоугольник.

Что означают параметры AltitudeMode и когда их следует использовать?

При определении объекта можно указать четыре параметра AltitudeMode :

АБСОЛЮТНЫЙ

Представьте себе самолёт, летящий на определённой высоте над уровнем моря, скажем, 10 000 футов. Его высота фиксирована, независимо от того, летит ли он над горой или над долиной.

Как использовать : Высота объекта выражается относительно среднего уровня моря (рассчитанного с помощью EGM96). Координата высоты объекта интерпретируется как точное значение высоты над средним уровнем моря.

Когда использовать : Для объектов с известными и точными высотами, таких как траектории полетов, подводные объекты с точной глубиной или научные приборы с фиксированной точкой.

CLAMP_TO_GROUND

Представьте, что вы расстелили одеяло для пикника прямо на склоне холма. Независимо от того, насколько крутой или пологий склон, одеяло всегда ровно лежит на видимой поверхности.

Как использовать : Высота объекта указана для размещения непосредственно на поверхности земли. Он останется на уровне земли, следуя рельефу, независимо от указанного значения высоты. Координаты высоты объекта игнорируются; они проецируются непосредственно на поверхность рельефа (ЦМР).

Когда использовать : Для объектов, которые всегда должны соответствовать рельефу местности, таких как дороги, заборы, тропы, границы участков или основания зданий.

ОТНОСИТЕЛЬНО_ЗЕМЛИ

Представьте себе воздушный шар, парящий на высоте 100 метров над уровнем земли. Если земля поднимается, шар поднимается вместе с ней, сохраняя этот 100-метровый зазор над «голой землёй».

Как использовать : Высота объекта выражается относительно поверхности земли (ЦМР). Координата высоты объекта интерпретируется как смещение относительно высоты рельефа в его горизонтальном положении.

Когда использовать : Для объектов, которым необходимо сохранять постоянную высоту над естественным рельефом, например, коммуникационных вышек или воздушных линий электропередачи в сельской местности.

ОТНОСИТЕЛЬНО_К_СЕТИ

Это похоже на дрон, летящий на фиксированной высоте над объектом, будь то голая земля, крыша здания или верхушка дерева. Он подстраивается под самую высокую видимую поверхность (DSM).

Как использовать : Высота объекта выражается относительно самой высокой точки поверхности земли, зданий и воды (DSM). Координата высоты объекта интерпретируется как смещение относительно высоты DSM.

Когда использовать : Для объектов, которые должны парить на определенной высоте над тем, что физически находится рядом (ЦМР, здания, вода), полезно для маркеров на крышах или объектов, которые динамически подстраиваются под видимую сцену.

Более подробную информацию см. в документации по константам AltitudeMode .

Наглядные примеры и практические применения

В этих примерах на примере конкретного места, Стоунхенджа, показано, как различные параметры AltitudeMode влияют на размещение объектов. Сначала рассматриваются маркеры позиционирования, затем линии и области, которые требуют некоторых дополнительных факторов.

Маркеры положения

Рассмотрим булавочный маркер, размещенный следующим образом:

const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };

Вы можете увидеть это в виде белой булавки на изображении ниже:

Трехмерная карта с белым маркером-булавкой, иллюстрирующая стандартное размещение маркера.

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

Трехмерная карта, на которой изображено несколько меток (белая, фиолетовая, оранжевая, синяя), расположенных с использованием различных режимов высоты, все они сосредоточены вокруг Стоунхенджа.

Давайте рассмотрим, как различные AltitudeMode влияют на позиционирование маркера в порядке возрастания высоты.

CLAMP_TO_GROUND (фиолетовый контакт)

Эта метка игнорирует значение высоты и прикрепляется к ближайшей точке на поверхности. Вы можете увидеть её чуть ниже белой метки, фактически «прикрепляясь» к рельефу.

Технически этот режим игнорирует фактическую высоту и прикрепляет штифт к ближайшей высоте DTM.

АБСОЛЮТ (Белая булавка)

Этот значок использует точное значение высоты (102,23 м) для размещения маркера на этой высоте над уровнем моря (EGM96), появляющегося на вершине одного из камней Стоунхенджа, как указано в указанной высоте.

Технически этот режим использует фактическое предоставленное значение высоты для размещения булавки на указанной высоте над уровнем моря, которая в данном примере является местоположением Стоунхенджа, но на вершине одного из камней.

ОТНОСИТЕЛЬНО_К_ЗЕМЛЕ (оранжевый штифт)

Этот штифт берет землю (DTM) в качестве своего основания и располагается на высоте 102,23 м над уровнем земли, создавая впечатление, что он парит над естественной землей, которая находится под камнем в хендже.

Технически этот режим устанавливает свою базу на уровне фактической ЦМР на земле, а затем помещает штифт на высоте 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 (фиолетовая линия)

Эта линия игнорирует заданную высоту каждой точки и вместо этого «накладывается» непосредственно на подстилающую поверхность (ЦМР). Она следует рельефу, игнорируя наличие каких-либо объектов, таких как здания или камни, над ней.

Технически этот режим игнорирует фактические значения высоты и накладывает линию на ЦМР, следуя рельефу местности и игнорируя сетку объектов над ней.

АБСОЛЮТ (Белая линия)

Эта линия использует точную высоту каждой точки, из-за чего проходит над некоторыми камнями. Она соединена прямыми линиями между всеми точками, из-за чего иногда может создаваться впечатление, что она проходит сквозь объекты, если точки расположены недостаточно часто.

Технически этот режим отслеживает заданную высоту для каждой точки, соединяя их прямыми линиями, что позволяет проходить сквозь сетку (например, камни), если это позволяют значения высоты. Этот сценарий будет рассмотрен в следующем разделе.

ОТНОСИТЕЛЬНО_ЗЕМЛИ (Оранжевая линия)

Эта линия использует естественную поверхность земли (ЦМР) в качестве своей основы и размещает каждую точку на указанной высоте над уровнем земли.

Технически этот режим использует ЦМР в качестве основы и размещает линии на указанной высоте относительно нее.

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

В этом сценарии, где высота не указана, линии часто отображаются в схожих местах. Белая, оранжевая и фиолетовая линии могут сливаться в одну (оранжевую, поскольку она обычно рисуется последней), поскольку все они по умолчанию имеют схожее положение относительно уровня земли. Вы можете видеть это ниже:

Трехмерная карта, на которой показано несколько цветных линий (оранжевый, синий) вокруг Стоунхенджа, при этом белые и фиолетовые линии сливаются из-за отсутствия данных о высоте.

Синяя линия ( 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 },
];

И это можно увидеть на изображении, где линии имеют то же цветовое представление, что и раньше: (белый: АБСОЛЮТНЫЙ, синий: ОТНОСИТЕЛЬНО_К_СЕТКЕ, фиолетовый: ПРИЖИМНЫЙ_К_ЗЕМЛЕ, оранжевый: ОТНОСИТЕЛЬНО_К_ЗЕМЛЕ).

Трехмерная карта, на которой показаны линии разных цветов (белые, синие, фиолетовые, оранжевые) на относительно ровной местности, с выделением визуальных артефактов там, где линии исчезают в земле.

Здесь мы видим ряд артефактов, первый из которых заключается в том, что из-за отсутствия поверхностного покрытия оранжевая (RELATIVE_TO_GROUND) и синяя (RELATIVE_TO_MESH) линии находятся (в основном) в одном и том же месте (при этом синяя линия показана такой, какой она была нарисована последней).

Мы также видим, что фиолетовая линия (CLAMP_TO_GROUND) следует земле и ее можно увидеть на холме, в то время как белая линия (ABSOLUTE) исчезает в холме, поскольку соединены только точки, а прямые линии проходят через землю.

Это особенно заметно на этом изображении, когда фиолетовая линия скрыта.

Трехмерная карта, на которой показаны белые и синие линии, исчезающие в холме, при этом фиолетовая линия скрыта, что иллюстрирует визуальные артефакты абсолютных и относительных линий сетки.

Это может привести к появлению странных визуальных артефактов, когда линия может исчезать под землёй (или даже сквозь сетку), поскольку линия между точками просто следует прямой. Вы можете улучшить визуальное отображение такой линии, добавив больше точек между линиями с помощью метода интерполяции. Влияние этого на визуальную составляющую, опять же, будет зависеть от используемого метода:

  • Для относительных измерений (RELATIVE_TO_GROUND или RELATIVE_TO_MESH) : при использовании относительных значений высоты создание дополнительных точек вдоль линии или полигона позволит разместить объект на более подходящем уровне, лучше соответствующем профилю рельефа. Если этих промежуточных точек нет в ваших данных, вы можете использовать функцию интерполяции, например, функцию Interpolate из библиотеки геометрии платформы Google Карт, чтобы добавить их. Этим новым точкам затем можно присвоить относительные значения, которые будут размещены над соответствующим профилем рельефа. В этом случае длина любой линии, соединяющей точки, будет ограничена, а визуальное представление улучшится.
  • Для абсолютных объектов (ABSOLUTE) : для АБСОЛЮТНЫХ объектов потребуется больше точек с фактическими значениями высоты. Интерполяция между существующими абсолютными значениями не даст точку, точно отражающую любое значение над сеткой, поскольку это будет просто среднее значение между точками A и B.

Краткое содержание

Надеемся, этот документ предоставил вам полный обзор параметров AltitudeMode в фотореалистичных 3D-картах, подробно описав, как ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND и RELATIVE_TO_MESH влияют на размещение и рендеринг различных объектов, таких как маркеры, линии и полигоны.

Понимание того, как эти режимы работают вместе с базовой цифровой моделью рельефа (ЦМР) и цифровой моделью поверхности (ЦМП), имеет решающее значение для создания точных и визуально привлекательных трехмерных карт с минимальным количеством визуальных артефактов.

Мы надеемся, что вы поэкспериментируете с этими режимами высоты в своих собственных проектах, чтобы раскрыть весь потенциал 3D-картографирования и создать увлекательные, захватывающие впечатления для своих пользователей, а также предоставите обратную связь.

Авторы

Мэтт Тун | Инженер-разработчик решений, георазработчик