Entender os modos e recursos de altitude nos mapas 3D

Ao especificar a altitude de elementos em um mapa 3D fotorrealista, como linhas, polígonos, modelos ou marcadores, há vários fatores que 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.

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

Como a altitude é usada em ambientes 3D

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

  • Modelo digital de terreno (DTM): representa a elevação do "solo nu" . Pense nele como a forma natural da terra sem edifícios, árvores ou outras estruturas. Todas as áreas são sustentadas por o DTM, que forma a base da elevação do globo (calculada usando EGM96).
  • Modelo de superfície digital (DSM): representa a elevação da "superfície superior" , incluindo edifícios, árvores e outras estruturas. Em áreas em que os elementos foram capturados (principalmente ambientes urbanos em que os edifícios dominam a visualização), a superfície visível vai parecer mais alta do que o terreno de base.

A distinção entre DTM e DSM é essencial 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:

Um mapa 3D mostrando a distinção entre o modelo digital de terreno (DTM) e o modelo digital de superfície (DSM).

Quando os elementos não têm dados de altitude

Se você tiver dados que não têm uma medição de altitude ou ao usar dados de outro serviço do Google, como o Routes ou o Places, geralmente não haverá altitude fornecida na geometria retornada. Nesses casos, para posicionar o elemento na cena, é necessário escolher um AltitudeMode com cuidado:

  • Fixar no chão: a abordagem mais simples, em que o elemento se adapta 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 flutua acima do modelo DSM).
  • Usar outro serviço para receber a altitude: para uma altitude DTM precisa no local do elemento, você pode usar um serviço como a Plataforma Google Maps API Elevation. Se for uma linha ou um polígono, será necessário 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 elemento:

ABSOLUTE

Imagine um avião voando a uma altitude específica acima do nível do mar, digamos,3.000 metros. A altura dele é 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 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

Pense em colocar uma manta de piquenique diretamente em uma encosta. Não importa o quão íngreme ou plana seja a colina, a manta sempre fica plana na superfície visível.

Como usar: a altitude do objeto é expressa como colocada 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. Ela é projetada diretamente na superfície do terreno (DTM).

Quando usar: para elementos que precisam sempre estar em conformidade 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 100 metros acima de qualquer elevação natural do solo (DTM) abaixo dele. Se o chão subir, o balão vai subir com ele, mantendo essa distância de 100 metros do "solo nu".

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 de qualquer coisa que esteja voando, seja o solo nu, um telhado de 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 à superfície mais alta do solo, do prédio e 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 de qualquer coisa que esteja fisicamente lá (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

Estes exemplos usam um local específico, Stonehenge, para ilustrar como diferentes opções de AltitudeMode afetam o posicionamento de elementos. Esses exemplos abordam primeiro o posicionamento de marcadores e, em seguida, linhas e áreas, que têm algumas considerações diferentes.

Posicionar marcadores

Considere um marcador de pino posicionado da seguinte maneira:

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

Você pode conferir isso como o pino 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, confira a imagem abaixo, que mostra pinos de várias cores posicionados usando os diferentes modos de altitude.

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

Vamos conferir como o AltitudeMode afeta o posicionamento do marcador em ordem crescente de elevação.

CLAMP_TO_GROUND (pino roxo)

Esse pino ignora o valor de altitude e se anexa à elevação do solo mais próxima. Ele aparece logo abaixo do pino branco, "fixando" o terreno.

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

ABSOLUTE (pino branco)

Esse pino usa o valor de altitude exato (102,23 m) para posicionar 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 real para posicionar o pino 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 pino usa o solo (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 para o nível do DTM real no solo e, em seguida, posiciona o pino a 102,23 m acima dele.

RELATIVE_TO_MESH (pino azul)

Esse pino usa a superfície visível (DSM) como base e se posiciona 102,23 m acima dessa superfície. Esse modo inclui a altura da pedra na medição, alinhando-a um pouco mais alta do que o pino laranja.

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

Posicionar linhas e áreas

Para linhas e áreas, tanto a altitude dos pontos dentro do elemento (especificada ou não) quanto o AltitudeMode usado são essenciais. Vamos examinar 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 }
];

Você pode conferir essa linha representada na imagem abaixo em branco, usando o 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 mais baixo ao mais alto.

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 solo subjacente (DTM). Ela segue o terreno, ignorando a presença de elementos como edifícios ou pedras acima dela.

Tecnicamente, esse modo ignora os valores de altitude reais e cobre a linha sobre o DTM, seguindo o terreno subjacente e ignorando a malha de elementos acima dela.

