七参数空间直角坐标系坐标转换

一、引言
在测绘领域中,经常遇到不同空间直角坐标系之间转换的问题,比如在空间大地测量,摄影测量以及GIS,GPS在测量中经常会用到WGS-84坐标系与我国北京54坐标系或与地方坐标系之间的转换,空间直角坐标转换的七参数模型主要有1.布尔莎模型;2.莫洛琴斯基模型;3.武测模型。
目前大多实际应用多采用布尔莎模型(即包含3个坐标平移参数,3个角度旋转参数和1个尺度缩放参数),以下将讨论基于布尔莎模型的小旋转角,以及大旋转角的空间直角坐标的转换问题。
二、空间直角坐标系坐标转换原理
2.1 空间直角坐标系的概念
空间直角坐标系的坐标原点为椭球的中心,X轴为赤道面和起始子午面的交线;将在赤道面上并与X轴垂直的方向定为Y轴;坐标系的Z轴为椭球的旋转轴,由此构成右手直角坐标系O-XYZ。在空间直角坐标系中,空间中某点的坐标用该点在三个坐标轴上的投影表示,和大地坐标系是一一对应的
2.2 布尔莎模型
如图所示,设有两个空间直角坐标系O-XYZ和O’-X’Y’Z’,这两个坐标系的原点不相一致,即存在三个平移参数、、,它们是O-XYZ坐标系原点O在O’-X’Y’Z’中的坐标;当各坐标轴相互不平行,即存在三个旋转参数、、;两个坐标系的尺度也不一致,设O-XYZ的尺度为1,而设O’-X’Y’Z’的尺度为1+m,尺度变化为m。
采用布尔沙模型将O’-X’Y’Z’下坐标转换为O-XYZ下坐标的步骤为:
(1)将O-XYZ绕X轴顺时针旋转角,使经过旋转后的Y轴与O’-X’Y’Z’平面平行;
(2)将O-XYZ绕Y轴顺时针旋转角,使经过旋转后的 Z轴与 O’-X’Y’Z’平面平行;
(3)将O-XYZ绕Z轴顺时针旋转角,使经过旋转后的X轴与O’-X’Y’Z’平面平行;此时O-XYZ的三个坐标轴己与O’-X’Y’Z’中相应的坐标轴平行;
(4)将O-XYZ的原点分别沿X移动,Y移动和Z移动,使原坐标系与O’-X’Y’Z’的原点重合。
(5)将O-XYZ中的长度单位缩放l+m倍,使其与O’-X’Y’Z’的长度单位一致。

可用数学公式将该转换过程表达如下:
(2.1)
其中:

今令:
(2.2)
其中:

通常情况,不同基准的大地坐标系之间的3个欧勒角都是非常小,属于微小量,因此可用等价无穷小替换化简R矩阵;,,,,,
这样矩阵R可表示为:
(2.3)
从而采用布尔沙模型将O-XYZ下坐标转换为O’-X’Y’Z’下坐标的公式可表示为:
(2.4)
将上式进一步整转换值可写为如下形式:
(2.5)
这样,只要至少已知三个点的两个坐标系的坐标就可以确定中的七个参数(△X,△Y, △Z,,,,m),从而确定两个坐标系的转换关系模型。因为满足计算条件的最少的三个公共点对应着9个方程,所以七个转换参数必须通过平差进行计算。
根据上式列出计算七参数的数学模型,由于测量中包含误差,由上式可以得到关于每个公共点的七参数的误差方程
(2.6)
根据上式列出所有n()个公共点的误差方程,再将上式写成矩阵的形式
(2.7)
形式的误差方程组,一般定义P为单位阵,则可以利用间接平差的方法计算七个转换参数。
其中:
——改正数向量
——待求参数向量
——系数矩阵
——常数项向量
——权矩阵(一般为单位阵)
根据间接平差的最小二乘原理,为原则,可得间接平差的法方程为:
(2.8)
其解为:
(2.9)

以下是用C语言实现七参数空间直角坐标坐标转换的示例代码: ``` #include <stdio.h> #include <math.h> #define pi 3.14159265358979323846 // 定义结构体存储七参数 typedef struct SevenParams { double dx; double dy; double dz; double rx; double ry; double rz; double k; } SevenParams; // 定义函数计算旋转矩阵 void calcRotationMatrix(double rx, double ry, double rz, double r[3][3]) { double sinrx = sin(rx * pi / 180.0); double cosrx = cos(rx * pi / 180.0); double sinry = sin(ry * pi / 180.0); double cosry = cos(ry * pi / 180.0); double sinrz = sin(rz * pi / 180.0); double cosrz = cos(rz * pi / 180.0); r[0][0] = cosry * cosrz; r[0][1] = cosry * sinrz; r[0][2] = -sinry; r[1][0] = sinrx * sinry * cosrz - cosrx * sinrz; r[1][1] = sinrx * sinry * sinrz + cosrx * cosrz; r[1][2] = sinrx * cosry; r[2][0] = cosrx * sinry * cosrz + sinrx * sinrz; r[2][1] = cosrx * sinry * sinrz - sinrx * cosrz; r[2][2] = cosrx * cosry; } // 定义函数进行坐标转换 void coordinateTrans(double x, double y, double z, SevenParams params, double *x_out, double *y_out, double *z_out) { double r[3][3]; calcRotationMatrix(params.rx, params.ry, params.rz, r); double x1 = params.k * (x - params.dx) + r[0][0] * y + r[0][1] * z; double y1 = params.k * (y - params.dy) + r[1][0] * x + r[1][1] * z; double z1 = params.k * (z - params.dz) + r[2][0] * x + r[2][1] * y; *x_out = x1; *y_out = y1; *z_out = z1; } int main() { double x = 100.0; double y = 200.0; double z = 300.0; SevenParams params = {10.0, 20.0, 30.0, 5.0, 10.0, 15.0, 1.0}; double x_out, y_out, z_out; coordinateTrans(x, y, z, params, &x_out, &y_out, &z_out); printf("转换前坐标:(%lf, %lf, %lf)\n", x, y, z); printf("转换后坐标:(%lf, %lf, %lf)\n", x_out, y_out, z_out); return 0; } ``` 在这个示例代码中,我们首先定义了一个存储七参数的结构体 `SevenParams`,包括 `dx`、`dy`、`dz`、`rx`、`ry`、`rz` 和 `k` 七个参数。然后我们定义了一个计算旋转矩阵的函数 `calcRotationMatrix`,它接受三个旋转角度 `rx`、`ry` 和 `rz`,并将计算出的旋转矩阵存储在一个 3x3 的二维数组 `r` 中。最后我们定义了一个进行坐标转换的函数 `coordinateTrans`,它接受一个待转换直角坐标坐标 `(x, y, z)` 和七参数,计算出转换后的坐标,并将结果存储在 `x_out`、`y_out` 和 `z_out` 中。 在 `main` 函数中,我们定义了一个待转换的坐标 `(100, 200, 300)` 和七参数 `(10, 20, 30, 5, 10, 15, 1)`,然后调用 `coordinateTrans` 函数进行坐标转换,并输出转换前后的坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值