纯 Python(无先决条件)坐标转换,遵循几个流行的 Matlab 例程的约定。
项目描述
Python 3-D 坐标转换
纯 Python(除了 Python 本身没有先决条件)3-D 地理坐标转换和大地测量。API 类似于用于 Python PyMap3D 的流行的 $1000 Matlab Mapping Toolbox 例程,旨在用于大规模并行 (HPC) 和嵌入式系统上的非交互式使用。
感谢我们的贡献者。
其他代码语言中的类似工具箱
先决条件
Pymap3d 与 Python ≥ 3.7 兼容,包括 PyPy。Numpy 和 AstroPy 是可选的;如果 AstroPy 不存在,则使用来自 Vallado 和 Meeus 的算法。
安装
python3 -m pip install pymap3d
或最新的开发代码:
git clone https://github.com/geospace-code/pymap3d
pip install -e pymap3d
安装后可以通过以下方式验证 Python 功能:
pytest pymap3d
用法
在与函数定义一致的情况下,所有参数都可以是任意形状的(标量、ND 数组)。
import pymap3d as pm
x,y,z = pm.geodetic2ecef(lat,lon,alt)
az,el,range = pm.geodetic2aer(lat, lon, alt, observer_lat, observer_lon, 0)
Python 参数解包 可用于具有标量或任意形状的 ND 数组的紧凑函数参数:
aer = (az,el,slantrange)
obslla = (obs_lat,obs_lon,obs_alt)
lla = pm.aer2geodetic(*aer,*obslla)
其中 tuplella
由标量或 ND 数组组成(lat,lon,alt)
。
示例脚本位于示例目录中。
本机 Python 浮点数通常为64 位。Numpy 可以选择真正的精度位:32、64、128 等。
功能
移植到 Python 的流行映射工具箱函数包括以下内容,其中源坐标系(“2”之前)被转换为所需的坐标系:
aer2ecef aer2enu aer2geodetic aer2ned
ecef2aer ecef2enu ecef2enuv ecef2geodetic ecef2ned ecef2nedv
ecef2eci eci2ecef eci2aer aer2eci geodetic2eci eci2geodetic
enu2aer enu2ecef enu2geodetic
geodetic2aer geodetic2ecef geodetic2enu geodetic2ned
ned2aer ned2ecef ned2geodetic
azel2radec radec2azel
lookAtSpheroid
track2 departure meanm
rcurve rsphere
geod2geoc geoc2geod
geodetic2spherical spherical2geodetic
Vincenty 函数“vincenty.vreckon”和“vincenty.vdist”的访问方式如下:
import pymap3d.vincenty as pmv
lat2, lon2 = pmv.vreckon(lat1, lon1, ground_range_m, azimuth_deg)
dist_m, azimuth_deg = pmv.vdist(lat1, lon1, lat2, lon2)
附加功能:
- loxodrome_inverse:椭球点(纬度,经度)之间的恒向线距离和方位角,类似于 Matlab
distance('rh', ...)
和azimuth('rh', ...)
- loxodrome_direct
- 大地纬度在 pymap3d.latitude 中转换为/从:参数、authal、等距等
缩写:
命令行
提供的命令行便利功能包括:
python -m pymap3d.vdist
python -m pymap3d.vreckon
数组与标量
在嵌入式系统或其他流数据应用程序上使用 pymap3d 通常会处理标量位置数据。使用 Python 数学标准库模块可以有效地处理这些数据。矢量数据可以通过列表理解来处理。
那些需要 SIMD 和其他 Numpy 和/或 PyPy 加速性能的多维数据的人可以通过安装 Numpy 自动完成。如果 Numpy 不存在,pymap3d 会无缝回退到 Python 的数学模块。为了保持代码干净,没有 Numpy 只能使用标量数据。如上所述,如果您需要没有 Numpy 的矢量数据,请使用列表推导。
注意事项
- 在所有不调用 AstroPy 的函数中都忽略了大气影响。需要更新代码以添加这些输入参数(只需启动 GitHub 问题以请求)。
- 未充分考虑行星摄动和章动等。
笔记
与PyProj相比:
- 对于大多数转换,PyMap3D 不需要纯 Python 之外的任何东西
- 天文转换是使用(可选)AstroPy 完成的,以实现既定的准确性
- PyMap3D API 类似于 Matlab Mapping Toolbox,而 PyProj 的界面则截然不同
- PyMap3D 本质上处理局部坐标系,例如 ENU,而 PyProj ENU 需要一些额外的工作。
- PyProj 面向行星表面上的点,而 PyMap3D 处理行星表面上或上方的点同样出色,这对于空中飞行器和遥感尤其重要。
AstroPy.Units.Quantity
目前
不支持AstroPy.Units.Quantity 。让我们知道这是否有趣。在使 Quantity 成为一等公民之前,必须考虑对绩效的影响。现在,您可以通过传入.value
变量的 来解决。