Ao especificar a altitude de elementos em um mapa 3D, como linhas, polígonos, modelos ou marcadores, vários fatores podem afetar o posicionamento deles, tanto na cena quanto na forma como a renderização da cena interage com esse elemento. Este documento aborda o uso de AltitudeMode em um mapa 3D e como gerenciar a altitude dos elementos.
Veja como usar AltitudeMode com vários tipos de recursos:
Marcadores:Marker3DElement, Marker3DInteractiveElement
Especifique uma altitude no local e também a extrusão.
Modelos:Model3DElement, Model3DInteractiveElement
Especifique uma altitude no ponto de fixação do modelo, que deve ser usada com a orientação para o posicionamento adequado na cena.
Polilinhas:Polyline3DElement, Polyline3DInteractiveElement
Especifica como a altitude é aplicada para posicionar pontos ao longo de uma polilinha.
Polígonos:Polygon3DElement, Polygon3DInteractiveElement
Especifica como a altitude é aplicada para posicionar pontos ao longo de um polígono.
Como a altitude é usada em ambientes 3D
Ao colocar pontos em uma cena 3D, a posição final deles é influenciada pela presença de construções em 3D ou objetos 3D capturados, como árvores. É importante entender dois conceitos principais:
- Modelo digital de terreno (DTM, na sigla em inglês): representa a elevação da "terra nua". Pense nele como o formato natural da terra sem construções, árvores ou outras estruturas. Todas as áreas são sustentadas pelo DTM, que forma a base para a elevação do globo (calculada usando o EGM96).
- Modelo de superfície digital (DSM, na sigla em inglês): representa a elevação da "superfície superior", incluindo edifícios, árvores e outras estruturas. Em áreas onde os elementos foram capturados (principalmente ambientes urbanos em que os edifícios dominam a vista), a superfície visível vai aparecer mais alta do que o terreno de base.
A distinção entre DTM e DSM é vital para entender como diferentes modos de altitude interagem com esses modelos digitais de elevação (DEMs), já que o posicionamento dos elementos pode ser obscurecido ou influenciado pelo modelo de superfície. Confira as diferenças no diagrama abaixo:

