目录

一、坐标系转换

1.1 测站坐标系rae(极坐标系)和空间直角坐标系xyz(东北天坐标系)互转

1.1.1、原理

1.1.2、公式

1.1.3、python代码

1.2 空间直角坐标系xyz(东北天坐标系)和地心非惯性系直角坐标系XYZ互转

1.2.1、原理

1.2.2、公式

1.2.3、python代码

1.3 经纬高LBH和地心非惯性系直角坐标系XYZ互转

1.3.1、原理

1.3.2、公式

1.3.3、python代码

1.4 测站坐标系rae(极坐标系)和经纬高LBH互转

1.4.1、python代码

二、参考链接


一、坐标系转换

1.1 测站坐标系rae(极坐标系)和空间直角坐标系xyz(东北天坐标系)互转

1.1.1、原理

这个原理过于简单,此处不进行详述。要注意的是我这个地方a(方位)是从正北方向为0°,顺时针为正,e(俯仰)水平面朝上为0~90°,水平面朝下为0~-90°。x轴指向东,y轴指向北,z轴指向天。

1.1.2、公式

a)rae转xyz


b)xyz转rae



1.1.3、python代码

import math
import numpy as npdef rae2xyz(r: float, a: float, e: float):"""rae转xyz(测站xyz):param r: 距离,单位m:param a: 方位,单位(°),从正北顺时针计算0~360°:param e: 俯仰,(°)水平面朝上为0~90°,朝下为0~-90°:return: x,y,z(m),北为y轴,东为x轴。水平面朝上为z轴"""# 转为弧度a = a * math.pi/180e = e * math.pi/180x = r * math.cos(e) * math.sin(a)y = r * math.cos(e) * math.cos(a)z = r * math.sin(e)return x, y, zdef xyz2rae(x: float, y: float, z: float):"""xyz转rae(测站xyz):param x: 东为x轴,单位m:param y: 北为y轴,单位m:param z: 水平面朝上为z轴,单位m:return: r(m)、a、e。方位,单位(°),从正北顺时针计算0~360°,俯仰,(°)水平面朝上为0~90°,朝下为0~-90°。距离单位(m)"""r = math.sqrt(math.pow(x, 2) + math.pow(y, 2) + math.pow(z, 2))a = math.atan2(x, y) / math.pi * 180e = math.atan2(z, math.sqrt(math.pow(x, 2) + math.pow(y, 2))) / math.pi * 180return r, a, e

1.2 空间直角坐标系xyz(东北天坐标系)和地心非惯性系直角坐标系XYZ互转

1.2.1、原理

空间直角坐标系的转换主要涉及到平移和旋转。
        (1)旋转
        旋转主要使用欧拉角公式,任何两个同原点的空间直角坐标系都可以通过三次旋转进行转换,分别是绕X轴、绕Y轴、绕Z轴旋转。
        绕X轴逆时针的转换为:

,转换矩阵:

绕y轴逆时针的转换为:

,转换矩阵为:

绕z轴逆时针的转换为:

,转换矩阵为:

实际在转换时,根据绕x、y、z轴旋转的先后顺序调用计算即可。设初始点为P,那么经过旋转后我们得到了P'点。

(2)平移

经过上一步我们已经完成了旋转,再经过一次平移就能够完成空间中任意两个直角坐标系的转换。

经过第一个步骤旋转之后我们得到了P'点,要得到P'点在x''y''z''坐标系下的坐标,则计算出O''P'向量值即可。平移公式如下:

1.2.2、公式

a)xyz转XYZ

sX、sY、sZ代表测站在XYZ坐标系下的位置,这是个已知值。

b)XYZ转xyz

1.2.3、python代码

