osaet/content/posts/geographic-coordinate-conversion.md
yarnom f0b50d13ea feat: add admin publishing workflow and yar theme
Add Go/Postgres admin APIs, Angular admin UI, manual build flow, asset uploads, markdown import/export, configurable slug generation, and the Yar reading theme. Exclude local docs and generated development artifacts from version control.
2026-06-01 15:48:04 +08:00

170 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: b2fdfd13-695a-4665-8574-6309ee049188
slug: geographic-coordinate-conversion
title: 地理坐标转换
summary: ""
status: published
tags: []
cover: ""
version: 1
slug_source: manual
slug_locked: true
published_at: "2026-01-07T09:27:48+08:00"
created_at: "2024-06-29T07:07:00+08:00"
updated_at: "2026-01-07T09:27:48+08:00"
---
近些日子的工作频繁接触到了大地测量中的各种知识,在编写程序的时候更是涉及各种地理坐标的转换,虽然没有深入去学习其核心的变化原理,但是简单地使用现存的公式配合程序进行计算还是可以做到的,以下是有关知识的记录。
### 1.名词解释
#### 1.1 LLA 坐标系
LLA 坐标是地理坐标系中的一种表示方法LLA 代表经纬度和高度Latitude, Longitude, and Altitude它通常用于描述地球表面上的位置。
- **Latitude (纬度)**:表示从地球赤道向北或向南的角度,范围是 -90° 到 +90°。正值表示北纬负值表示南纬。
- **Longitude (经度)**:表示从本初子午线(通常是通过格林尼治的子午线)向东或向西的角度,范围是 -180° 到 +180°。正值表示东经负值表示西经。
- **Altitude (高度)**:表示相对于平均海平面的高度,可以是正值(高于海平面)或负值(低于海平面)。
LLA 坐标系也叫全球地理坐标系、大地坐标系、WGS-84坐标系。纬度和经度的数值可以以多种不同的单位或格式出现
- 六十进制度度、分、秒40° 26 46“ N 79° 58 56” W
- 度和十进制分40° 26.767 N 79° 58.933 W
- 十进制度: +40.446 -79.982
横纬竖经,在计算的过程中,主要也是将之转换为十进制来计算的,以下是计算公式:
$$
decimal = degress + \\frac{minutes}{60} + \\frac{seconds}{3600}
$$
关于 **WGS-84** World Geodetic System 19841984年世界大地测量系统它是目前全球范围内使用最广泛的地理坐标系统和地球模型由美国国防部制定和维护主要用于全球定位系统GPS和各种地理信息系统GIS
WGS-84 有几个关键常量用于定义参考椭球体的形状和尺寸,这些常量包括半长轴、半短轴、扁率和离心率等:
- **半长轴 (A)**:椭球体的赤道半径
- 其值为 $ 6378137.0 $ 米。
- **半短轴 (B)**:椭球体的极半径
- 其计算公式为: $ B = A*(1-F) $
- 其值为 $ 6356752.3142 $ 米
- **扁率 (F)**:描述椭球体扁平程度的参数
- 其计算公式为:$ F = \\frac{A-B}{A}$
- 其值为1/298.257223563
- **第一离心率 (E)**:描述椭球体形状的一种参数,反映了椭球体的偏离程度
- 其计算公式:$ E = \\sqrt{1 - (\\frac{B}{A}) ^2} $
- 其值约为: 0.0818191908426
- **第一离心率的平方 (E²)**:减少计算所用
- 其中值约为: 0.00669437999014
#### 1.2 ECEF坐标系
ECEFEarth-Centered, Earth-Fixed坐标系是一种三维笛卡尔坐标系用于表示地球上的位置。ECEF 坐标系也称为地心地固坐标系,它的原点位于地球质心,并且随着地球的自转而旋转。
- **X 轴**:指向穿过地球赤道与本初子午线(通过格林尼治的子午线)交点的方向。
- **Y 轴**指向穿过地球赤道与东经90度子午线交点的方向。
- **Z 轴**:指向北极方向,与地球自转轴一致。
ECEF 坐标系提供了一个统一的三维坐标框架,可以精确地表示地球表面和近地空间的任何位置。
#### 1.3 ENU坐标系
ENUEast-North-Up坐标系是一种局部笛卡尔坐标系用于表示相对于某个参考点的三维位置。
- ENU 坐标系的原点通常位于地球表面的某个参考点,该点的地理坐标为 (Latitude, Longitude, Altitude)。
- **E 轴(东向轴)**:指向地平线的东方。
- **N 轴(北向轴)**:指向地平线的北方。
- **U 轴(上向轴)**:垂直向上,指向天空。
### 2. 坐标系转换
#### 2.1 从 LLA 坐标到 ECEF 坐标
这里约定LLA的经度为 $\\phi$,纬度为 $\\lambda $,海拔为 $ h $, 选取 WGS-84 坐标系参数,$a$和$b$分别是是赤道半径(半长轴)和极半径(半短轴),$e^2 = 1 - \\frac{b^2}{a^2}$是偏心率的平方, $f=1-\\frac{b}{a} $ 是基准椭球体的极扁率。
$$
\\begin{align}
X& = (N(\\phi) + h) cos \\phi cos\\lambda \\\\\\\\
Y& = (N(\\phi) + h) cos \\phi sin\\lambda \\\\\\\\
Z& = (\\frac{b^2}{a^2}N(\\phi) + h)sin\\phi \\\\\\\\
&=((1-e^2)N(\\phi) +h)sin\\phi \\\\\\\\
&=((1-f)^2N(\\phi)+h)sin\\phi
\\end{align}
$$
其中
$$
\\begin{align}
N(\\phi) = \\frac{a^2}{\\sqrt{a^2cos^2\\phi + b^2sin^2\\phi}} = \\frac{a}{\\sqrt{1-e^2sin^2\\phi}}
\\end{align}
$$
#### 2.2 从 ECEF 到 LLA坐标
将 ECEF 坐标 (X, Y, Z) 转换为经纬度和高度 (Latitude, Longitude, Altitude) 需要迭代计算。
$$
\\begin{align}
\\lambda = atan2(Y,X)
\\end{align}
$$
其中atan2 是反正切函数
$\\lambda$ 是唯一能直接算出的,其余的纬度和高度的转换所要涉及 N 的循环关系
$$
\\begin{align}
\\frac{Z}{p}cot\\phi = 1 - \\frac{e^2N}{N+h} \\\\\\\\
h = \\frac{p}{cos\\phi} -N
\\end{align}
$$
其中,如公式$(6)$所示N 的变化取决于 $\\phi$ 的值
纬度和高度需要迭代求解, 例如,从第一个猜测 h≈0 开始,然后更新 N。
其流程是这样的:
1. 猜测 h = 0通过公式$(8) $ 可以推算 $cot\\phi = \\frac{(1-e^2)p}{Z} $ 求解出一个$\\phi_1$
2. 将 $\\phi_1$ 带入公式 $(6)$,求解出 $N$
3. 将 $N$ 带入公式$(9)$ 求解出 $h$
4. 将 $h$ 带入公式$(8)$ 求解出一个新的 $\\phi_2$
5. 如果 $\\phi_1$和$\\phi_2$足够接近则说明迭代出了一个正确的值如果不是则需要回到第2步继续迭代。
#### 2.3 从 ECEF 到 ENU 坐标
ENU 坐标又称为站心坐标6也就是局部坐标这个坐标需要一个局部参考点。在实际例子中这个参考点通常是雷达、基站这些地方。
如果基站位于 ${X_0,Y_0,Z_0}$,测站位于 ${X_1,Y_1,Z_1}$
$$
\\begin{bmatrix}
e\\\\\\\\
n\\\\\\\\
u
\\end{bmatrix}=
\\begin{bmatrix}
-sin\\lambda_0& cos\\lambda_0 & 0\\\\\\\\
-sin\\phi_0cos\\lambda_0& -sin\\phi_0sin\\lambda_0 &cos\\phi_0 \\\\\\\\
cos\\phi_0cos\\lambda_0& cos\\phi_0sin\\lambda_0 & sin\\phi_0
\\end{bmatrix}
\\begin{bmatrix}
X_1 -X_0\\\\\\\\
Y_1-Y_0\\\\\\\\
Z_1-Z_0
\\end{bmatrix}
$$
(完)