1坐标格式转换 ∈ C# 编程笔记

【日志】
2020/6/24 开了此篇博客,准备介绍XYZ、BLH、NEU、高斯投影正反算,搞了一天,预备知识和原理部分差不多了,就差代码了。
2020/6/25 今天回看之前写的代码:wc,这是什么goushi,又臭又长!但是我实在是太懒了,不想在重写了,就简单改下,凑合用吧,毕竟功能还是有的。C# 代码见于源码部分(VIP文章)。

一、预备知识

1. 坐标系简介

我们都知道,我们生活在一个三维的空间当中。现在我们有很多手段来描述空间当中任何一点的准确位置,但是这都得益于坐标系的建立,坐标系是如何建立的呢?下面一起来看一个小故事(来源于百度百科):

1.1 来源

有一天,笛卡尔(1596—1650,法国哲学家、数学家、物理学家)生病卧床,但他头脑一直没有休息,在反复思考一个问题:几何图形是直观的,而代数方程则比较抽象,能不能用几何图形来表示方程呢?这里,关键是如何把组成几何的图形的点和满足方程的每一组“数”挂上钩。他就拼命琢磨。通过什么样的办法、才能把“点”和“数”联系起来。突然,他看见屋顶角上的一只蜘蛛,拉着丝垂了下来,一会儿,蜘蛛又顺着丝爬上去,在上边左右拉丝。

蜘蛛的“表演”,使笛卡尔思路豁然开朗。他想,可以把蜘蛛看做一个点,它在屋子里可以上、下、左、右运动,能不能把蜘蛛的每个位置用一组数确定下来呢?他又想,屋子里相邻的两面墙与地面交出了三条线,如果把地面上的墙角作为起点,把交出来的三条线作为三根数轴,那么空间中任意一点的位置,不是都可以用这三根数轴上找到的有顺序的三个数来表示吗?反过来,任意给一组三个有顺序的数,例如3.2.1,也可以用空间中的一个点 P来表示它们(如图 1)。同样,用一组数(a, b)可以表示平面上的一个点,平面上的一个点也可以用一组二个有顺序的数来表示。于是在蜘蛛的启示下,笛卡尔创建了直角坐标系。
在这里插入图片描述

1.2 其他坐标系

除了可以用上述空间直角坐标系来描述空间中的任意一点位置,还可用球坐标系、柱坐标系 来描述:

1. 球坐标系
在这里插入图片描述
如上图(来源于百度百科)所示,我们首先在空间中建立一个参考点(原点),之后从我们将要描述的那个点引一条直线到原点。这条直线的长度记为r,这条直线在xoy平面的投影与x轴正向的夹角记为 φ \varphi φ,这条直线与z轴正向的夹角记为 θ \theta θ,ok,于是我们也可以用(r, θ \theta θ, φ \varphi φ)这一组数来唯一确定空间中的唯一一点。

1. 球坐标系
在这里插入图片描述
如上图(来源于百度百科)所示,我们还是先在空间中找到一个参考点(原点)将空间直角坐标系建立起来。之后我们从将要描述的那点M向xoy平面引一条垂线交于xoy平面于一点(暂且记为M’)垂线段长度记为z,之后从M’向原点O引一条直线,M’O的长度记为r,M’O与x轴正向的夹角记为 φ \varphi φ。于是我们也可以用(r, φ \varphi φ, z)这一组数来唯一确定空间中的唯一一点。


可以看到,其他坐标系的建立都依托于空间直角坐标系,空间直角坐标系的存在是其他坐标系存在的前提!


2. 几个半径

为了在椭球面上进行控制测量计算,就必须了解椭球面上有关曲线的性质。过椭球面上任意一点可作一条垂直于椭球面的法线,包含这条法线的平面叫做法截面,法截面同椭球面交线叫法截线(或法截弧)。可见,要研究椭球面上曲线的性质,就要研究法截线的性质,而法截线的曲率半径便是一个基本内容。

稍等,为了更好的了解下面几个曲率半径,请看下这几个辅助量:
在这里插入图片描述
下面来看几个曲率半径,后面用到的字母是相同的,就不在赘述了哦~
在这里插入图片描述

3. 几个纬度

在这里插入图片描述
还有一种纬度——地心纬度:地心纬度是纬度的一种。参考椭球上一点与参考椭球中心的连线定义为该点的地心垂线,地心纬度定义为地心垂线与赤道平面的夹角。

