1 votos

Trabajar con datos de posición de 3DTiles

Actualmente estoy implementando 3DTiles en mi aplicación java. Sé que sólo voy a trabajar con la región BoundingVolume. El BoundingVolume tiene 6 valores: oeste, sur, este, norte, minHeight y maxHeight. Min y maxHeight están en metros sobre el elipsoide WGS 84 y los otros valores se dan en el datum WGS 84 definido en la EPSG 4979 y están en radianes. Hasta aquí todo bien.

Ahora mi problema es el siguiente paso. Personalmente estoy trabajando con nubes de puntos, así que leo un archivo .pnts y obtengo los datos de posición de cada punto que está en la nube de puntos. Obtengo los valores x,y y z. Creo que los valores de z están en metros de nuevo, pero no sé cómo utilizar los valores de x e y. Si intento convertirlos de radianes a grados los valores no son correctos. También obtengo los valores de un RTC_Center que tiene 3 valores. Supongo que son x,y y z pero tampoco se como trabajar con estos. Quiero mostrarlos en un globo terráqueo y los necesito como Latitud y Longitud(al menos eso creo).

Así que mi pregunta es: ¿cómo puedo trabajar con los valores de posición obtenidos si los necesito como Latitud y Longitud? Tengo la sensación de que el RTC_CENTER es importante, pero no sé para qué.

Voy a dejar algunos enlaces a las especificaciones de 3DTiles que creo que ayudarán.

Sistema de referencia de coordenadas

Posiciones de los puntos de PointCloud

1voto

Kathleen Puntos 6

Así que encontré una respuesta a mi problema y pensé en publicarla aquí por si alguna vez alguien tiene la misma pregunta :).

private static void CartesianToGeodetic(double x, double y, double z){
   /*
   Taken from https://www.movable-type.co.uk/scripts/geodesy/docs/latlon-ellipsoidal.js.html
   by Chris Veness 2005-2019
   */
   //Values for the WGS84 Ellipsoid. a = equatorial radius in meters, b= semi-minor axis, f = flattening
   double a = 6378137;
   double b = 6356752.314245;
   double f = 1/298.257223563;

       double e2 = 2*f - f*f;           // 1st eccentricity squared  (a²b²)/a²

       double 2 = e2 / (1-e2);         // 2nd eccentricity squared  (a²b²)/b²

       double p = Math.sqrt(x*x + y*y); // distance from minor axis

       double R = Math.sqrt(p*p + z*z); // polar radius

   // parametric latitude (Bowring eqn.17, replacing tanß = z·a / p·b)

      double tanß = (b*z)/(a*p) * (1+2*b/R);

       double sinß = tanß / Math.sqrt(1+tanß*tanß);

       double cosß = sinß / tanß;

   // geodetic latitude (Bowring eqn.18: tanphi = z+²bsin³ß / pe²cos³ß)

       double phi = Double.isNaN(cosß) ? 0 : Math.atan2(z + 2*b*sinß*sinß*sinß, p - e2*a*cosß*cosß*cosß);

   // longitude

       double lambda = Math.atan2(y, x);

   // height above ellipsoid (Bowring eqn.7)

       double sinphi = Math.sin(phi), cosphi = Math.cos(phi);

       double ny = a / Math.sqrt(1-e2*sinphi*sinphi); // length of the normal terminated by the minor axis

       double h = p*cosphi + z*sinphi - (a*a/ny);

   //for now just prints the result to the console but you could just return the result ;)
   System.out.println(phi+" "+lambda+" "+h);

}

Como ya está escrito en los comentarios del código encontré esta solución aquí . Quizás esto ayude a alguien algún día :D

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X