(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;
}