import math
import numpy as npdef xyz2XYZ(x:float, y:float, z:float, L:float, B:float, H:float, coorSys:str):"""测站xyz(东北天坐标系转地心非惯性直角坐标系),测站LBH是在什么坐标系的,转出来的XYZ就是相应坐标系下的。比如我测站是在wgs84系的,那么我转出来的XYZ就是wgs84系下的XYZ,因为不同坐标系椭球模型本身的差异,会导致转出来的XYZ有相应的差异:param x: 东为x轴,单位m:param y: 北为y轴,单位m:param z: 水平面朝上为z轴,单位m:param L: 测站经度,单位°:param B: 测站纬度(地理纬度),单位°:param H: 测站高度,单位m:param coorSys: 测站LBH所属坐标系:return: 地心空间直角坐标系XYZ,单位m"""sX, sY, sZ = LBH2XYZ(L, B, H, coorSys)  # 获取测站位置XYZ# 转为弧度L = L/180 * math.piB = B/180 * math.piMs2e = np.mat([[-math.sin(L), -math.cos(L)*math.sin(B), math.cos(L)*math.cos(B)],[math.cos(L),  -math.sin(L)*math.sin(B), math.sin(L)*math.cos(B)],[0, math.cos(B), math.sin(B)]])eP = Ms2e * np.mat([[x], [y], [z]]) + np.mat([[sX], [sY], [sZ]])X = eP[0, 0]Y = eP[1, 0]Z = eP[2, 0]return X, Y, Zdef XYZ2xyz(X:float, Y:float, Z:float, L:float, B:float, H:float, coorSys:str):"""地心空间直角坐标系XYZ转测站xyz(东北天坐标系,东为x轴,北为y轴,水平面朝上为z轴),这个XYZ是什么坐标系下的XYZ,测站位置就应当用相应的LBH,否则转换就不正确。:param X: X轴刻度值,单位m。指向0°经线与协议赤道焦点:param Y: Y轴刻度值,单位m。Y轴与X、Z成右手正交,由Z到X大拇指指向方向为Y:param Z: Z轴刻度值,单位m。指向协议北极:param L: 测站经度,单位°:param B: 测站纬度(地理纬度),单位°:param H: 测站高度,单位m:param coorSys: 测站LBH所属坐标系:return: 测站xyz,单位m"""sX, sY, sZ = LBH2XYZ(L, B, H, coorSys)  # 获取测站位置XYZ# 转为弧度L = L/180 * math.piB = B/180 * math.piMe2s = np.mat([[-math.sin(L), math.cos(L), 0],[-math.sin(B)*math.cos(L), -math.sin(B)*math.sin(L), math.cos(B)],[math.cos(B)*math.cos(L), math.cos(B)*math.sin(L), math.sin(B)]])sP = Me2s * (np.mat([[X], [Y], [Z]]) - np.mat([[sX], [sY], [sZ]]))x = sP[0, 0]y = sP[1, 0]z = sP[2, 0]return x, y, z

1.3 经纬高LBH和地心非惯性系直角坐标系XYZ互转

1.3.1、原理

如上图所示,已知P'点的L、B、H求X、Y、Z。画出P点所在子午圈平面图如下:

P点子午圈平面图

如上图所示,P(v, z),半长轴a,半短轴b,有

          ①椭圆公式

对①式进行微分得:

        ②切线斜率与纬度的关系

由②式得:

           ③

又有偏心率公式:

       ④偏心率公式

将④式代入③式得:

      ⑤

将⑤式代入①式得(化简过程省略):

       ⑥

令:

                      ⑦

可知MP = N,综上所述,可知P点在空间直角坐标系下的坐标(x,y,z):


        
        

以上过程我们求得了椭圆上一点P的x、y、z值,但我们实际是要求椭圆外一点P'的X、Y、Z值。由“P点子午圈平面图”我们不难看出,P'点的X、Y、Z值也就是OP'向量的值,又:

                     ⑧

有:


代入⑧式,得:

由XYZ转LBH过程如下:

做辅助线画图如下:

所以,

          ⑨

又由⑤式知,

所以,

        ⑩

所以将⑩式代入⑨式,得:

     //迭代求解

1.3.2、公式

a)LBH转XYZ:

a为半长轴,e为偏心率




b)XYZ转LBH:

a为半长轴,e为偏心率



     //此处为超越方程,需要迭代求解

1.3.3、python代码

