[GeographicLib] LocalCartesian用法
LocalCartesian
下面我将通过一个具体实例来演示 LocalCartesian 的应用,使用 GeographicLib 库(一个常用的地理计算库)来实现经纬度与局部笛卡尔坐标之间的转换。
这个示例会完成以下操作:
选择一个参考点(例如某个城市的经纬度)
将其他点的经纬度转换为相对于参考点的局部笛卡尔坐标
再将局部笛卡尔坐标转换回经纬度,验证转换的准确性
# 安装依赖:pip install geographiclibfrom geographiclib.geodesic import Geodesic
from geographiclib.localcartesian import LocalCartesiandef main():# 定义参考点(例如:北京天安门的经纬度)# 纬度(lat), 经度(lon), 海拔(h)ref_lat = 39.9042ref_lon = 116.4074ref_h = 0.0# 初始化局部笛卡尔坐标系,以参考点为原点lc = LocalCartesian(ref_lat, ref_lon, ref_h, Geodesic.WGS84)# 示例点1:北京故宫(距离参考点不远)point1_lat = 39.9163point1_lon = 116.3908point1_h = 0.0# 将经纬度转换为局部笛卡尔坐标 (x, y, z)# x: 东方向, y: 北方向, z: 垂直方向x1, y1, z1 = lc.Forward(point1_lat, point1_lon, point1_h)print(f"点1相对于参考点的局部坐标:")print(f"x: {x1:.2f}米 (东方向)")print(f"y: {y1:.2f}米 (北方向)")print(f"z: {z1:.2f}米 (垂直方向)\n")# 示例点2:上海人民广场(距离参考点较远)point2_lat = 31.2304point2_lon = 121.4737point2_h = 0.0x2, y2, z2 = lc.Forward(point2_lat, point2_lon, point2_h)print(f"点2相对于参考点的局部坐标:")print(f"x: {x2:.2f}米 (东方向)")print(f"y: {y2:.2f}米 (北方向)")print(f"z: {z2:.2f}米 (垂直方向)\n")# 将局部坐标转换回经纬度,验证准确性lat, lon, h = lc.Reverse(x1, y1, z1)print(f"将点1的局部坐标转换回经纬度:")print(f"纬度: {lat:.6f}, 经度: {lon:.6f}, 海拔: {h:.2f}米")print(f"原始值: 纬度: {point1_lat:.6f}, 经度: {point1_lon:.6f}")if __name__ == "__main__":main()
代码解释:
参考点设置:我们选择了北京天安门作为参考点,以此为原点建立局部笛卡尔坐标系
核心转换方法:Forward():将经纬度坐标转换为局部笛卡尔坐标Reverse():将局部笛卡尔坐标转换回经纬度坐标
坐标含义:x:东方向距离(米)y:北方向距离(米)z:垂直方向距离(米)
实际应用场景:
这个示例展示了 LocalCartesian 在以下场景中的价值:
无人机导航:可以将起飞点作为参考点,无人机的位置用局部坐标表示,简化距离和方向计算
机器人定位:在局部区域内,使用笛卡尔坐标比经纬度更便于路径规划和运动控制
工程测量:在建筑工地上,以某个基准点建立局部坐标系,方便计算各点之间的相对位置
注意:局部笛卡尔坐标系更适合小范围区域(如城市级别),对于跨大洲等大范围场景,误差会逐渐增大。