Quando os elementos não têm dados de altitude
Se você tiver dados sem uma medição de altitude ou ao usar dados de outro serviço do Google, como os serviços Routes ou Places, geralmente não terá nenhuma altitude fornecida na geometria retornada. Nesses casos, para colocar o
recurso na cena, é preciso escolher um AltitudeMode com cuidado:
- Fixar no chão: a abordagem mais simples, em que o elemento se ajusta automaticamente ao terreno. Esse modo usa o modelo DTM.
- Atribuir uma altitude arbitrária + modo relativo: você pode atribuir uma altitude escolhida e usar RELATIVE_TO_GROUND (que posiciona os elementos em relação ao modelo DTM) ou RELATIVE_TO_MESH (que os faz flutuar acima do modelo DSM).
- Use outro serviço para obter a altitude: para uma altitude precisa do DTM no local do elemento, use um serviço como a API Elevation da Plataforma Google Maps. Se for uma linha ou um polígono, você precisará fazer isso para cada um dos pontos que compõem a linha ou o polígono.
O que as opções de AltitudeMode significam e quando usá-las?
Há quatro opções de AltitudeMode que você pode especificar ao definir um recurso:
ABSOLUTO
Imagine um avião voando a uma altitude específica acima do nível do mar, por exemplo,10.000 pés. A altura é fixa, não importa se ele está sobrevoando uma montanha ou um vale.
Como usar: a altitude do objeto é expressa em relação ao nível médio do mar (calculado usando o EGM96). A coordenada de altitude do elemento é interpretada como uma elevação precisa acima do nível médio do mar.
Quando usar: para elementos com altitudes conhecidas e precisas, como trajetos de voo, objetos submersos com profundidade exata ou instrumentos científicos de ponto fixo.
CLAMP_TO_GROUND
Imagine colocar uma toalha de piquenique diretamente em uma encosta. Não importa se a colina é íngreme ou plana, o cobertor sempre fica plano na superfície visível.
Como usar: a altitude do objeto é expressa como se ele estivesse colocado diretamente no chão. Eles vão permanecer no nível do solo, seguindo o terreno, independentemente de qualquer valor de altitude fornecido. A coordenada de altitude do elemento é ignorada, sendo projetada diretamente na superfície do terreno (DTM).
Quando usar: para elementos que precisam sempre se ajustar ao terreno, como estradas, cercas, trilhas, limites de propriedades ou a base de edifícios.
RELATIVE_TO_GROUND
Imagine um balão de ar quente que fica 100 metros acima da elevação natural do solo (DTM) abaixo dele. Se o solo subir, o balão vai subir com ele, mantendo essa distância de 100 metros da "terra nua".
Como usar: a altitude do objeto é expressa em relação à superfície do solo (DTM). A coordenada de altitude do elemento é interpretada como um deslocamento da elevação do terreno na posição horizontal.
Quando usar: para objetos que precisam manter uma altura consistente acima do terreno natural, como torres de comunicação ou linhas aéreas em áreas rurais.
RELATIVE_TO_MESH
É como um drone voando a uma altura fixa acima do que está abaixo dele, seja o chão, o telhado de um prédio ou o topo de uma árvore. Ele se ajusta à superfície visível mais alta (DSM).
Como usar: a altitude do objeto é expressa em relação ao ponto mais alto da superfície do solo, do edifício ou da superfície da água (DSM). A coordenada de altitude do elemento é interpretada como um deslocamento da elevação do DSM.
Quando usar: para objetos que precisam flutuar a uma determinada altura acima do que está fisicamente presente (DTM, edifícios, água), útil para marcadores em telhados ou elementos que se ajustam dinamicamente à cena visível.
Para mais detalhes, consulte a documentação das constantes AltitudeMode.
Exemplos visuais e aplicações práticas
Esses exemplos usam um local específico, Stonehenge, para ilustrar como diferentes opções de AltitudeMode afetam o posicionamento do recurso. Esses exemplos abordam primeiro o posicionamento de marcadores e, em seguida, de linhas e áreas, que têm algumas considerações diferentes.
Marcadores de posição
Considere um marcador de alfinete colocado da seguinte maneira:
const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };
Ele é representado pelo alfinete branco na cena abaixo:

Agora, observe a imagem abaixo, que mostra pins de várias cores posicionados usando os diferentes modos de altitude.

Vamos conferir como os diferentes AltitudeMode afetam o posicionamento do marcador em ordem crescente de elevação.
CLAMP_TO_GROUND (alfinete roxo)
Esse alfinete ignora o valor de altitude e se fixa à elevação do solo mais próxima. Ele aparece logo abaixo do alfinete branco, "fixado" ao terreno.
Tecnicamente, esse modo ignora a altitude real e fixa o alfinete na altura mais próxima do DTM.
ABSOLUTE (White Pin)
Esse alfinete usa o valor exato de altitude (102,23 m) para colocar o marcador nessa altura acima do nível do mar (EGM96), aparecendo no topo de uma das pedras de Stonehenge, conforme especificado pela altitude fornecida.
Tecnicamente, esse modo usa o valor de altitude fornecido para colocar o alfinete na altura especificada acima do nível do mar, que, neste exemplo, é o local de Stonehenge, mas no topo de uma das pedras.
RELATIVE_TO_GROUND (alfinete laranja)
Esse marcador usa o solo (DTM) como base e se posiciona 102,23 m acima desse nível, parecendo flutuar acima do solo natural que está sob a pedra no henge.
Tecnicamente, esse modo define a base como o nível do DTM real no chão e coloca o alfinete a 102,23 m acima dele.
RELATIVE_TO_MESH (alfinete azul)
Esse alfinete usa a superfície visível (DSM) como base e se posiciona 102,23 m acima dela. Esse modo inclui a altura da pedra na medição, alinhando-a um pouco acima do alfinete laranja.
Tecnicamente, esse modo usa a malha (DSM) como base e coloca o local na altitude especificada acima dela. Como o DSM está no topo da pedra, esse alfinete inclui essa altura extra na medição ao determinar a altura relativa, alinhando-o um pouco mais alto do que o alfinete RELATIVE_TO_GROUND.
Linhas e áreas de posição
Para linhas e áreas, tanto a altitude dos pontos dentro do elemento (especificada ou não) quanto o AltitudeMode usado são cruciais. Vamos
analisar uma linha ao longo de Stonehenge com as seguintes altitudes especificadas:
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 }
];
Essa linha está representada em branco na imagem abaixo, usando o posicionamento absoluto.

