84坐标与火星坐标间的转换
·
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
WGS84坐标与GCJ火星坐标的转换
前言
本文涉及简单的火星坐标系的数学转换而非涉密算法的转换,仅供学习参考哈!!!
一、各个坐标系介绍
1、火星坐标系
GCJ火星坐标系(简称GCJ)是中国国家测绘地理信息局制定的一种坐标系,也被称为“火星坐标系”。它是在WGS84的基础上,通过加密算法加入随机偏移后形成的。
2、WGS84坐标系
定义:WGS84(World Geodetic System 1984)是全球通用的地理坐标系,广泛应用于全球定位系统(GPS)、国际地图数据等领域。它基于一个椭球体模型,描述地球表面的经纬度位置。
表示方式:WGS84坐标以经度(Longitude)和纬度(Latitude)表示,单位通常为十进制度数。
二、转换步骤
主要流程为:
a、偏移计算
b、非线性变换
c、坐标修正
2.1、所需要的python库
import math
2.2、非线性偏移计算与坐标矫正
根据输入的WGS84经纬度,计算出需要施加的偏移量(记为 dlat 表示纬度偏移,dlng 表示经度偏移)
偏移量的大小和方向与地理位置有关,通常在中国大陆范围内有较大的偏移,而在边界以外可能接近零。
地球的数学模型参数
长半轴 a(通常取值为 6378245.0 米,接近克拉索夫斯基椭球的定义)。
偏心率 ee(如 0.00669342162296594323),用于描述椭球体的扁平程度。
非线性偏移计算
dlat = transformlat(lng - 105.0, lat - 35.0)
dlng = transformlng(lng - 105.0, lat - 35.0)
坐标修正
GCJ纬度 = WGS84纬度 + dlat
GCJ经度 = WGS84经度 + dlng
以下是完整代码:
def transformlat(lng, lat):
PI = 3.1415926535897932384626
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(lng))
ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0
ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0
return ret
def transformlng(lng, lat):
PI = 3.1415926535897932384626
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(abs(lng))
ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0
ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
return ret
def wgs84togcj02(lng, lat):
PI = 3.1415926535897932384626
ee = 0.00669342162296594323
a = 6378245.0
dlat = transformlat(lng - 105.0, lat - 35.0)
dlng = transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * PI
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * PI)
mglat = lat + dlat
mglng = lng + dlng
return [round(mglng, 6), round(mglat, 6)]
原始经纬度图像
偏移修正之后
转换过程偏差不是很大,几乎偏移在三个小数点以后

总结
上述步骤基于数学模型近似的计算了火星坐标系与WGS84坐标系之间的位置偏移关系,因为大多数主流的地图进行了至少两次非线性坐标偏移,因此还存在二次便宜误差无法矫正的情况,因为和核心偏移算法涉密,这里只是利用简单的数学推理得出偏移值并且补偿掉原有的偏差。仅供学习参考。
步骤参考:https://www.cnblogs.com/giserjobs/p/12291291.html
更多推荐


所有评论(0)