Función para Obtener Coordenadas con Elevación Máxima en Cesium

Función para Obtener Coordenadas con Elevación Máxima

Esta función de utilidad para mapas Cesium, denominada obtenerPosicion, tiene como objetivo obtener la latitud, longitud y la elevación máxima (combinando la elevación del terreno/modelo con la altitud original) correspondiente a una coordenada tridimensional Cartesian3. A continuación se presenta un análisis detallado:

Propósito de la Función

Basada en las coordenadas tridimensionales de entrada (Cartesian3), la función calcula la latitud y longitud de ese punto, y toma el valor máximo entre la elevación real del terreno/modelo y la altitud original, devolviendo finalmente un resultado que contiene las coordenadas geográficas y la elevación máxima.

Análisis Detallado

1. Definición de la Función

export function obtenerPosicion(this: Cesium.Viewer, coord3d: Cesium.Cartesian3): { longitud: number, latitud: number, altitud: number, altura: number }

  • this: Cesium.Viewer: Especifica que el contexto this de la función es una instancia del visor de Cesium (objeto de vista del mapa).
  • coord3d: Cesium.Cartesian3: Parámetro de entrada, coordenada tridimensional en el espacio (tipo común en Cesium para representar posiciones).
  • Valor de retorno: Un objeto que contiene las coordenadas geográficas (longitud/latitud), la elevación máxima (altitud) y un campo reservado (altura).
2. Conversión de Coordenadas Tridimensionales a Geográficas (radianes)

const cartografica = this.scene.globe.elipsoide.cartesianToCartografica(coord3d)

  • cartesianToCartografica: Convierte la coordenada tridimensional Cartesian3 a una coordenada Cartographic (que contieen longitud, latitud y altitud, en unidades de radianes y metros).
  • this.scene.globe.elipsoide: Objeto elipsoide terrestre (utilizado como referencia para conversiones de coordenadas).
3. Conversión de Radianes a Grados (Coordenadas Geográficas)

const longitud = Cesium.Math.toDegrees(cartografica.longitud)
const latitud = Cesium.Math.toDegrees(cartografica.latitud)

  • Cesium.Math.toDegrees: Convierte radianes a grados (las coordenadas geográficas suelen expresarse en grados).
  • longitud/latitud: Coordenadas geográficas finales en grados.
4. Cálculo de Posiciones Mundial y en Pantalla

const posicionMundial = Cesium.Cartesian3.fromDegrees(longitud, latitud, cartografica.altura);
const posicionPantalla = Cesium.SceneTransforms.wgs84ToWindowCoordinates(this.scene, posicionMundial);

  • fromDegrees: Convierte las coordenadas geográficas y altitud de vuelta a coordenadas mundiales (Cartesian3), asegurando que las coordenadas se basen en la altitud original.
  • wgs84ToWindowCoordinates: Convierte coordenadas mundiales a coordenadas de pantalla (posición en píxeles), utilizado para la posterior detección de superficies de modelos/terreno.
5. Manejo de Casos con Coordenadas de Pantalla Inválidas

if (!posicionPantalla) {
  return { longitud, latitud, altitud: cartografica.altura, altura: 0 }
}

  • Si la obtención de coordenadas de pantalla falla (por ejemplo, el punto está fuera del campo de visión), se devuelve la altitud original como elevación.
6. Detección de la Elevación Real de Superficies de Modelos/Terreno

const posicionSuperficieModelo = this.scene.pickPosition(posicionPantalla);

  • pickPosition: Detecta las coordenadas tridimensionales en la superficie del modelo o terreno según las coordenadas de pantalla (considerando la altura real del modelo o las variaciones del terreno).
7. Cálculo de la Elevación Máxima y Devolución del Resultado

if (posicionSuperficieModelo) {
  const modeloPosicion = Cesium.Cartographic.fromCartesian(posicionSuperficieModelo);
  const altura = modeloPosicion.altura; // Elevación real de la superficie del modelo/terreno
  return { longitud, latitud, altitud: Math.max(cartografica.altura, altura), altura: 0 }
} else {
  return { longitud, latitud, altitud: cartografica.altura, altura: 0 }
}

  • Si se detecta una coordenada de superficie de modelo/terreno, se convierte a coordenadas geográficas y se extrae la elevación (altura).
  • Math.max(cartografica.altura, altura): Toma el valor máximo entre la altitud original y la elevación del modelo/terreno como la elevación final (altitud).
  • Si no se detecta una coordenada de superficie, se devuelve la altitud original.

Resumen de la Lógica Central

El núcleo de esta función es combinar "la altitud de coordenada original" y "la elevación real del modelo/terreno", asegurando que la elevación obtenida sea el valor más alto en ese punto (por ejemplo: cuando un punto está sobre un edificio, se toma la altura superior del edificio en lugar de la altitud del suelo).

Escenarios de aplicación: Interacciones que requieren obtener con precisión la elevación de la superficie del terreno o modelos (como la selección por clic, etiquetado de coordenadas, etc.).

Consideraciones Importantes

  • pickPosition depende de los datos de modelos o terreno en la escena. Si no hay modelos y no se ha cargado el terreno, puede devolver undefined, en cuyo caso se utilizará por defecto la altitud original.
  • El campo altura en el valor de retorno está actualmente fijado en 0, posiblemente reservado para futuras extensiones (como almacenar altura relativa, etc.).

Código de la Función


export function obtenerPosicion(this: Cesium.Viewer, coord3d: Cesium.Cartesian3): { longitud: number, latitud: number, altitud: number, altura: number } {
  const cartografica = this.scene.globe.elipsoide.cartesianToCartografica(coord3d)
  const longitud = Cesium.Math.toDegrees(cartografica.longitud)
  const latitud = Cesium.Math.toDegrees(cartografica.latitud)

  const posicionMundial = Cesium.Cartesian3.fromDegrees(longitud, latitud, cartografica.altura);
  const posicionPantalla = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
    this.scene,
    posicionMundial
  );
  
  if (!posicionPantalla) {
    return { longitud, latitud, altitud: cartografica.altura, altura: 0 }
  }
  
  const posicionSuperficieModelo = this.scene.pickPosition(posicionPantalla);
  
  if (posicionSuperficieModelo) {
    const modeloPosicion = Cesium.Cartographic.fromCartesian(posicionSuperficieModelo);
    const altura = modeloPosicion.altura;
    return { longitud, latitud, altitud: Math.max(cartografica.altura, altura), altura: 0 }
  } else {
    return { longitud, latitud, altitud: cartografica.altura, altura: 0 }
  }
}

Esta función permite obtener el punto más alto de todos los objetos en el mapa, incluyendo modelos 3D con datos de elevación como 3D tiles.

Etiquetas: Cesium geoespacial cartografia-3D modelado-terreno transformacion-coordenadas

Publicado el 6-15 22:47