import math
import numpy as npdef LBH2XYZ(L:float, B:float, H:float, coorSys:str):"""经纬高转地心XYZ(X指向0°经线与协议赤道焦点,Z指向协议北极,Y轴与X、Z成右手正交,由Z到X大拇指指向方向为Y):param L: 经度,单位°:param B: 纬度(地理纬度),单位°:param H: 高度,单位m:param coorSys 坐标系选择,参数可以为"wgs84"、"cgcs2000",两种坐标系所采取的椭圆半长轴均为6378137m,扁率不同,wgs84的扁率为1/298.257223564,半短轴为6356752.314245251,偏心率e为0.08181919084248535cgcs2000的扁率为1/298.257222101,半短轴为6356752.314140356,偏心率e为0.08181919104281517:return: 地心XYZ 单位m"""L = L/180 * math.pi   # 先转为弧度B = B/180 * math.pi   # 先转为弧度a = 6378137   # 半长轴if coorSys == "wgs84":e = 0.08181919084248535elif coorSys == "cgcs2000":e = 0.08181919104281517N = a / math.sqrt(1 - math.pow(e, 2) * math.pow(math.sin(B), 2))X = (N + H) * math.cos(B) * math.cos(L)Y = (N + H) * math.cos(B) * math.sin(L)Z = (N * (1 - math.pow(e, 2)) + H) * math.sin(B)return X, Y, Zdef XYZ2LBH(X:float, Y:float, Z:float, coorSys:str):"""地心非惯性坐标系(地固系)XYZ转换为L(经度)B(纬度)H(高程):param X: X轴刻度值,单位m。指向0°经线与协议赤道焦点:param Y: Y轴刻度值,单位m。Y轴与X、Z成右手正交,由Z到X大拇指指向方向为Y:param Z: Z轴刻度值,单位m。指向协议北极:param coorSys: 坐标系选择,参数可以为"wgs84"、"cgcs2000",:return: LBH  单位°、m"""a = 6378137  # 半长轴if coorSys == "wgs84":e = 0.08181919084248535elif coorSys == "cgcs2000":e = 0.08181919104281517L = math.atan2(Y, X) / math.pi * 180tB = 0N = a / math.sqrt(1 - math.pow(e, 2) * math.pow(math.sin(tB), 2))B = math.atan2((Z + N * math.pow(e, 2) * math.sin(tB)), math.sqrt(X*X + Y*Y))while math.fabs(B - tB) > 1e-16:  # 超越方程迭代计算tB = BN = a / math.sqrt(1 - math.pow(e, 2) * math.pow(math.sin(tB), 2))B = math.atan2((Z + N * math.pow(e, 2) * math.sin(tB)), math.sqrt(X * X + Y * Y))N = a / math.sqrt(1 - math.pow(e, 2) * math.pow(math.sin(B), 2))if B == 0:  # 防止赤道上目标刚好为纬度0°时,无法计算的问题H = math.sqrt(X * X + Y * Y) / math.cos(B) - Nelse:H = Z / math.sin(B) - N * (1 - e * e)B = B / math.pi * 180return L, B, H

1.4 测站坐标系rae(极坐标系)和经纬高LBH互转

1.4.1、python代码

结合上文描述的几个函数使用。

def rae2LBH(r: float, a: float, e: float, sL:float, sB:float, sH:float, coorSys:str):"""rae转LBH:param r: 距离,单位m:param a: 方位,单位(°),从正北顺时针计算0~360°:param e: 俯仰,(°)水平面朝上为0~90°,朝下为0~-90°:param sL: 测站经度,单位°:param sB: 测站纬度(地理纬度),单位°:param sH: 测站高度,单位m:param coorSys: 坐标系选择,参数可以为"wgs84"、"cgcs2000",测站所属什么坐标系,这个地方就应当使用什么坐标系:return: L(经度)、B(纬度)、H(高度) 单位°、m"""x, y, z = rae2xyz(r, a, e)X, Y, Z = xyz2XYZ(x, y, z, sL, sB, sH, coorSys)L, B, H = XYZ2LBH(X, Y, Z, coorSys)return L, B, Hdef LBH2rae(L: float, B: float, H: float, sL:float, sB:float, sH:float, coorSys:str):"""LBH转rae:param L: 经度,单位°:param B: 纬度(地理纬度),单位°:param H: 高度,单位m:param sL: 测站经度,单位°:param sB: 测站纬度(地理纬度),单位°:param sH: 测站高度,单位m:param coorSys: 坐标系选择,参数可以为"wgs84"、"cgcs2000",测站所属什么坐标系,这个地方就应当使用什么坐标系:return: r(m)、a、e。方位,单位(°),从正北顺时针计算0~360°,俯仰,(°)水平面朝上为0~90°,朝下为0~-90°。距离单位(m)"""X, Y, Z = LBH2XYZ(L, B, H, coorSys)x, y, z = XYZ2xyz(X, Y, Z, sL, sB, sH, coorSys)r, a, e = xyz2rae(x, y, z)return r, a, e

二、参考链接

此处可参考链接:

(1)第四章地球椭球及其数学详解

(2)第四章椭球数学变换16节

(3)大地测量学基础[1](7)(控制)

