一、Bursa模型簡介
模型簡介百度即可,這裏不做介紹,因爲不是自己整理的。
二、Bursa模型的推導
2.1 Bursa座標轉換模型
2.3 建立間接平差模型
設有個重合點,七個參數看作必要觀測數,其中總觀測數爲,多餘觀測數。由此關係可知,至少需要3個點才能完成結算。根據間接平差模型,列出誤差方程爲:
將(2)上式簡化爲新的矩陣形式爲:
然後利用最小二乘法來求解座標轉換參數,這種方法利用了所有的公共點,可以得到較好的結果,但是由於將每個點的座標精度都視爲精度相同的觀測值,所以得到是一種近似的結果。因此,各點的座標視爲同精度獨立觀測值,P爲單位矩陣,則可由(3)式得到:
精度評定,其單位權中誤差爲:
注意
需要將旋轉參數、和的單位爲弧度,要將其轉換到秒;尺度參數m單位換位“ppm”,ppmpart per million 百萬分之……。
具體計算公式爲:將旋轉角乘以206265即可換爲“s”,將尺度參數乘以1000000單位即爲 “ppm”。
七參數 | 單位 |
---|---|
2.4 非重合點的座標轉換
利用求得的七參數,將數據代入即可解得轉換後的座標。
精度評定:無法像重合點那樣可以利用原有的座標與轉換的座標來計算殘差。此時可利用配置法,將重合點的轉換值改正數作爲已知值,然後對非公共點進行配置,具體的方法爲:
①計算重合點轉換值得改正數,其重合點的座標採用已知值。
②採用配置可計算出非公共點轉換值的改正數。
爲選擇重合點的個數,根據非重合點與重合點的距離來定權,其權爲:
三、程序的實現
# 忽略煩人的紅色提示
import warnings
warnings.filterwarnings("ignore")
# 導入Python的數據處理庫pandas,相當於python裏的excel
import pandas as pd
# 導入python繪圖matplotlib
import matplotlib.pyplot as plt
# 使用ipython的魔法方法,將繪製出的圖像直接嵌入在notebook單元格中
%matplotlib inline
# 設置繪圖大小
plt.style.use({'figure.figsize':(25,20)})
plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False # 用來正常顯示負號
3.1 座標的導入
# 讀取CGCS2000座標系下的座標
cc = pd.read_csv('new.csv')
# 查看座標
cc
點號 | X | Y | Z | |
---|---|---|---|---|
0 | GPS04 | -1964642.836 | 4484908.586 | 4075486.898 |
1 | GPS30 | -1967082.716 | 4490541.646 | 4068048.151 |
2 | GPS18 | -1958106.370 | 4482074.179 | 4082054.321 |
3 | GPS22 | -1958396.995 | 4485396.445 | 4077966.297 |
4 | GPS27 | -1953364.459 | 4481502.655 | 4084942.265 |
5 | GPS26 | -1957928.755 | 4492765.305 | 4070011.563 |
import numpy as np
np.set_printoptions(suppress=True)
C_XYZ = np.empty((0,3))
for index,row in cc.iterrows():
pd.set_option('precision', 4)
C_x = row['X']
C_y = row['Y']
C_z = row['Z']
C_xyz = np.array([[C_x,C_y,C_z]])
C_XYZ = np.append(C_XYZ,C_xyz,axis=0)
print(C_XYZ)
[[-1964642.836 4484908.586 4075486.898]
[-1967082.716 4490541.646 4068048.151]
[-1958106.37 4482074.179 4082054.321]
[-1958396.995 4485396.445 4077966.297]
[-1953364.459 4481502.655 4084942.265]
[-1957928.755 4492765.305 4070011.563]]
# 讀取地方座標系下的座標
dd = pd.read_csv('old.csv')
# 查看信息
print(dd.shape)
dd
(6, 4)
點號 | X | Y | Z | |
---|---|---|---|---|
0 | GPS04 | -1.9647e+06 | 4.4848e+06 | 4.0754e+06 |
1 | GPS30 | -1.9672e+06 | 4.4904e+06 | 4.0679e+06 |
2 | GPS18 | -1.9582e+06 | 4.4819e+06 | 4.0820e+06 |
3 | GPS22 | -1.9585e+06 | 4.4853e+06 | 4.0779e+06 |
4 | GPS27 | -1.9535e+06 | 4.4814e+06 | 4.0848e+06 |
5 | GPS26 | -1.9580e+06 | 4.4926e+06 | 4.0699e+06 |
import numpy as np
D_XYZ = np.empty((0,3))
for index,row in dd.iterrows():
pd.set_option('precision', 4)
D_x = row['X']
D_y = row['Y']
D_z = row['Z']
D_xyz = np.array([[D_x,D_y,D_z]])
D_XYZ = np.append(D_XYZ,D_xyz,axis=0)
print(D_XYZ)
[[-1964734.964 4484768.547 4075386.77 ]
[-1967174.802 4490401.508 4067948.166]
[-1958198.61 4481934.193 4081954.089]
[-1958489.229 4485256.399 4077866.134]
[-1953456.789 4481362.679 4084841.963]
[-1958020.995 4492625.151 4069911.537]]
3.2 解算七參數
L = []
B = np.empty((0,7))
for i in range(D_XYZ.shape[0]):
# 提取元素
X_C = C_XYZ[i][0]
Y_C = C_XYZ[i][1]
Z_C = C_XYZ[i][2]
X_D = D_XYZ[i][0]
Y_D = D_XYZ[i][1]
Z_D = D_XYZ[i][2]
# 構建L矩陣
L.extend((X_C - X_D,Y_C - Y_D,Z_C - Z_D))
#L = np.append(L,LL,axis=1)
# 構建B矩陣
b1 = np.array([1,0,0,0,-Z_D,Y_D,X_D])
b2 = np.array([0,1,0,Z_D,0,-X_D,Y_D])
b3 = np.array([0,0,1,-Y_D,X_D,0,Z_D])
BB = np.row_stack((b1,b2,b3))
B = np.append(B,BB,axis=0)
B = B
L = np.array([L]).T
# print("L矩陣爲:\n",L)
# print("B矩陣爲:\n",B)
a = np.linalg.inv(np.dot(B.T,B))
b = np.dot(B.T,L)
# 求取僞七參數
x = np.dot(a,b)
print("解算的七參數爲:")
print("X平移參數:{} m".format(x[0][0]))
print("Y平移參數:{} m".format(x[1][0]))
print("Z平移參數:{} m".format(x[2][0]))
print("X旋轉參數:{} s".format(x[3][0]* 206265))
print("Y旋轉參數:{} s".format(x[4][0]* 206265))
print("Z旋轉參數:{} s".format(x[5][0]* 206265))
print("m尺度參數:{} ppm".format(x[6][0]* 1000000))
解算的七參數爲:
X平移參數:121.62369966506958 m
Y平移參數:55.88656985759735 m
Z平移參數:31.898368503898382 m
X旋轉參數:0.18627551317509372 s
Y旋轉參數:-0.06667437699100276 s
Z旋轉參數:0.17122195111095806 s
m尺度參數:17.579272022061332 ppm
3.3 重合點精度評定
V = np.dot(B,x)-L
print(V)
[[-0.00272118]
[-0.0020901 ]
[-0.00234788]
[-0.0013403 ]
[-0.00675914]
[ 0.00558849]
[-0.00004679]
[ 0.00158902]
[ 0.00954763]
[ 0.00228071]
[-0.00345956]
[ 0.00377805]
[-0.00622995]
[ 0.000214 ]
[-0.01070229]
[ 0.00805748]
[ 0.01050535]
[-0.00586396]]
import math
xx = math.sqrt(np.dot(V.T,V)/(3*D_XYZ.shape[0]-7))
print(xx)
0.007287575001997314
3.4 非重合點的轉換
# 讀取地方座標系下的座標
ddno = pd.read_csv('oldno.csv')
# 查看信息
print(ddno.shape)
ddno
(5, 4)
點號 | X | Y | Z | |
---|---|---|---|---|
0 | GPS21 | -1.9545e+06 | 4.4903e+06 | 4.0742e+06 |
1 | GPS17 | -1.9520e+06 | 4.4853e+06 | 4.0811e+06 |
2 | GPS29 | -1.9569e+06 | 4.4974e+06 | 4.0652e+06 |
3 | GPS25 | -1.9519e+06 | 4.4949e+06 | 4.0704e+06 |
4 | GPS28 | -1.9535e+06 | 4.5010e+06 | 4.0629e+06 |
import numpy as np
DN_XYZ = np.empty((0,3))
for index,row in ddno.iterrows():
pd.set_option('precision', 4)
Dno_x = row['X']
Dno_y = row['Y']
Dno_z = row['Z']
DN_xyz = np.array([[Dno_x,Dno_y,Dno_z]])
DN_XYZ = np.append(DN_XYZ,DN_xyz,axis=0)
print(DN_XYZ.shape)
(5, 3)
for i in range(DN_XYZ.shape[0]):
# 提取元素
XN_D = DN_XYZ[i][0]
YN_D = DN_XYZ[i][1]
ZN_D = DN_XYZ[i][2]
LN = np.row_stack((XN_D,YN_D,ZN_D))
# 構建L矩陣
# 構建B矩陣
bn1 = np.array([1,0,0,0,-ZN_D,YN_D,XN_D])
bn2 = np.array([0,1,0,ZN_D,0,-XN_D,YN_D])
bn3 = np.array([0,0,1,-YN_D,XN_D,0,ZN_D])
BN = np.row_stack((b1,b2,b3))
NCC = np.dot(BN,x) + LN
print('第{}個點的座標爲:{},{},{}'.format(i,NCC[0][0],NCC[1][0],NCC[2][0]))
第0個點的座標爲:-1954403.217942523,4490401.535505347,4074332.8511360423
第1個點的座標爲:-1951867.9859425232,4485404.294505347,4081154.3441360416
第2個點的座標爲:-1956813.4649425233,4497507.388505346,4065328.6971360417
第3個點的座標爲:-1951778.264942523,4495070.800505347,4070465.314136042
第4個點的座標爲:-1953427.302942523,4501107.370505347,4062974.232136042
3.5 非重合點的精度評定
3.5.1 定權
aa = list(range(0,V.shape[0],3))
bb = list(range(1,V.shape[0],3))
cc = list(range(2,V.shape[0],3))
# 已知點的x殘差
v_x = V[aa,:]
# 已知點的y殘差
v_y = V[bb,:]
# 已知點的z殘差
v_z = V[cc,:]
v_x.shape
(6, 1)
V_xx,V_yy,V_zz = [],[],[]
for i in range(DN_XYZ.shape[0]):
# 提取元素
XN_D = DN_XYZ[i][0]
YN_D = DN_XYZ[i][1]
ZN_D = DN_XYZ[i][2]
LC = np.row_stack((XN_D,YN_D,ZN_D))
# 定權
PP = np.dot(D_XYZ,LC).T
ccc = []
for j in range(PP.shape[1]):
ccc.append(1/PP[0][j])
# 公式(7)
VV_S = sum(ccc)
print(VV_S)
V_x = np.dot(np.array([ccc]),v_x)[0][0] / VV_S
V_y = np.dot(np.array([ccc]),v_y)[0][0] / VV_S
V_z = np.dot(np.array([ccc]),v_z)[0][0] / VV_S
V_xx.append(V_x)
V_yy.append(V_y)
V_yy.append(V_z)
print("非重合點GPS{}的殘差V_x{} V_y{} V_z{} ".format(i+1,V_x,V_y,V_z))
1.478477870203965e-13
非重合點GPS1的殘差V_x2.621759300967811e-08 V_y-8.17546918711022e-08 V_z1.1506213912802006e-08
1.478462584622879e-13
非重合點GPS2的殘差V_x3.02685943659054e-08 V_y-8.170440346251001e-08 V_z1.3431354650058274e-08
1.4784816011772054e-13
非重合點GPS3的殘差V_x2.0702207439612064e-08 V_y-8.220030115808458e-08 V_z9.309236986800881e-09
1.4784765461761397e-13
非重合點GPS4的殘差V_x2.3313321582638324e-08 V_y-8.337122325453742e-08 V_z1.190322739292841e-08
1.4784846884028183e-13
非重合點GPS5的殘差V_x1.8683221941032832e-08 V_y-8.387564655386071e-08 V_z1.0205456918699615e-08
3.5.2 精度評定
# X的中誤差
S = 0
for i in V_xx:
S += i*i
VXX = math.sqrt(S/(len(V_xx)-1))
print("空間直角座標X殘差中誤差",VXX)
# Y的中誤差
S = 0
for i in V_yy:
S += i*i
VYY = math.sqrt(S/(len(V_yy)-1))
print("空間直角座標Y殘差中誤差",VYY)
# Z的中誤差
S = 0
for i in V_zz:
S += i*i
VZZ = math.sqrt(S/(len(V_zz)-1))
print("空間直角座標Z殘差中誤差",VZZ)
# 點位中誤差
print("空間直角座標點位中誤差",math.sqrt(VXX**2 + VYY**2 + VZZ**2))
空間直角座標X殘差中誤差 2.7040271477441625e-08
空間直角座標Y殘差中誤差 6.21356115133806e-08
空間直角座標Z殘差中誤差 -0.0
空間直角座標點位中誤差 6.776437485667154e-08