Cách tính toán hiệu quả nhất để chuyển đổi tọa độ Descartes sang tọa độ trắc địa


8

Theo như tôi hiểu các tài liệu, có một số cách để chuyển đổi một tập hợp tọa độ cartes địa lý sang tọa độ trắc địa

Điều gì sẽ là cách hiệu quả nhất để chuyển đổi tọa độ cartesian sang tọa độ trắc địa - có nghĩa là hiệu quả nhất nhanh nhất (và trực tiếp nhất) khi được thực hiện trên máy tính?


1
Bạn có cần thực hiện chuyển đổi cho độ cao trắc địa tùy ý hoặc chỉ ở bề mặt đất danh nghĩa (độ cao bằng không)?
whuber

1
Bề mặt đất sẽ làm ngay bây giờ, nhưng tôi cũng quan tâm đến độ cao trắc địa tùy ý trong thời gian dài.
oschrenk

Câu trả lời:


4

Phụ thuộc vào yêu cầu chính xác của bạn. Một lần lặp của Heiskanen là hiệu quả, nhưng phải mất 3 lần lặp để phù hợp với độ chính xác của một lần lặp của phương pháp 1985 của Bowring. Ngay cả thuật toán của Lin và Wang cũng không thể phù hợp với hiệu quả của Bowring, nếu tối ưu hóa lượng giác bao gồm bên dưới được sử dụng. Do đó, đối với tất cả xung quanh hiệu suất, tôi muốn giới thiệu thuật toán 1985 của Bowring.

   -- 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.