Mais uma vez, a imagem abaixo mostra as linhas usando diferentes modos de altitude. Vamos discutir cada um deles, do menor para o maior.

CLAMP_TO_GROUND (linha roxa)
Essa linha ignora a altitude especificada para cada ponto e, em vez disso, "sobrepõe" a linha diretamente sobre o solo (DTM). Ele segue o terreno, ignorando a presença de qualquer elemento, como edifícios ou pedras acima dele.
Tecnicamente, esse modo ignora os valores de altitude reais e sobrepõe a linha no DTM, seguindo o terreno subjacente e ignorando a malha de elementos acima dele.
ABSOLUTE (linha branca)
Essa linha usa a altitude exata de cada ponto, fazendo com que ela passe por cima de algumas pedras. Ele é conectado por linhas retas entre cada ponto, o que às vezes pode fazer com que ele pareça passar por objetos se os pontos não forem frequentes o suficiente.
Tecnicamente, esse modo segue a altitude especificada para cada ponto, conectando-os com linhas retas, o que significa que ele pode passar pela malha (por exemplo, pedras) se os valores de altitude determinarem. Esse cenário é abordado em uma seção posterior.
RELATIVE_TO_GROUND (linha laranja)
Essa linha usa o solo natural (DTM) como base e coloca cada ponto na altitude especificada acima do nível do solo.
Tecnicamente, esse modo usa o DTM como base e coloca os locais da linha na altitude listada em relação a ele.
RELATIVE_TO_MESH (linha azul)
Essa linha usa a superfície visível, que inclui edifícios e pedras, como base. Em seguida, ele coloca cada ponto na altitude especificada acima dessa malha, replicando de forma eficaz a forma da linha em relação à paisagem visível.
Tecnicamente, esse modo usa a malha (DSM) como base e coloca os locais na altitude especificada acima dela. Dependendo da malha, a linha pode mudar de acordo com os diferentes recursos no solo.
Quando a altitude não é especificada para linhas
Agora, vamos considerar as mesmas coordenadas de linha, mas sem nenhuma altitude especificada:
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 }
];
Nesse cenário, em que nenhuma altitude é fornecida, as linhas geralmente aparecem em locais semelhantes. As linhas branca, laranja e roxa podem se fundir em uma única linha (laranja, já que normalmente é desenhada por último) porque todas têm como padrão um posicionamento semelhante ao nível do solo. Confira abaixo:

A linha azul (RELATIVE_TO_MESH) usa novamente a malha (DSM) como base. Como nenhuma altitude é especificada, ele apenas sobrepõe os pontos diretamente sobre a malha. É importante observar que ele não coloca a linha na malha, mas conecta os pontos especificados na malha com conexões retas. Embora isso possa parecer aceitável em alguns exemplos, pode causar problemas de visibilidade quando coberto por outros recursos. Esse problema é abordado na próxima seção.
A interação de malhas e linhas. Agora, vamos analisar outra polilinha. Esta imagem está na mesma área, mas com mais cobertura do solo (ou mais detalhes no DSM sobre o DTM).
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 },
];
Quando vemos a representação usando os mesmos métodos (e cores) de antes, temos esta visualização:

Roxo é CLAMP_TO_GROUND, que você pode ver ao longo do chão. O branco é ABSOLUTE, em que linhas retas conectam os pontos que estão posicionados de forma absoluta no espaço. Com o laranja e o azul sendo versões relativas sobre a SUPERFÍCIE (DTM) ou a MALHA (DSM), observe que a linha azul é ligeiramente diferente em forma devido à altura dos recursos abaixo.
Novamente, podemos notar que a natureza da criação da linha significa que ela passa pela malha, já que os pontos são conectados por linhas retas. Esse cenário pode causar problemas na visualização das linhas. Portanto, defina drawsOccludedSegments como true para garantir que a linha fique visível entre as árvores, conforme mostrado em mais detalhes na imagem a seguir, em que as linhas que passam pela malha ainda podem ser vistas.

A natureza do posicionamento no espaço significa que os pontos podem cair dentro da malha, e as linhas que conectam os pontos também podem cair na malha, o que pode causar artefatos visuais. Na seção abaixo, vamos ver como esses artefatos podem ser melhorados, quando possível.
Como resolver problemas na interação entre linhas e terreno
Em outro exemplo, na mesma área, podemos ver alguns outros artefatos que precisamos considerar ao usar modos de altitude específicos.
Aqui temos uma área relativamente plana que está principalmente no nível do DTM, com poucos detalhes extras acima dele na malha. Esse cenário também seria o caso em uma área que não tivesse cobertura 3D acima do modelo de terreno. Vamos analisar o seguinte local, conforme especificado abaixo:
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 },
];
Como mostrado na imagem, as linhas têm a mesma representação de cor de antes: branco (ABSOLUTE), azul (RELATIVE_TO_MESH), roxo (CLAMP_TO_GROUND) e laranja (RELATIVE_TO_GROUND).

Aqui, podemos ver vários artefatos. O primeiro é que, devido à falta de cobertura de superfície, as linhas laranja (RELATIVE_TO_GROUND) e azul (RELATIVE_TO_MESH) estão (na maior parte) no mesmo local (com a linha azul sendo mostrada como é desenhada por último).
Também podemos ver que a linha roxa (CLAMP_TO_GROUND) segue o solo e pode ser vista na colina, enquanto a linha branca (ABSOLUTE) desaparece na colina, já que apenas os pontos estão conectados e as linhas retas passam pelo solo.
Isso pode ser visto especificamente nesta imagem, em que a linha roxa foi ocultada.

Isso pode levar a alguns artefatos visuais estranhos, em que a linha pode desaparecer sob o solo (ou até mesmo pela malha), já que a linha entre os pontos segue apenas um caminho reto. É possível melhorar a exibição visual dessa linha adicionando mais pontos entre as linhas com um método de interpolação. O efeito visual depende do método usado:
- Para medições relativas (RELATIVE_TO_GROUND ou RELATIVE_TO_MESH): ao usar valores de altitude relativa, criar mais pontos ao longo de uma linha ou polígono permite que o elemento seja colocado em um nível mais apropriado, de acordo com o perfil de elevação. Se esses pontos intermediários não estiverem presentes nos seus dados, use uma função de interpolação, como a função Interpolate na biblioteca Geometry da Plataforma Google Maps, para adicioná-los. Esses novos pontos podem receber valores relativos que serão colocados acima do perfil de elevação relevante, e o comprimento de qualquer linha que une os pontos será limitado, melhorando a representação visual.
- Para recursos absolutos (ABSOLUTE): para recursos ABSOLUTE, mais pontos precisarão ter valores de altitude reais. A interpolação entre valores absolutos existentes não fornece um ponto que reflita com precisão qualquer valor acima da malha, já que seria apenas uma média entre o ponto A e o ponto B.
Resumo
Esperamos que este documento tenha fornecido uma visão geral abrangente das opções de AltitudeMode no Photorealistic 3D Maps, detalhando como ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND e RELATIVE_TO_MESH afetam o posicionamento e a renderização de vários elementos, como marcadores, linhas e polígonos.
Entender como esses modos funcionam com o Modelo Digital de Terreno (DTM, na sigla em inglês) e o Modelo Digital de Superfície (DSM, na sigla em inglês) é crucial para criar representações de mapas 3D precisas e visualmente atraentes com o mínimo de artefatos visuais.
Esperamos que você teste esses modos de altitude nos seus projetos para aproveitar todo o potencial do mapeamento em 3D, criar experiências envolventes e imersivas para os usuários e enviar feedback.
Colaboradores
Matt Toon | Engenheiro de soluções, desenvolvedor de Geo