测站坐标系、地心非惯性系、经纬高互转相关推荐

  1. 经纬高坐标系-ECEF坐标系-ENU坐标系

    无人机搭载的RTK获得的经纬高坐标要转换为东北天坐标,才能用于局部的导航和定位.为了这个目的,查阅资料,越查越懵逼,竟然这么多的坐标系,略懂之后,将学到的信息记录如下,很多跟我的目的:"RT ...

  2. 经纬高坐标系转到东北天坐标系

    经纬高坐标系转到东北天坐标系 基本思路:首先把经纬高(大地坐标系.lla.llh)转到直角坐标系(地心地固直角坐标系(ECEF).xyz),然后再转为局部坐标系下(东北天坐标系.以第一点作为东北天坐标 ...

  3. 地心直角坐标系转经纬高

    /**@func TheGeoCoordinateSysRotatesToLonAndLat*@brief 地心直角坐标系转经纬高*@input*@output*@return 经纬高*@author ...

  4. 经纬高坐标转东北天坐标

    目录 1 问题描述 2 解决方案 2.1 经纬高转ECEF 2.2 ECEF转东北天 2.3 代入求解 2.3.1 东向化简 2.3.2 北向化简 2.3.3 天向化简 2.4 总结 1 问题描述 已 ...

  5. LLA(经纬高)坐标转换成ENU(东北天)坐标的详细推导

    这是一篇经纬高(LLA)坐标转东北天坐标(ENU)的详细推导,并给出近似转换的过程和结果 参考资料: https://blog.csdn.net/qq_34213260/article/details ...

  6. 已知经纬高求其在无人机图像中的像素点坐标

    背景:已知无人机拍摄时刻的经纬高(WGS84坐标系)以及物点的经纬高,求解该物点在图像中的像素点位置 三种像空间坐标系定义: ①德国汉诺威大学(Hannover)定义的像平面坐标系BLUH:原点位于像 ...

  7. OpenCV图像坐标系与行列宽高的关系

    这篇文章挺好    OpenCV图像坐标系与行列宽高的关系 图片坐标系,与从小到大见到的xy坐标系,x轴方向相同,只是y轴方向相反.

  8. 站心直角坐标系转经纬高

    序:网上很多算法,基本都是错的,还得去找论文才行.原理就不讲了,我会贴出论文引用. 1.转换过程 (1)确定站心直角坐标系的原点(X0,Y0,Z0)=(0,0,0)的经纬高(B0,L0,H0)作为基准 ...

  9. 经纬高、ECEF、ENU坐标系相互转换与实现

    ENU与ecef与WGS84相互转换(c++和python) - CodeAntenna 原理: 坐标系之间的转换关系(ECEF.LLA.ENU)_可即的博客-CSDN博客_lla坐标系

最新文章

  1. linux yum命令详解
  2. 谁是最可爱的人--环卫工人
  3. 4*4矩阵按键控制数码管显示0-F
  4. 使用js实现时钟效果
  5. Android自定义控件(三)——有弹性的ListView
  6. 以下关于程序设计语言的叙述中,不正确的是()【最全!最详细解释!!】
  7. 我又踩坑了!如何为HttpClient请求设置Content-Type标头?
  8. [渝粤题库]陕西师范大学《幼儿园课程》(专科)作业
  9. 一:Proficloud - EMMA能源管理+EMpro智能电表
  10. PCBLayout相关注意事项和常见问题
  11. 异数OS TCP协议栈测试(五)--关于QOS与延迟
  12. hdu 6070 Dirt Ratio —— 二分+线段树
  13. LCD笔记(7)LCD驱动程序框架_配置时钟
  14. linux查看tomcat 控制台,linux 下查看Tomcat的状态,以及开启停止服务命令
  15. 404页面怎么做,如何实现
  16. c语言输出所有汉字代码例题
  17. 基于腾讯COS对象存储SDK使用Python编写的文件上传工具第二版
  18. RC-delay 反相器的应用(菜鸟学习)
  19. Mac下matplotlib中文乱码
  20. css之px自动转rem

热门文章

  1. wordpress点击伸缩归档(archives)页面
  2. 企业在建站前需要了解的七点
  3. Android中文API文档
  4. php日历天气预报下载安装手机桌面_日历天气预报
  5. 爆笑!新一轮的淘宝差评
  6. masquerade词根词缀_GRE填空题-同向逻辑和词汇记忆法
  7. PAT 乙级 数字黑洞
  8. 批处理-从零开始(一)
  9. python新手开发小游戏
  10. 【C语言】输出1-100,再从100-1的数字,