Cuando especificas la altitud de los elementos en un mapa en 3D (como líneas, polígonos, modelos o marcadores), hay varios factores que pueden afectar su ubicación, tanto dentro de la escena como en la forma en que la renderización de la escena interactúa con ese elemento. En este documento, se explica el uso de "AltitudeMode" en un mapa en 3D y cómo administrar la altitud de los elementos.
A continuación, te mostramos cómo puedes usar AltitudeMode
con varios tipos de funciones:
Marcadores: Marker3DElement, Marker3DInteractiveElement
Especifica una altitud en la ubicación y también una extrusión.
Modelos: Model3DElement, Model3DInteractiveElement
Especifica una altitud en el punto de anclaje del modelo, que se debe usar con su orientación para lograr un posicionamiento adecuado en la escena.
Polilíneas: Polyline3DElement, Polyline3DInteractiveElement
Especifica cómo se aplica la altitud a los puntos de posición a lo largo de una polilínea.
Polígonos: Polygon3DElement, Polygon3DInteractiveElement
Especifica cómo se aplica la altitud a los puntos de posición a lo largo de un polígono.
Cómo se usa la altitud en los entornos 3D
Cuando se colocan puntos dentro de una escena 3D, su posición final se ve influenciada por la presencia de edificios o objetos 3D capturados, como árboles. Es fundamental comprender dos conceptos clave:
- Modelo digital del terreno (DTM): Representa la elevación del "terreno desnudo". Piensa en ella como la forma natural del terreno sin edificios, árboles ni otras estructuras. Todas las áreas se basan en el DTM, que constituye la base de la elevación del globo (calculada con EGM96).
- Modelo digital de superficie (DSM): Representa la elevación de la "superficie superior", incluidos los edificios, los árboles y otras estructuras. En las áreas donde se capturaron elementos (en particular, en entornos urbanos donde los edificios dominan la vista), la superficie visible aparecerá más alta que el terreno base.
La distinción entre el DTM y el DSM es fundamental para comprender cómo los diferentes modos de altitud interactúan con estos Modelos Digitales de Elevación (MDE), ya que la ubicación de las entidades puede verse oscurecida o influenciada por el modelo de superficie. Puedes ver las diferencias en el siguiente diagrama:
Cuando las funciones no tienen datos de altitud
Si tienes datos que no incluyen una medición de altitud o si usas datos de otro servicio de Google, como los servicios de Places o Routes, a menudo no se proporcionará ninguna altitud en la geometría devuelta. En esos casos, colocar la función en la escena requiere que elijas un AltitudeMode
con cuidado:
- Fíjalo al suelo: Es el enfoque más simple, en el que la función se ajustará automáticamente al terreno. En este modo, se usa el modelo de DTM.
- Asignarle una altitud arbitraria y un modo relativo: Puedes asignar una altitud elegida y, luego, usar RELATIVE_TO_GROUND (que coloca las entidades en relación con el modelo de MDT) o RELATIVE_TO_MESH (que las coloca por encima del modelo de MDV).
- Usa otro servicio para obtener la altitud: Para obtener la altitud precisa del MTD en la ubicación de la entidad, puedes usar un servicio como la API de Elevation de Google Maps Platform. Si se trata de una línea o un polígono, deberás hacerlo para cada uno de los puntos que los componen.
¿Qué significan las opciones de AltitudeMode
y cuándo usarlas?
Existen cuatro opciones de AltitudeMode
que puedes especificar cuando defines una función:
ABSOLUTE
Imagina un avión que vuela a una altitud específica sobre el nivel del mar, por ejemplo, 3,000 metros. Su altura es fija, sin importar si vuela sobre una montaña o un valle.
Cómo usarlo: La altitud del objeto se expresa en relación con el nivel medio del mar promedio (calculado con EGM96). La coordenada de altitud de la entidad se interpreta como una elevación precisa sobre el nivel medio del mar.
Cuándo usarlo: Para elementos con altitudes conocidas y precisas, como rutas de vuelo, objetos sumergidos con profundidad exacta o instrumentos científicos de punto fijo.
CLAMP_TO_GROUND
Piensa en colocar una manta de pícnic directamente en la ladera de una colina. Sin importar qué tan empinada o plana sea la colina, la manta siempre quedará plana sobre la superficie visible.
Cómo usarlo: La altitud del objeto se expresa como si estuviera colocado directamente en el suelo. Permanecerán a nivel del suelo, siguiendo el terreno, independientemente del valor de altitud proporcionado. Se ignora la coordenada de altitud de la función y se proyecta directamente sobre la superficie del terreno (DTM).
Cuándo usarlo: Para elementos que siempre deben ajustarse al terreno, como rutas, cercas, senderos, límites de propiedades o la base de edificios
RELATIVE_TO_GROUND
Imagina un globo aerostático que permanece a 100 metros por encima de cualquier elevación natural del terreno (DTM) que haya debajo. Si el terreno sube, el globo también sube, y se mantiene esa brecha de 100 metros con la "tierra desnuda".
Cómo usarlo: La altitud del objeto se expresa en relación con la superficie del terreno (MDT). La coordenada de altitud de la entidad se interpreta como una compensación de la elevación del terreno en su posición horizontal.
Cuándo usarlo: Para objetos que deben mantener una altura constante por encima del terreno natural, como torres de comunicación o líneas aéreas en áreas rurales.
RELATIVE_TO_MESH
Esto es como un dron que vuela a una altura fija por encima de lo que sea que esté sobrevolando, ya sea el suelo, el techo de un edificio o la copa de un árbol. Se ajusta a la superficie visible más alta (DSM).
Cómo usarlo: La altitud del objeto se expresa en relación con la superficie de tierra, edificios y agua más alta (DSM). La coordenada de altitud de la característica se interpreta como una compensación de la elevación del DSM.
Cuándo usarlo: Para objetos que deben flotar a una cierta altura por encima de lo que haya físicamente (DTM, edificios, agua), útil para marcadores en techos o elementos que se ajustan de forma dinámica a la escena visible.
Para obtener más detalles, consulta la documentación de las constantes de AltitudeMode.
Ejemplos visuales y aplicaciones prácticas
En estos ejemplos, se usa una ubicación específica, Stonehenge, para ilustrar cómo las diferentes opciones de AltitudeMode
afectan la ubicación de los componentes. En primer lugar, estos ejemplos abarcan los marcadores de posición y, luego, las líneas y las áreas, que tienen algunas consideraciones diferentes.
Marcadores de posición
Considera un marcador de fijación colocado de la siguiente manera:
const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };
Puedes ver esto como el pin blanco en la siguiente escena:
Ahora, observa la siguiente imagen, que muestra pines de varios colores colocados con los diferentes modos de altitud.
Veamos cómo los diferentes valores de AltitudeMode
afectan la posición del marcador en orden ascendente de elevación.
CLAMP_TO_GROUND (chincheta morada)
Este marcador ignora el valor de altitud y se une a la elevación del suelo más cercana. Puedes verlo justo debajo del marcador blanco, como si estuviera "sujetado" al terreno.
Técnicamente, este modo ignora la altitud real y fija el marcador a la altura del MTD más cercano.
ABSOLUTE (pin blanco)
Este pin usa el valor de altitud exacto (102.23 m) para colocar el marcador a esa altura sobre el nivel del mar (EGM96), que aparece sobre una de las piedras de Stonehenge según la altitud proporcionada.
Técnicamente, este modo usa el valor de altitud real proporcionado para colocar el marcador a la altura especificada sobre el nivel del mar, que, en este ejemplo, es la ubicación de Stonehenge, pero en la parte superior de una de las piedras.
RELATIVE_TO_GROUND (chinche naranja)
Este pin toma el suelo (DTM) como base y se coloca 102.23 m por encima de ese nivel del suelo, por lo que parece flotar sobre el suelo natural que se encuentra debajo de la piedra en el henge.
Técnicamente, este modo establece su base en el nivel del DTM real en el suelo y, luego, coloca el pin a 102.23 m por encima.
RELATIVE_TO_MESH (pin azul)
Este pin usa la superficie visible (DSM) como base y se coloca a 102.23 m por encima de esa superficie. Este modo incluye la altura de la piedra en su medición, por lo que la alinea ligeramente más arriba que el pin naranja.
Técnicamente, este modo usa la malla (DSM) como base y coloca la ubicación a la altitud indicada sobre ella. Dado que el DSM se encuentra en la parte superior de la piedra de referencia, este pin incluye esta altura adicional en su medición cuando determina su altura relativa, lo que lo alinea ligeramente más alto que el pin RELATIVE_TO_GROUND.
Cómo posicionar líneas y áreas
En el caso de las líneas y las áreas, son fundamentales tanto la altitud de los puntos dentro de la entidad (ya sea que se especifique o no) como el AltitudeMode
que se usa. Examinemos una línea a lo largo de Stonehenge con las siguientes 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 }
];
Puedes ver esta línea representada en la siguiente imagen en blanco, con posicionamiento absoluto.
Una vez más, la siguiente imagen muestra las líneas con diferentes modos de altitud. Analicemos cada una, de la más baja a la más alta.
CLAMP_TO_GROUND (línea morada)
Esta línea ignora la altitud especificada para cada punto y, en cambio, "cubre" la línea directamente sobre el terreno subyacente (DTM). Sigue el terreno y no tiene en cuenta la presencia de ninguna característica, como edificios o piedras, por encima de él.
Técnicamente, este modo ignora los valores de altitud reales y superpone la línea sobre el MDT, siguiendo el terreno subyacente y sin tener en cuenta la malla de entidades sobre él.
ABSOLUTE (línea blanca)
Esta línea usa la altitud exacta para cada punto, lo que hace que la línea pase por encima de algunas de las piedras. Se conecta con líneas rectas entre cada punto, lo que a veces puede hacer que parezca que atraviesa objetos si los puntos no son lo suficientemente frecuentes.
Técnicamente, este modo sigue la altitud especificada para cada punto y los conecta con líneas rectas, lo que significa que puede atravesar la malla (por ejemplo, piedras) si los valores de altitud lo indican. Esta situación se abordará en una sección posterior.
RELATIVE_TO_GROUND (línea naranja)
Esta línea usa el terreno natural (DTM) como base y coloca cada punto a la altitud especificada por encima de ese nivel del suelo.
Técnicamente, este modo usa el DTM como base y coloca las ubicaciones de las líneas a la altitud indicada en relación con él.
RELATIVE_TO_MESH (línea azul)
Esta línea usa la superficie visible, que incluye edificios y piedras, como base. Luego, coloca cada punto a la altitud especificada sobre esa malla, lo que replica de manera efectiva la forma de la línea en relación con el paisaje visible.
Técnicamente, este modo usa la malla (DSM) como base y coloca las ubicaciones a la altitud especificada por encima de ella. Según la malla, la línea podría alterarse debido a las diferentes características del terreno.
Cuando no se especifica la altitud para las líneas
Ahora, consideremos las mismas coordenadas de línea, pero sin especificar ninguna altitud:
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 }
];
En este caso, en el que no se proporciona la altitud, las líneas suelen aparecer en ubicaciones similares. Las líneas blanca, naranja y morada podrían combinarse en una sola línea (naranja, ya que suele dibujarse al final) porque todas tienen una posición predeterminada similar a nivel del suelo. Puedes ver esto a continuación:
La línea azul (RELATIVE_TO_MESH) vuelve a usar la malla (DSM) como base. Como no se especifica ninguna altitud, los puntos se superponen directamente sobre la malla. Es importante tener en cuenta que no coloca la línea sobre la malla, sino que conecta los puntos especificados en la malla con conexiones rectas. Si bien esto puede parecer aceptable en algunos ejemplos, puede causar problemas de visibilidad cuando se cubre con otras funciones. Este problema se aborda en la siguiente sección.
La interacción de las mallas y las líneas. Ahora podemos ver otra polilínea. Esta imagen se encuentra en la misma área, pero con más cobertura del terreno (o más detalles en el DSM sobre el 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 },
];
Cuando vemos la representación con los mismos métodos (y colores) que antes, obtenemos esta vista:
El color morado es CLAMP_TO_GROUND, que puedes ver a lo largo del suelo. El blanco es ABSOLUTO, lo que puedes ver en las líneas rectas que conectan los puntos que se posicionan de forma absoluta en el espacio. Dado que el naranja y el azul son versiones relativas sobre la SUPERFICIE (DTM) o la MALLA (DSM), ten en cuenta que la línea azul tiene una forma ligeramente diferente debido a la altura de los elementos que se encuentran debajo.
Nuevamente, podemos observar que la naturaleza de la creación de líneas implica que la línea atraviesa la malla, ya que los puntos se conectan con líneas rectas. Esta situación podría causar problemas para ver las líneas, por lo que puedes establecer drawsOccludedSegments en true para asegurarte de que la línea sea visible a través de los árboles, como se muestra con más detalle en la siguiente imagen, en la que aún se pueden ver las líneas que atraviesan la malla.
La naturaleza del posicionamiento en el espacio implica que los puntos pueden caer dentro de la malla y que las líneas que conectan los puntos también pueden caer dentro de la malla, lo que podría causar artefactos visuales. En la siguiente sección, veremos cómo se pueden mejorar estos artefactos cuando sea posible.
Cómo solucionar problemas en la interacción entre las líneas y el terreno
En otro ejemplo, en la misma área, podemos ver otros artefactos que debemos tener en cuenta cuando usamos modos de altitud específicos.
Aquí tenemos un área relativamente plana que se encuentra principalmente al nivel del MTD, con pocos detalles adicionales por encima en la malla. Este caso también se daría en un área que no tuviera cobertura 3D sobre el modelo de terreno. Analicemos la siguiente ubicación, como se especifica a continuación:
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 se puede ver en la imagen, las líneas tienen la misma representación de color que antes (blanco: ABSOLUTE, azul: RELATIVE_TO_MESH, morado: CLAMP_TO_GROUND, naranja: RELATIVE_TO_GROUND).
Aquí podemos ver varios artefactos. El primero es que, debido a la falta de cobertura de la superficie, las líneas naranja (RELATIVE_TO_GROUND) y azul (RELATIVE_TO_MESH) se encuentran (en su mayoría) en la misma ubicación (y la línea azul se muestra porque se dibuja al final).
También podemos ver que la línea morada (CLAMP_TO_GROUND) sigue el suelo y se puede ver en la colina, mientras que la línea blanca (ABSOLUTE) parece desaparecer en la colina, ya que solo se conectan los puntos y las líneas rectas atraviesan el suelo.
Puedes ver esto específicamente en esta imagen cuando se ocultó la línea púrpura.
Por lo tanto, esto puede generar algunos artefactos visuales extraños, en los que se puede ver que la línea desaparece bajo el suelo (o incluso a través de la malla), ya que la línea entre los puntos solo sigue una ruta recta. Puedes mejorar la visualización de una línea de este tipo agregando más puntos entre las líneas con un método de interpolación. La forma en que esto puede afectar la visualización dependerá, una vez más, del método que se utilice:
- Para las mediciones relativas (RELATIVE_TO_GROUND o RELATIVE_TO_MESH): Cuando se usan valores de altitud relativos, crear más puntos a lo largo de una línea o un polígono permitirá que la función se coloque en un nivel más adecuado, lo que se ajustará mejor al perfil de elevación. Si estos puntos intermedios no están presentes en tus datos, puedes usar una función de interpolación, como la función Interpolate en la biblioteca de Geometry de Google Maps Platform, para agregarlos. Luego, a estos nuevos puntos se les pueden asignar valores relativos que se colocarán sobre el perfil de elevación pertinente. De esta manera, se limitará la longitud de cualquier línea que una los puntos y se mejorará la representación visual.
- Para los atributos absolutos (ABSOLUTE): Para los atributos ABSOLUTE, se necesitarán más puntos con valores de altitud reales. La interpolación entre valores absolutos existentes no proporcionará un punto que refleje con precisión ningún valor por encima de la malla, ya que solo sería un promedio entre el punto A y el punto B.
Resumen
Esperamos que este documento te haya proporcionado una descripción general completa de las opciones de AltitudeMode
en los mapas fotorrealistas en 3D, en la que se detalla cómo ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND y RELATIVE_TO_MESH afectan la colocación y la renderización de varias funciones, como marcadores, líneas y polígonos.
Comprender cómo funcionan estos modos junto con el Modelo Digital del Terreno (MDT) y el Modelo Digital de Superficie (MDS) subyacentes es fundamental para crear representaciones de mapas en 3D precisas y visualmente atractivas con la menor cantidad de artefactos visuales.
Esperamos que experimentes con estos modos de altitud en tus propios proyectos para aprovechar todo el potencial de los mapas en 3D y crear experiencias atractivas y envolventes para tus usuarios, y que nos brindes tus comentarios.
Colaboradores
Matt Toon | Ingeniero de Soluciones, Geo Developer