當前位置:編程學習大全網 - 源碼下載 - 計算校正法

計算校正法

(1)收集測區GPS控制點

壹般情況使用的基礎地形圖是北京54坐標系或西安80坐標系,這樣就應收集該區域已知點的北京54坐標或西安80坐標,可以從當地測繪部門收集到,壹般收集的坐標是北京54坐標系或西安80坐標系的平面坐標(X,Y,H),這裏的H通常是重力高程即海拔高度,所以需要進行換算獲取橢球高程(如果沒有換算參數也可以直接使用,壹般不會影響平面坐標)。首先將獲取的平面坐標系坐標(X,Y)反算求出相應大地坐標(B,L),這裏的X、Y是高斯投影坐標,計算使用高斯投影的反變換公式,這裏不再列舉,也可以使用軟件進行計算如MapGIS、ERDAS都具有這項功能,然後由大地坐標計算空間直角坐標系坐標。

通常情況下至少要收集三個控制點,且這三個控制點不應在壹條直線上。然後收集這些控制點的WGS84的大地坐標(B,L,H)或直接測量出這些控制點的WGS84的大地坐標(B,L,H),並換算成WGS84空間直角坐標系坐標(X,Y,Z),這樣就可以計算dX、dY、dZ。

(2)計算坐標轉換的其他三個參數

dX、dY、dZ三個參數就是根據前面求出的控制點的WGS84與北京54或西安80大地坐標相對應的空間直角坐標系的X、Y、Z坐標的差值,當測區具有多個控制點時,取相應平均值作為參數值dX、dY、dZ。

數字地質填圖技術實習教程

(3)計算坐標轉換參數的具體方法

由以上論述可以知道計算三個參數的理論方法,那麽如何進行實際的計算呢?由高斯投影平面坐標向大地坐標的轉換,GIS軟件或者遙感軟件都支持比如MapGIS、ERDAS,都可以完成相關的計算,所以這壹步可以采用現有的軟件完成。

由大地坐標向地心直角坐標的轉換,現有的GIS或者遙感軟件鮮有支持者,所以需要進行轉換。為了方便起見,將轉換的公式再次列於下面。

設橢球長半軸為a,扁率為f,H為相對橢球面的高度,那麽大地坐標(B,L)處地心直角坐標系的計算公式為

數字地質填圖技術實習教程

式中:N為緯度B處的卯酉圈曲率半徑,N=a/(1-e2sin2B)1/2;e為橢球第壹偏心率,e2=2f-f2。

大地坐標向地心直角坐標的轉換有兩種方法:

第壹種方法是使用Excel表格進行計算,將上述公式輸入Excel中,輸入數據就可以實現計算的自動化。

第二種方法是自己編寫計算程序進行計算,可以使用任何計算機語言進行編寫,下面列出了使用C++語言編寫的計算轉換參數程序的源代碼,需要指出的是,這壹程序可以有許多不同的編寫方法,這裏只是列出了其中壹種寫法以供參考,並且在這個程序中並沒有使用C++的標準庫,這主要是為了簡化程序,使用標準類庫會帶來更高的效率和穩定性,同時此程序沒有進行任何異常或者錯誤的處理,請讀者自己完成,以保證程序的正確性。

∥自定義結構體:ReferenceEllipseCoor,別名RECoor

∥字段:B、L、H

∥目的:存儲大地坐標數據,作為指針參數傳遞

typedefstructReferenceEllipseCoor∥大地坐標系結構

{

doubleB;∥大地緯度

doubleL;∥大地經度

doubleH;∥橢球高

}RECoor;

∥函數名:ComputeCoordinateTransLateParam

∥目的:計算坐標系轉換用da、df、dX、dY、dZ五參數

∥參數As:原橢球體長半軸

∥參數At:目標橢球體長半軸

∥參數Fs:原橢球體扁率

∥參數Ft:目標橢球體扁率

∥參數pSPoints:原橢球體上的大地坐標,RECoor指針類型

∥參數pTPoints:目標橢球體上的大地坐標,RECoor指針類型

∥參數n:轉換用坐標點對個數

∥參數da:引用類型返回轉換參數之壹DA

∥參數df:引用類型返回轉換參數之壹DF

∥參數dX:引用類型返回轉換參數之壹DX

∥參數 dY: 引用類型返回轉換參數之壹 DY

∥參數 dZ: 引用類型返回轉換參數之壹 DZ

void ComputeCoordinateTransLateParam(double As,double At,

double Fs,double Ft,RECoor * pSPoints,RECoor * pTPoints,

int n,double& dA,double& dF,double& dX,double& dY,double& dZ)

{

double dXSum = 0;

double dYSum = 0;

double dZSum = 0;

double Xs;

double Ys;

double Zs;

double Xt;

double Yt;double Zt;

double esq = 2* Fs - Fs* Fs;

double etq = 2* Ft - Ft* Ft;

for(int i = 0; i < n; i + + )

{

double B = pSPoints [i] . B;

double L = pSPoints [i] . L;

double H = pSPoints [i] . H;

double SinB = : : sin(B);

double CosB = : : cos(B);

double SinB2 = SinB* SinB;

double SinL = : : sin(L);

double CosL = : : cos(L);

double N = As/: : sqrt(1 - esq* SinB2);Xs =(N + H)* CosB* CosL;

Ys =(N + H)* CosB* SinL;

Zs =(N*(1 - esq)+ H)* SinB;

B = pTPoints [i] . B;

L = pTPoints [i] . L;

H = pTPoints [i] . H;

SinB = : : sin(B);

CosB = : : cos(B);

SinB2 = SinB* SinB;

SinL = : : sin(L);

CosL = : : cos(L);

N = At/: : sqrt(1 - etq* SinB2);

Xt =(N + H)* CosB* CosL;

Yt =(N + H)* CosB* SinL;

Zt =(N*(1 - etq)+ H)* SinB;

dXSum + =(Xs - Xt);

dYSum + =(Ys - Yt);

dZSum + =(Zs - Zt);

}

dA = As-At;

dF = Fs-Ft;

dX = dXSum/n;

dY = dYSum/n;

dZ = dZSum/n;

}

  • 上一篇:URL中的空格、加號究竟應該使用何種方式編碼
  • 下一篇:短期贏家指標源代碼
  • copyright 2024編程學習大全網