Entender os modos e recursos de altitude nos mapas 3D

Ao especificar a altitude de recursos 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 recurso. Este documento aborda o uso de AltitudeMode em um mapa 3D e como gerenciar a altitude dos recursos.

Confira como usar AltitudeMode com vários tipos de recursos:

Como a altitude é usada em ambientes 3D

Ao colocar pontos em uma cena 3D, a posição final deles é influenciada pela presença de edifícios ou objetos 3D capturados, como árvores. É importante entender dois conceitos principais:

  • Modelo digital de terreno (DTM): representa a elevação da "terra nua". Pense nisso como a forma natural da terra sem edifícios, árvores ou outras estruturas. Todas as áreas são baseadas no DTM, que forma a base para a elevação do globo (calculada usando o EGM96).
  • Modelo digital de superfície (DSM): representa a elevação da "superfície superior", incluindo edifícios, árvores e outras estruturas. Em áreas onde os recursos foram capturados (principalmente ambientes urbanos em que os edifícios dominam a paisagem), a superfície visível vai aparecer mais alta do que o terreno básico.

A distinção entre DTM e DSM é vital para entender como diferentes modos de altitude interagem com esses modelos digitais de elevação (MDEs), já que o posicionamento dos recursos pode ser obscurecido ou influenciado pelo modelo de superfície. Confira as diferenças no diagrama abaixo:

Um mapa 3D mostrando a distinção entre o Modelo Digital de Terreno (DTM) e o Modelo Digital de Superfície (DSM).

Quando os recursos 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 o Routes ou o 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 recurso se ajusta automaticamente ao terreno. Esse modo usa o modelo DTM.
  • Atribua uma altitude arbitrária + modo relativo: você pode atribuir uma altitude escolhida e usar RELATIVE_TO_GROUND (que posiciona os recursos em relação ao modelo DTM) ou RELATIVE_TO_MESH (que os coloca acima do modelo DSM).
  • Use outro serviço para receber a altitude: para ter uma altitude DTM precisa no local do recurso, use um serviço como a API Elevation da Plataforma Google Maps. Se for uma linha ou um polígono, faça 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 podem ser especificadas ao definir um recurso:

ABSOLUTE

Imagine um avião voando a uma altitude específica acima do nível do mar, digamos,3.000 metros. A altura é fixa, não importa se ele está voando sobre 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 recurso é interpretada como uma elevação precisa acima do nível médio do mar.

Quando usar: para recursos 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 o quão íngreme ou plana seja a colina, o cobertor sempre fica reto na superfície visível.

Como usar: a altitude do objeto é expressa como se ele estivesse diretamente no chão. Eles vão permanecer no nível do solo, seguindo o terreno, independente de qualquer valor de altitude fornecido. A coordenada de altitude do recurso é ignorada e projetada diretamente na superfície do terreno (DTM).

Quando usar: para recursos que precisam sempre estar de acordo com o terreno, como estradas, cercas, trilhas, limites de propriedade ou a base de edifícios.

RELATIVE_TO_GROUND

Imagine um balão de ar quente que fica a 100 metros acima de qualquer que seja a elevação natural do terreno (DTM) abaixo dele. Se o terreno subir, o balão vai subir junto, mantendo essa distância de 100 metros do "solo".

Como usar: a altitude do objeto é expressa em relação à superfície do solo (DTM). A coordenada de altitude do recurso é 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 de qualquer coisa que esteja sobrevoando, 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 à mais alta das superfícies de solo, edifício e água (DSM). A coordenada de altitude do recurso é interpretada como um deslocamento da elevação do DSM.

Quando usar: para objetos que precisam flutuar a uma determinada altura acima de qualquer coisa que esteja fisicamente ali (DTM, edifícios, água). Útil para marcadores em telhados ou recursos 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. Primeiro, esses exemplos abordam marcadores de posicionamento e, em seguida, linhas e áreas, que têm algumas considerações diferentes.

Marcadores de posição

Considere um marcador de alfinete colocado da seguinte forma:

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

