python WGS84和ECEF坐標的轉換


 

  1. 地心地固坐標系(Earth-Centered, Earth-Fixed,ECEF),簡稱地心坐標系。
  2. 地理坐標系統(Geographic Coordinate System,GCS)1,坐標系是地心坐標系,用經緯度表示球面上的點。
  3. 世界大地測量系統(World Geodetic System, WGS),比如WGS84,是一種地理坐標系統,用於全球定位系統(GPS)。
  4. 投影坐標系統(Projection Coordinate System,PCS)2,,在二維平面上用米表示位置。
  5. 通用橫軸墨卡托投影(Universal Transverse Mercator,UTM),是一種投影方法。
 pip install Pypro

     Cesium中常用的坐標系主要有兩種:WGS84坐標系和笛卡爾空間直角坐標系。平時我們常見的某個點的經緯度就是在WGS84坐標系下某個點的坐標,它的坐標原點在橢球的質心;而笛卡爾坐標系主要是用來做空間位置的變化如平移、旋轉和縮放等等,它的坐標原點在橢球的中心。

 

庫安裝

、 pip install pyproj

  

 

 

轉換公式

https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

 

 
         

#坐標系轉換
import pyproj


def ecef2lla(x,y,z): ''' x = 652954.1006 y = 4774619.7919 z = -4167647.7937 ''' #ecef轉化為經緯高 ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84') lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84') lon, lat, alt = pyproj.transform(ecef, lla, x, y, z, radians=False)#radians否用弧度返回值 print ('緯度:',lat) print ('經度:',lon) print ('高度:',alt) return lat,lon,alt

  

 

 

https://www.cnblogs.com/langzou/p/11388520.html

 

GNSS計算主要涉及三個坐標系,地心地固坐標系地理坐標系站心坐標系。這里主要介紹一下三個坐標的含義和轉換公式。

  • 地心地固坐標系如圖X,Y,Z表示 (ECEF坐標系),以地心O為坐標原點,Z軸指向協議地球北極,X軸指向參考子午面與地球赤道的交點,也叫地球坐標系。一般GNSS坐標計算都在地心地固坐標系下進行的。由於地球是橢圓形,有WGS-84和CGC2000等多種標准

  • 地理坐標系則通過經度(longitude),緯度(latitude)和高度(altitude)來表示地球的位置,也叫經緯高坐標系(LLA坐標系)。

  • 站心坐標系以用戶所在位置P為坐標原點,三個軸分別指向東向,北向和天向,也叫東北天坐標系(enu坐標系)。站心坐標系的天向方向和地理坐標系的高度方向是一致的。站心坐標系用在慣性導航和衛星俯仰角計算中較多。

 

 

網頁轉換代碼

view-source:http://www.ab126.com/Geography/4031.html

 

 

 

function do_llhxyz()
     {

          var  ecef = new Array(3);
          var  latitude,longitude,height;
          var  x,y,z;
          var  sans;

          var  dtr = Math.PI/180;

          CallCount = CallCount + 1;

          latitude =  document.io_form.Latitude.value;
          longitude=  document.io_form.Longitude.value;
          height   =  document.io_form.Height.value;


          latitude = Number(latitude);
          longitude= Number(longitude);
          height   = Number(height);

          hkm      = 0.001 * height
     
          good =  goodnum(latitude) && goodnum(longitude) && goodnum(hkm);
          
          if ( !good ) sans = sans+"\n無效的數字輸入 \n"

          if ( good )
          {

          sans = " \n";

          ecef  = llhxyz(latitude,longitude,hkm);
          x     = ecef[0];
          y     = ecef[1];
          z     = ecef[2];

          x     = fformat(x,3);
          y     = fformat(y,3);
          z     = fformat(z,3);

          sans = sans +"ECEF從緯度、經度、高度 (橢球)\n";
          sans = sans + "\n"
          sans = sans +"X : " + x + "   km\n";
          sans = sans +"Y : " + y + "   km\n";
          sans = sans +"Z : " + z + "   km\n";

          document.io_form.text_area.value = sans;

          return false;

          }

          document.io_form.text_area.value = sans;

          return false;

     }



     function do_xyzllh()
     {

          var  ecef = new Array(3);
          var  llh  = new Array(3)
          var  latitude,longitude,height;
          var  x,y,z;
          var  sans;

          var  dtr = Math.PI/180;

          CallCount = CallCount + 1;

          x =  document.io_form.X.value;
          y =  document.io_form.Y.value;
          z =  document.io_form.Z.value;


//              返回字符串變量
//             可能或不使用自動轉換的數學

          x =  Number(x);
          y =  Number(y);
          z =  Number(z);
     
          good =  goodnum(x) && goodnum(y) && goodnum(z);
          
          if ( !good ) sans = sans+"\n無效的數字輸入 \n"

          if ( good )
          {

          sans = " \n";

          ecef[0]  = x;
          ecef[1]  = y
          ecef[2]  = z;
          llh   = xyzllh(ecef);

          latitude = llh[0];
          longitude= llh[1];
          hkm      = llh[2];
          height   = 1000.0 * hkm;

          latitude = fformat(latitude,5);
          longitude= fformat(longitude,5);
          height   = fformat(height,1);
          

          sans = sans +"緯度、經度、高度 (橢球)從 ECEF\n";
          sans = sans + "\n"
          sans = sans +"緯度 : " + latitude  + "   度 N\n";
          sans = sans +"經度 : " + longitude + "   度 E\n";
          sans = sans +"高度 : " + height + "   m\n";

          }

          document.io_form.text_area.value = sans;

          return false;

     }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM