美赛建模需要使用到平面坐标系去做基于时间序列的运动范围模型,所以需要对经纬度进行坐标系转换,转换到XY坐标系下。同时,在机器人的路径规划等方面依然会经常使用到坐标系的转换,所以记录一下。

经纬度坐标系和平面投影坐标系

地理坐标系 / 大地坐标系

用经纬度表示的是地理坐标系,也称大地坐标系。

  • 大地测量中以参考椭球面为基准面的坐标。地面点P的位置用大地经度L、大地纬度B和大地高H表示。 当点在参考椭球面上时,仅用大地经度和大地纬度表示。大地经度是通过该点的大地子午面与起始大地子午面之间的夹角,大地纬度是通过该点的法线与赤道面的夹角,大地高是地面点沿法线到参考椭球面的距离。

平面投影坐标系

人们比较习惯于使用平面坐标系,平面坐标系用xy表示。

  • 把球体表面的坐标转成平面坐标需要一定的手段,这个手段称为投影。投影是XYZ平面内的。有时候用地理坐标系不够方便,投影方法也不是唯一的,还是为了一个目的,务求使当地的坐标最准确。所以目前就存在了好多投影方法,比如高斯投影、墨卡托投影等

大地坐标、地理坐标均是球面的,投影坐标是平面的。

墨卡托投影法

若点(B,L)经过墨卡托投影(下图)得到的新坐标为点(X,Y)
其中B0为标准纬度,L0为标准经度,e 为第一偏心率,e ’为第二偏心率,根据墨卡托投影方法我们可以实现坐标系的相互转化。
墨卡托投影

变量和常量定义

椭圆的长半轴a, 椭圆的短半轴b
在这里插入图片描述在这里插入图片描述

(1)墨卡托投影正解算公式

经纬度坐标(B,L)计算得到平面投影坐标(X,Y)
在这里插入图片描述

(2)墨卡托投影逆解算公式

平面投影坐标(X,Y)计算得到经纬度坐标(B,L)。可以用牛顿迭代的方法进行解算,即已知q求B,方法如下:
在这里插入图片描述

Python代码实现

(1)墨卡托投影正解算公式

代码还有小问题,需要各位同学帮忙指正。

from math import *

def get_coordinate(latitude,longitude):
    B = latitude
    L = longitude
    q = log( tan(pi/4 + B/2)*(1-exp(1)*sin(B)) / (1+exp(1)*sin(B))**exp(1/2) )
    x = K*q
    y = K*(L-L0)
    return (x, y)

if __name__ == '__main__':
    latitude = 34
    longitude = -167
    a = 6378137.0000 # 单位为m
    b = 6356752.3142
    B0 = 0; L0 = 0;
    e1 = sqrt(pow(a,2) - pow(b,2)) / a
    e2 = sqrt(pow(a,2) - pow(b,2)) / b
    K = a* cos(B0) / sqrt(1-pow(exp(2), 2)*pow(sin(B0), 2))
    
    data = get_coordinate(latitude,longitude)
    print(data)

运行示例:
在这里插入图片描述

(2)墨卡托投影逆解算公式

公式已有,可以自行复现。

参考论文:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