Você pode ver isso como o marcador branco na cena abaixo:

Uma cena de mapa em 3D com um marcador de alfinete branco, ilustrando o posicionamento padrão de um marcador.

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

Uma cena de mapa em 3D mostrando vários marcadores (branco, roxo, laranja, azul) posicionados usando diferentes modos de altitude, todos centralizados em Stonehenge.

Vamos analisar como os diferentes AltitudeModeafetam o posicionamento do marcador em ordem crescente de elevação.

CLAMP_TO_GROUND (pino roxo)

Esse marcador ignora o valor de altitude e se fixa na elevação do solo mais próxima. Ele fica logo abaixo do marcador branco, "fixado" ao terreno.

Tecnicamente, esse modo ignora a altitude real e fixa o marcador na altura do DTM mais próxima.

ABSOLUTO (pino branco)

Esse marcador usa o valor exato da altitude (102,23 m) para colocar o marcador nessa altura acima do nível do mar (EGM96), aparecendo em cima de uma das pedras de Stonehenge, conforme especificado pela altitude fornecida.

Tecnicamente, esse modo usa o valor de altitude fornecido para colocar o marcador 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 (pino laranja)

Esse marcador usa o terreno (DTM) como base e se posiciona 102,23 m acima do nível do solo, parecendo flutuar acima do terreno natural que está sob a pedra no henge.

Tecnicamente, esse modo define a base no nível do DTM real no solo e coloca o marcador a 102,23 m acima dele.

RELATIVE_TO_MESH (pino azul)

Esse marcador 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 mais acima do marcador laranja.

Tecnicamente, esse modo usa a malha (DSM) como base e coloca o local na altitude especificada acima dela. Como o DSM está na parte de cima da pedra, o marcador inclui essa altura extra na medição ao determinar a altura relativa, alinhando-o um pouco mais alto do que o marcador RELATIVE_TO_GROUND.

Posicionar linhas e áreas

