python——经纬度坐标和平面投影坐标的相互转换
美赛建模需要使用到平面坐标系去做基于时间序列的运动范围模型,所以需要对经纬度进行坐标系转换,转换到XY坐标系下。同时,在机器人的路径规划等方面依然会经常使用到坐标系的转换,所以记录一下。文章目录经纬度坐标系和平面投影坐标系地理坐标系 / 大地坐标系平面投影坐标系墨卡托投影法变量和常量定义(1)墨卡托投影正解算公式(2)墨卡托投影逆解算公式Python代码实现(1)墨卡托投影正解算公式(2)墨卡托投
·
美赛建模需要使用到平面坐标系去做基于时间序列的运动范围模型,所以需要对经纬度进行坐标系转换,转换到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)墨卡托投影逆解算公式
公式已有,可以自行复现。
参考论文:
更多推荐
已为社区贡献11条内容
所有评论(0)