坐标变换的七个参数

坐标变换的七个参数,第1张

坐标转薯哗换始终是测绘工作不可缺少的主题。坐标变换的方法很多,其中一些可以用相应的参数描述,其中使用最广泛的是七个参数。七个参数中的大多数用于不同坐标系之间的参考转换。

七个参数的由来

七个参数是什么,七个参数是什么?

七个参数的应用

参数的应用过程分为三个过程:旋转,缩放和平移。这三个过程的顺序是什么?让我们看一下公式:

减少到:

其中,X1是原始空间坐标,X2是目标空间坐标,K是比例,R是旋转,而dX是平移。

您可以看到顺序是旋转,缩放和平移。当然,相反的是平移,缩放和最终旋转,这是一个可逆的过程,有利于两个空间坐标的来回转换。为了方便起见,我们将旋转,缩放和平移定义为七个参数的正应用。平移,缩放和旋转定义为反应的七个参数。

我们可以看一下坐标系的EPSG定义:

七个参数的定义称为towgs84,字面意思是转换towgs84所需的七个参数。它还可以用作不同坐标系之间的参考转换。在基线转换之前,EPSG必须同时指定原始towgs84和目标towgs84七个参数。

这就是问题所在!

两个七参数参考如何转换?为什么与WGS84有关?与我们熟悉的工程明星和SGO坐标变换相反,通常只使用一个七参数的情况,如何理解?

首先,大多数工程星和SGO的转换方案都是从WGS84坐标转换为XIAN80,Beijing54,CGCS2000等坐标。这里使用的七个参数是直接从原始坐标系到目标坐标系的七个参数。EPSG定义的七个参数(参考)是将坐标系本身转换为WGS84坐标的七个参数。实际上,只要两个坐标系都知道如何转换为WGS84坐标,就可以间接知道两个坐标系之间的参考变换。

至于为什么是WGS84,则是历史原因造成的。由于WGS84是建立的第一个全局坐标系,因此卫星定位通常会获取WGS84的空间或地面坐标。为了在其自己定义的坐标系指手迹下转换为坐标,它需要与WGS84建立自己的关系。

最后,EPSG如何使用两个七个参数进行参考转换。回到先前应用七个参数的正负问题,原始坐标系的towgs84将原始坐标转换为WGS84的坐标(以下称为84坐标)。这是前向应用程序。因此,我们获得了84个坐标,并使用目标坐标系的towgs84获得了最终坐标,该坐标用于反应。实际上,我们工程星的原始坐标系和目标坐标系以及SGO坐标变换可以指定七个参数,但是低频常常被我们忽略。但是与上述过程相反,原始坐标系的七个参数用于反应,目标坐标系的七个参数用于应用。随着华南地区的发展壮大以及与国际市场的进一步融合,将有越来越多的场景使用这两个七个参数进行基准转换,例如我们的新软件GIStar。我们需要很好地了解其原理和过程,并了解现有功能和新功能之间的区别,以使坐标转换更加方便。

* 七个参数的详细信息

towgs84的对面是fromwgs84,在旋转和缩放较小的前提下彼此相对。Fromwgs84可以参考trimble的坐标转换工具。如何唯并区分wwgs84和wwgs84?好了,很容易理解,正在使用七个参数将非84坐标转换为84坐标,因此这七个参数是towgs84使用七个参数将84坐标转换为非84坐标,因此此参数为fromwgs84。我们的工程明星和SGO将wgs84作为原始坐标系的转换场景,并且使用的所有七个参数都是fromwgs84。

返回到前面提到的公式,在这种情况下,X1是84坐标,X2是非84坐标,例如XIAN80。然后,由k,R和dX组成的七个参数是fromwgs84,而towgs84是X2与X1交换时。

七个参数的解

要求解7个参数,我们至少需要7个方程。一对空间坐标可以列出3个方程,这意味着我们至少需要3对点才能通过最小二乘法求解7个参数。当然,点数也要注意,不仅3点好,也不要点越多越好,具体需要参考实际情况。

作为参考转换的工具,这七个参数适用于大区域甚至整个世界。我们需要选择该区域中均匀分布的控制点来解决这七个参数。小区域的七个参数不适用。同样,这里的towgs84和fromwgs84是非84坐标,目标是84坐标,七个参数是fromwgs84和towgs84。

以上是坐标变换七个参数的介绍,希望对您有所帮助。

the seven parameters of coordinate transformation

#include <stdio.h>

#include <math.h>

#define deg2rad 0.01745329251994433

struct Data

{

double X, Y, Z

double B, L, H

double a

double b

}

void BLH2XYZ(Data *dsrc)

double e = sqrt(1 - (dsrc->b / dsrc->a)*(dsrc->b / dsrc->a))

double sinB = sin(dsrc->B)

double cosB = cos(dsrc->B)

double sinL = sin(dsrc->L)

double cosL = cos(dsrc->L)

double tanB_2 = tan(dsrc->B) * tan(dsrc->B)

double f = 1 - e * e

double fd = sqrt(1 + f * tanB_2)

dsrc->X = (dsrc->a * cosL) / 厅带fd + dsrc->H * cosB * cosL

dsrc->Y = (dsrc->a * sinL) / fd + dsrc->H * cosB 扮正芦* sinL

double fd2 = sqrt(1 - e * e * sinB * sinB)

dsrc->Z = (dsrc->a * f * sinB) / fd2 + dsrc->H * sinB

}

int main()

{

Data dsrc

dsrc.a = 6378137.0000 dsrc.b = 6356752.3142

dsrc.B = 30 * deg2rad dsrc.L = 114 * deg2rad dsrc.H = 20

BLH2XYZ(&dsrc)

printf("%.4lf    %.4lf    %.4lf\n", dsrc.B, dsrc.L, dsrc.H)

printf("%.4lf    %.4lf    %.4lf\n", dsrc.X, dsrc.Y, dsrc.Z)

}

结果

上面的结果是我拿别人工具源码算的 下面是程序运行结果   精清乎度只打印了4位有效数字


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12343253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存