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

文章目录

  • ​​经纬度坐标系和平面投影坐标系​​
  • ​​地理坐标系 / 大地坐标系​​
  • ​​平面投影坐标系​​
  • ​​墨卡托投影法​​
  • ​​变量和常量定义​​
  • ​​(1)墨卡托投影正解算公式​​
  • ​​(2)墨卡托投影逆解算公式​​
  • ​​Python代码实现​​
  • ​​(1)墨卡托投影正解算公式​​
  • ​​(2)墨卡托投影逆解算公式​​

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

地理坐标系 / 大地坐标系

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

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

平面投影坐标系

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

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

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

墨卡托投影法

若点​​(B,L)​​​经过墨卡托投影(下图)得到的新坐标为点​​(X,Y)​​,

其中​​B0​​​为标准纬度,​​L0​​​为标准经度,​​e​​​ 为第一偏心率,​​e ’​​为第二偏心率,根据墨卡托投影方法我们可以实现坐标系的相互转化。

python——经纬度坐标和平面投影坐标的相互转换_Python

变量和常量定义

椭圆的长半轴​​a​​​, 椭圆的短半轴​​b​​:

python——经纬度坐标和平面投影坐标的相互转换_Python_02

python——经纬度坐标和平面投影坐标的相互转换_git_03

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

经纬度坐标​(B,L)​​计算得到平面投影坐标​(X,Y)​​:

python——经纬度坐标和平面投影坐标的相互转换_git_04

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

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

python——经纬度坐标和平面投影坐标的相互转换_Python_05

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)

运行示例:

python——经纬度坐标和平面投影坐标的相互转换_Python_06

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

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

参考论文:

  • ​​[1]胡正,杨青,卜晓楠,张波,江伟健,宋祥瑞.TDOA定位中经纬度与平面坐标转换方案的研究[J].电子世界,2019(03):36-37.​​