ABSOLUTE (linha branca)

Essa linha usa a altitude exata para cada ponto, fazendo com que a linha passe por algumas das pedras. Ela é conectada por linhas retas entre cada ponto, o que às vezes pode fazer com que ela 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 terreno natural (DTM) como base e posiciona cada ponto na altitude especificada acima do nível do solo.

Tecnicamente, esse modo usa o DTM como base e posiciona os locais de 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, ela posiciona cada ponto na altitude especificada acima dessa malha, replicando efetivamente a forma da linha em relação à paisagem visível.

Tecnicamente, esse modo usa a malha (DSM) como base e posiciona os locais na altitude especificada acima dela. Dependendo da malha, a linha pode ser alterada de acordo com os diferentes elementos 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 ser mescladas em uma única linha (laranja, já que geralmente é desenhada por último) porque todas são definidas como padrão para um posicionamento semelhante no nível do solo. 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 novamente a malha (DSM) como base. Como nenhuma altitude é especificada, ela apenas sobrepõe os pontos diretamente na malha. É importante observar que ela não posiciona 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 elementos. Esse problema é abordado na próxima seção.

A interação de malhas e linhas. Agora podemos conferir outra polilinha. Essa imagem está na mesma área, mas com mais cobertura de solo (ou mais detalhes no DSM acima do 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.

A cor roxa é CLAMP_TO_GROUND, que você pode conferir ao longo do chão. A cor branca é ABSOLUTE, que você pode conferir que linhas retas conectam os pontos que são posicionados absolutamente no espaço. Com as versões laranja e azul sendo relativas sobre a SUPERFÍCIE (DTM) ou a MALHA (DSM), observe que a linha azul é ligeiramente diferente na forma devido à altura dos elementos abaixo.

Mais uma vez, 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. Portanto, defina drawsOccludedSegments como true para garantir que a linha fique visível pelas árvores, conforme mostrado com 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 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, podemos conferir 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 conferir alguns outros artefatos que precisamos conhecer ao usar modos de altitude específicos.

Aqui temos uma área relativamente plana que está principalmente no nível do DTM, com detalhes extras limitados acima dela na malha. Esse cenário também seria o caso em uma área que não tinha cobertura 3D acima do modelo de terreno. Vamos conferir o local a seguir, 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 },
];

E pode ser visto na imagem, com as linhas tendo a mesma representação de cor de antes: (branco : ABSOLUTE, azul : RELATIVE_TO_MESH, roxo : CLAMP_TO_GROUND, 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 conferir vários artefatos. O primeiro deles é que, devido à falta de cobertura de superfície, as linhas laranja (RELATIVE_TO_GROUND) e azul (RELATIVE_TO_MESH) estão (principalmente) no mesmo local (com a linha azul sendo mostrada como é desenhada por último).

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

Você pode conferir isso especificamente nesta imagem quando a linha roxa foi ocultada.

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 pela malha), já que a linha entre os pontos apenas segue um caminho reto. É possível melhorar a exibição visual de uma linha adicionando mais pontos entre as linhas usando um método de interpolação. A forma como isso pode afetar o visual vai depender novamente do método usado:

  • Para medições relativas (RELATIVE_TO_GROUND ou RELATIVE_TO_MESH): ao usar valores de altitude relativos, a criação de mais pontos ao longo de uma linha ou polígono permite que o elemento seja posicionado em um nível mais adequado, em conformidade com o perfil de elevação. Se esses pontos intermediários não estiverem presentes nos seus dados, você poderá usar 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 posicionados acima do perfil de elevação relevante. Em seguida, o comprimento de qualquer linha que une os pontos será limitado e a representação visual será melhorada.
  • Para elementos absolutos (ABSOLUTE): para elementos ABSOLUTE, mais pontos precisam ter valores de altitude reais. A interpolação entre valores absolutos existentes não vai fornecer 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 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 elementos, como marcadores, linhas e polígonos.

Entender como esses modos funcionam com o modelo digital de terreno (DTM) e o modelo de superfície digital (DSM) é essencial para criar representações de mapas 3D precisas e visualmente atraentes com o mínimo de artefatos visuais.

Esperamos que você experimente esses modos de altitude nos seus próprios projetos para liberar todo o potencial do mapeamento 3D e criar experiências envolventes e imersivas para seus usuários e fornecer feedback.

Colaboradores

Matt Toon | Engenheiro de soluções, Geo Developer