三者关系
在这里插入图片描述
三者差异很小,且有 B > u > ϕ B>u>\phi B>u>ϕ

4. XYZ - 地心地固系

上面提到的空间直角坐标系在数学领域是这么个名字,那我们搞测绘的拿来一用就套了个马甲,改头换面成了 地心地固系!

地心地固坐标系(Earth-Centered, Earth-Fixed,简称ECEF)简称地心坐标系,是一种以地心为原点的地固坐标系(也称地球坐标系),是一种笛卡儿坐标系。原点 O (0,0,0)为地球质心,z 轴与地轴平行指向北极点,x 轴指向本初子午线与赤道的交点,y 轴垂直于xoz平面(即东经90度与赤道的交点)构成右手坐标系。
在这里插入图片描述


通俗的讲,就是将空间直角坐标系搬到地球质心,然后让z轴指向北极点,x轴指向本初子午线与赤道的交点,y轴与其构成右手坐标系。


5. BLH - 大地坐标系

在介绍大地坐标系之前,我们首先要搞清楚一个概念:参考椭球。

从古至今,我们的前辈从未放弃过对于自身(人类的起源)和宇宙(宇宙的起源)认识。人类对于地球的形状的认知也逐渐区域完备,现在,我们已经知道,地球是一个不规则的椭球形物体,陆水三七分。这样一个不规则球体,做起研究来超级复杂。数学是几乎是所有学科的基础,数学领域已经将球形研究的很透彻了,所以测绘界前辈就提出了用一个椭球体来最小二乘拟合地球,这样就有了总地球椭球和参考地球椭球之概念。

两者有什么区别呢?从拟合效果来看,总地球椭球是全局最优,参考地球椭球是局部最优。总地球椭球只有一个,它会将整个地球拟合的很好,但是如果我们想研究的区域比如北京吧,它如果用总地球椭球来拟合的话,效果会差很多,所以,就提出来了参考地球椭球,这个参考地球椭球只保证了我用来拟合北京这块地方效果比较好,其他地方不予考虑。

ok,了解了参考椭球,那么我们就看一下大地坐标系的定义:大地坐标系是大地测量中以参考椭球面为基准面建立起来的坐标系。地面点的位置用大地经度、大地纬度和大地高度表示。大地坐标系的确立包括选择一个椭球、对椭球进行定位和确定大地起算数据。

在这里插入图片描述
教材上的描述:
在这里插入图片描述


大地经度L:过P点的子午面与起始子午面间的夹角。由格林威治子午线起算,向东为正,向西为负。
大地纬度B:在P点的子午面上,P点的法线Pn与赤道面的夹角。由赤道起算,向北为正,向南为负。
大地高H:P点沿参考椭球面法线到参考椭球面的距离。


6. NEU - 站心坐标系

以测站为原点,测站上的法线(垂线)为Z轴方向的坐标系就称为
法线(或垂线)站心坐标系。

  • 垂线站心坐标系:以测站为原点,以测站垂线为Z轴,子午线方向为X轴建立的左手坐标系。
  • 法线站心坐标系:以测站为原点,以测站法线为Z轴,子午线方向为X轴建立的左手坐标系。
    在这里插入图片描述

注意:站心坐标系是左手系!!


7. 高斯投影正反算

高斯投影是 横轴椭圆柱等角投影。所谓横轴指的是投影面的轴线与地球自转轴相垂直,且与某一条经线相切所得的投影。所谓等角指的是投影前后的角度不变形,投影的长度比与方向无关,即某点的长度比是一个常数(又把等角投影称为正形投影)。所谓椭圆柱投影指的是椭圆柱与某一经线相切,将该经线附近区域投影到椭圆柱面上,然后将圆柱或椭圆柱展开成平面。总的来说,想象有一个椭圆柱面横套在地球椭球体外面,并与某一条子午线(此子午线称为中央子午线或轴子午线)相切,椭圆柱的中心轴通过椭球体中心,然后用一定投影方法,将中央子午线两侧各一定经差范围内的地区投影到椭圆柱面上,再将此柱面展开即成为投影面。
在这里插入图片描述
以中央子午线为轴,两边对称划出一定区域作为投影范围,此范围称作投影带。分带时,既要限制长度变形,使其不大于测图误差;带数又不应过多,以减少换带计算工作。我国规定按经差6°和3°进行投影分带。

  1. 6°带: 自0°子午线起每隔经差6°自西向东分带,依次编号1,2,3,…60。我国6°带中央子午线的经度,由73°起每隔6°而至135°,共计11带,带号用n表示,中央子午线的经度用L0表示。
    带号及中央子午线经度的关系:
    L0=6×n-3
    n=L/6+1
  2. 3°带: 自东经1.5°子午线起,每隔3°设立一个投影带, 依次编号为1,2,3, …, 120带;中央子午线经度依次为3°, 6°, 9°, … , 360°。
    带号及中央子午线经度的关系:
    n=L/3(四舍五入)
    L0 =3×n

在这里插入图片描述


我国所在地区全在东半球,6°带带号为13 ~ 23,3°带带号为24 ~ 45


8. 几种椭球参数

椭球类型长轴 a/m短轴 b/m
克拉索夫斯基椭球体6378245.06356863.0187730473
1975年国际椭球体6378140.06356755.2881575287
WGS84椭球体6378137.06356752.3142
CGCS20006378137.06356752.3141

算子午线弧长的公式:

二、程序设计

1. 算法原理

1.1 BLH2XYZ

在这里插入图片描述

1.2 XYZ2BLH

在这里插入图片描述

1.3 XYZ NEU 互转

在这里插入图片描述
在这里插入图片描述

1.4 高斯投影正算

高斯投影正算是用大地坐标(L, B)来推导出高斯平面坐标(x, y)
在这里插入图片描述

1.5 高斯投影反算

高斯投影反算是用高斯平面坐标(x, y)来推导出大地坐标(L, B)
在这里插入图片描述


原理部分只取了冰山一角,更多推导过程还请参看教材!!


2. 源码 - 并不在这里

源码结构体:
在这里插入图片描述
这篇博客耗费了我很多精力,现在已经很长了,看起来太费劲,所以源码就放在另一篇博客(VIP文章哦~)中了。设成VIP文章也是无奈之举,我怕之后有学弟学妹们偷懒+蜂蜜毒药+老师找我喝茶 😨 😨 😨 一般学生党都不会有VIP的,所以…

https://blog.csdn.net/Gou_Hailong/article/details/106960334

引用/参考

[1] 孔祥元,郭际明,刘宗泉编著. 《大地测量学基础》第二版. 武汉大学出版社
[2] 百度百科

【注1】其中的代码也许并不完整,您可以作为伪码参看,或者您可以去我主博客逛逛,也许有意外之喜!
【注2】此篇博客是 C# 编程笔记 的子博客。
【注3】由于博主水平有限,程序可能存在漏洞或bug, 如有发现,请尽快与博主联系!

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Unity 坐标转换是在游戏开发中经常需要用到的一种技巧。在 Unity 中,有三种坐标系:世界坐标系、局部坐标系和屏幕坐标系。下面我会分别介绍它们之间的转换方式。 1. 世界坐标系和局部坐标系 在 Unity 中,物体的坐标系分为世界坐标系和局部坐标系。世界坐标系是以场景中心为原点建立的坐标系,而局部坐标系是以物体自身为原点建立的坐标系。 在进行物体坐标系的转换时,可以使用以下方法: 将一个物体的世界坐标坐标转换为局部坐标坐标: ```csharp Vector3 localPos = transform.InverseTransformPoint(worldPos); ``` 将一个物体的局部坐标坐标转换为世界坐标坐标: ```csharp Vector3 worldPos = transform.TransformPoint(localPos); ``` 2. 屏幕坐标系和世界坐标系 在 Unity 中,屏幕坐标系是以屏幕左下角为原点建立的坐标系。将屏幕坐标转换为世界坐标系需要使用 Camera.ScreenToWorldPoint 方法,代码如下: ```csharp Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos); ``` 其中,screenPos 是屏幕坐标系下的坐标,Camera.main 表示主摄像机。 将世界坐标转换为屏幕坐标系需要使用 Camera.WorldToScreenPoint 方法,代码如下: ```csharp Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos); ``` 其中,worldPos 是世界坐标系下的坐标,Camera.main 表示主摄像机。 以上就是 Unity 坐标转换的常用方法。在游戏中,特别是在 UI 界面中,经常需要进行坐标系的转换,掌握这些方法可以使开发更加便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值