3D(7 参数)Helmert 变换在 Python 中不起作用
3D (7 Parameter) Helmert Transformation Not Working in Python
我正在尝试在 Python 中创建一个程序,让我检查我的测量软件中的大地测量应用程序吐出的大地测量变换。我有一个测试点并且知道我的程序目前 returns 完全是垃圾。
我使用的公式是7参数Halmert变换:
Vb = T + (1 + s * 10^−6)•R•Va
我的代码是:
import numpy as np
from math import pow
# Input Parameters
Tx = 89.5 # in metres
Ty = 93.8
Tz = 123.1
Rx = 0 # in arcsecs
Ry = 0
Rz = 0.156
s = -1.2 # ppm
Vax = 58.000086817 # Lat
Vay = 0.723469322 # Long
Vaz = 0 # Height
# Arrays
T = np.array([[Tx], [Ty], [Tz]])
R = np.array([[1, -Rz, Ry],
[Rz, 1, -Rx],
[-Ry, Rx, 1]])
Va = np.array([[Vax], [Vay], [Vaz]])
# Calculations
RVa = R * Va
RVa = np.sum(RVa, axis=1)
RVa = np.array([[RVa[0]], [RVa[1]], [RVa[2]]])
S = 1 + s * pow(10, -6)
SRVa = S * RVa
Vb = T + SRVa
正确的输出是:
Lat = 58.0007206472222
Long = 0.72507962777778
我还有很长的路要走。
我知道发生了一些有趣的事情,因为我在求和后尝试转置 RVa 但什么也没发生(因此手动转置。我显然把事情搞砸了,感谢任何帮助。
干杯,
Helmert 变换用于将相对于一个坐标系的笛卡尔坐标(ECEF,又名地心地球固定)坐标映射到相对于另一个坐标系的笛卡尔坐标。
如果要将相对于第一个坐标系的纬度、经度、高度坐标转换为相对于第二个坐标系的纬度、经度、高度坐标,钻取是:
Convert the lat,long,height coordinates to cartesians
Apply Helmert to those cartesians, getting cartesians relative to the second coordinate system
Convert those cartesians to lat,long,height in second coordinate system
几点:
Helmert 变换参数通常用于地球的椭圆体模型。忽略这一点,使用球形地球会引入误差,在数十米甚至数百米的尺度上。
当从笛卡尔坐标转换到笛卡尔坐标时,高度是椭圆体高度,即从椭圆体到您的点沿椭圆体法线的距离。您很可能将一个系统中的 0 高度转换为另一个系统中的非零点。但是,如果您靠近地球表面,则忽略高度引起的误差会很小(通常为亚米)。
我正在尝试在 Python 中创建一个程序,让我检查我的测量软件中的大地测量应用程序吐出的大地测量变换。我有一个测试点并且知道我的程序目前 returns 完全是垃圾。
我使用的公式是7参数Halmert变换:
Vb = T + (1 + s * 10^−6)•R•Va
我的代码是:
import numpy as np
from math import pow
# Input Parameters
Tx = 89.5 # in metres
Ty = 93.8
Tz = 123.1
Rx = 0 # in arcsecs
Ry = 0
Rz = 0.156
s = -1.2 # ppm
Vax = 58.000086817 # Lat
Vay = 0.723469322 # Long
Vaz = 0 # Height
# Arrays
T = np.array([[Tx], [Ty], [Tz]])
R = np.array([[1, -Rz, Ry],
[Rz, 1, -Rx],
[-Ry, Rx, 1]])
Va = np.array([[Vax], [Vay], [Vaz]])
# Calculations
RVa = R * Va
RVa = np.sum(RVa, axis=1)
RVa = np.array([[RVa[0]], [RVa[1]], [RVa[2]]])
S = 1 + s * pow(10, -6)
SRVa = S * RVa
Vb = T + SRVa
正确的输出是:
Lat = 58.0007206472222 Long = 0.72507962777778
我还有很长的路要走。
我知道发生了一些有趣的事情,因为我在求和后尝试转置 RVa 但什么也没发生(因此手动转置。我显然把事情搞砸了,感谢任何帮助。
干杯,
Helmert 变换用于将相对于一个坐标系的笛卡尔坐标(ECEF,又名地心地球固定)坐标映射到相对于另一个坐标系的笛卡尔坐标。
如果要将相对于第一个坐标系的纬度、经度、高度坐标转换为相对于第二个坐标系的纬度、经度、高度坐标,钻取是:
Convert the lat,long,height coordinates to cartesians
Apply Helmert to those cartesians, getting cartesians relative to the second coordinate system
Convert those cartesians to lat,long,height in second coordinate system
几点:
Helmert 变换参数通常用于地球的椭圆体模型。忽略这一点,使用球形地球会引入误差,在数十米甚至数百米的尺度上。
当从笛卡尔坐标转换到笛卡尔坐标时,高度是椭圆体高度,即从椭圆体到您的点沿椭圆体法线的距离。您很可能将一个系统中的 0 高度转换为另一个系统中的非零点。但是,如果您靠近地球表面,则忽略高度引起的误差会很小(通常为亚米)。