Para linhas e áreas, tanto a altitude dos pontos no recurso (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 é representada na imagem abaixo em branco, usando posicionamento absoluto.

Um mapa em 3D mostrando uma linha branca colocada ao redor de Stonehenge usando 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.

Um mapa 3D mostrando várias linhas coloridas (roxo, branco, laranja, azul) posicionadas ao redor de Stonehenge usando diferentes modos de altitude.

CLAMP_TO_GROUND (linha roxa)

Essa linha ignora a altitude especificada para cada ponto e, em vez disso, "cobre" a linha diretamente sobre o terreno subjacente (DTM). Ele segue o terreno, ignorando a presença de recursos como edifícios ou pedras acima dele.

Tecnicamente, esse modo ignora os valores reais de altitude e envolve a linha sobre o DTM, seguindo o terreno subjacente e ignorando a malha de recursos acima dele.

ABSOLUTO (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 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. Isso significa que ele pode passar pela malha (por exemplo, pedras) se os valores de altitude determinarem isso. Esse cenário será abordado em uma seção posterior.

RELATIVE_TO_GROUND (linha laranja)

Essa linha usa o terreno natural (DTM) como base e coloca cada ponto na altitude especificada acima desse nível do solo.

Tecnicamente, esse modo usa o DTM como base e coloca os locais das linhas 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 efetivamente o formato 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 devido aos diferentes recursos no solo.

Quando a altitude não é especificada para linhas

Agora, vamos considerar as mesmas coordenadas de linha, mas sem 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 geralmente é desenhada por último) porque todas têm um posicionamento semelhante no nível do solo por padrão. Confira abaixo:

Um mapa 3D mostrando várias linhas coloridas (laranja, azul) ao redor de Stonehenge, com as linhas brancas e roxas se unindo devido à falta de dados de altitude.

A linha azul (RELATIVE_TO_MESH) usa a malha (DSM) como base. Como nenhuma altitude é especificada, ele apenas sobrepõe os pontos diretamente na parte superior da malha. É importante observar que ele não coloca a linha na malha, mas conecta os pontos especificados com conexões retas. Embora isso pareça 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 podemos analisar outra polilinha. Essa 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:

Um mapa 3D mostrando várias linhas coloridas (roxo, branco, laranja, azul) sobre um terreno com árvores e elevações variadas.

Roxo é CLAMP_TO_GROUND, que você pode ver ao longo do chão. O branco é ABSOLUTO, e você pode ver que as linhas retas conectam os pontos que estão posicionados absolutamente no espaço. Como laranja e azul são versões relativas sobre a superfície (DTM) ou a malha (DSM), observe que a linha azul é ligeiramente diferente na forma devido à altura dos recursos abaixo.

Novamente, podemos observar que a natureza da criação de linhas significa que a linha passa pela malha à medida que os pontos são conectados por linhas retas. Esse cenário pode causar problemas na visualização das linhas. Por isso, 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.

Um mapa 3D mostrando linhas passando por árvores, com segmentos ocluídos visíveis para ilustrar a oclusão de segmentos: true.

A natureza do posicionamento no espaço significa que os pontos podem estar dentro da malha, e as linhas que os conectam também podem estar dentro dela, causando artefatos visuais. Na seção abaixo, vamos mostrar como esses artefatos podem ser melhorados, quando possível.

Resolver problemas na interação entre linhas e terreno

Em outro exemplo, na mesma área, podemos ver outros artefatos que precisamos conhecer ao usar modos de altitude específicos.

Aqui temos uma área relativamente plana, principalmente no nível do DTM, com poucos detalhes extras acima dela na malha. Esse cenário também seria o caso em uma área sem 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 cores de antes: branco (ABSOLUTE), azul (RELATIVE_TO_MESH), roxo (CLAMP_TO_GROUND) e laranja (RELATIVE_TO_GROUND).

Um mapa 3D mostrando várias linhas coloridas (branco, azul, roxo, laranja) sobre um terreno relativamente plano, destacando artefatos visuais em que as linhas desaparecem no chão.

Aqui, podemos ver vários artefatos. O primeiro é que, devido à falta de cobertura da superfície, as linhas laranja (RELATIVE_TO_GROUND) e azul (RELATIVE_TO_MESH) estão (principalmente) no mesmo local (a linha azul é mostrada porque é desenhada por último).

Também podemos ver que a linha roxa (CLAMP_TO_GROUND) segue o chão e pode ser vista na colina, enquanto a linha branca (ABSOLUTE) parece desaparecer na colina, já que apenas os pontos são conectados e as linhas retas atravessam o chão.

É possível ver isso especificamente nesta imagem quando a linha roxa está oculta.

Um mapa 3D mostrando linhas brancas e azuis desaparecendo em uma colina, com a linha roxa oculta, ilustrando artefatos visuais de linhas absolutas e relativas à malha.

Isso pode levar a alguns artefatos visuais estranhos, em que a linha desaparece sob o chão (ou até mesmo através da malha) à medida que a linha entre os pontos segue um caminho reto. Você pode melhorar a exibição visual de uma linha adicionando mais pontos entre elas usando um método de interpolação. O efeito visual vai depender 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 um polígono permite que o recurso seja colocado em um nível mais adequado, obedecendo melhor ao 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 de geometria 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. Assim, o comprimento de qualquer linha que une os pontos será limitado e a representação visual será melhorada.
  • Para atributos absolutos (ABSOLUTE): para atributos ABSOLUTE, mais pontos precisam ter valores de altitude reais. A interpolação entre valores absolutos existentes não vai gerar 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 oferecido uma visão geral abrangente das opções de AltitudeMode nos mapas 3D fotorrealistas, detalhando como ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND e RELATIVE_TO_MESH afetam o posicionamento e a renderização de vários recursos, como marcadores, linhas e polígonos.

Entender como esses modos funcionam com o modelo digital de terreno (DTM) e o modelo digital de superfície (DSM) é fundamental 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 3D e criar experiências envolventes e imersivas para seus usuários. Não se esqueça de enviar feedback.

Colaboradores

Matt Toon | Engenheiro de soluções, desenvolvedor do Geo