提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文涉及简单的火星坐标系的数学转换而非涉密算法的转换,仅供学习参考哈!!!


一、各个坐标系介绍

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