La manera computacional más eficiente para convertir coordenadas cartesianas a geodésicas

8

Hasta donde entiendo la literatura, hay varias maneras de convertir un conjunto de coordenadas cartesianas geocéntricas en coordenadas geodésicas

¿Cuál sería la forma más eficiente de convertir las coordenadas cartesianas en coordenadas geodésicas, la más eficiente significa más rápido (y más directo) cuando se implementa en una computadora?

oschrenk
fuente
1
¿Necesita realizar conversiones para alturas geodésicas arbitrarias o solo en la superficie nominal del suelo (alturas cero)?
whuber
1
La superficie del suelo funcionará por ahora, pero también estoy interesado en alturas geodésicas arbitrarias a largo plazo.
oschrenk

Respuestas:

4

Depende de sus requisitos de precisión. Una iteración de Heiskanen es eficiente, pero se necesitan 3 iteraciones para que coincida con la precisión de una sola iteración del método de Bowring de 1985. Incluso el algoritmo de Lin y Wang no puede igualar la eficiencia de Bowring, si se utilizan las optimizaciones trigonométricas incluidas a continuación. Por lo tanto, para el rendimiento general, recomendaría el algoritmo de Bowring de 1985.

   -- Based on B. R. Bowring's 1985 algorithm (single iteration)
   -----------------------------------------------------------------------------
   function ECEF_to_Geo(ECEF  : Vector3;
                        Datum : Datum_Id_Type) return Geographic_Type is
      Spheroid : Spheroid_Type := EARTH.DATUMS.Spheroid(Datum);
      x    : Meters   renames ECEF(1);
      y    : Meters   renames ECEF(2);
      z    : Meters   renames ECEF(3);
      a    : Meters   renames Models(Spheroid).Semi_Major_Axis;
      b    : Meters   renames Models(Spheroid).Semi_Minor_Axis;
      e2   : Unitless renames Models(Spheroid).Eccentricity_Squared;
      eb2  : Unitless renames Models(Spheroid).Second_Eccen_Squared;
      a2   : Scalar := a**2;
      d    : Meters := eb2*b;
      Ome2 : Unitless := 1.0 - e2;
      p2, p, r, tu, tu2, su3, cu3, Phi, Lam, tp, cp, sp, h : Scalar;
      Lat : Radians;
      Lon : Radians;
      Alt : Meters;
      Geo : Geographic_Type;
   begin -- ECEF_to_Geo
      if ((x = 0.0) and (y = 0.0)) then
         r   := abs(z);
         Phi := Scalar'copy_sign(Half_Pi, z);
         Lam := 0.0;
         h   := r - b;
      elsif (z = 0.0) then
         Phi := 0.0;
         Lam := arctan(y, x);
         p   := sqrt(x**2 + y**2);
         h   := p - a;
      else
         p2  := x**2 + y**2;
         p   := sqrt(p2);
         r   := sqrt(p2 + z**2);
         tu  := b*z*(1.0 + d/r)/(a*p);
         tu2 := tu**2;
         cu3 := (1.0/sqrt(1.0 + tu2))**3;
         su3 := cu3*tu2*tu;
         tp  := (z + d*su3)/(p - e2*a*cu3);
         Phi := arctan(tp);
         Lam := arctan(y, x);
         cp  := 1.0/sqrt(1.0 + tp**2);
         sp  := cp*tp;
         h   := p*cp + z*sp - a*sqrt(1.0 - e2*sp**2);
      end if;
      Lat := Radians(Phi);
      Lon := Radians(Lam);
      Alt := h;
      Geo := Make_Geo(Lat, Lon, Alt, Datum);
      return Geo;
   end ECEF_to_Geo;
Charles P. Gilbertson
fuente