WGS84坐标系转GCJ02坐标系

WGS84 是一种广泛使用的全球地理坐标系,而 GCJ02 是中国国家测绘局制定的地理坐标系统,也称为火星坐标系。由于国家测绘安全的要求,在中国国内的地图服务中,通常会使用 GCJ02 坐标系。下面将为你介绍如何将 WGS84 坐标系转换为 GCJ02 坐标系。

转换原

WGS84 转 GCJ02 的转换过程没有公开的精确算法,因为这是一个加密过程。不过,有一些公开的近似算法可以实现这个转换,其核心思想是根据中国范围内的地理位置,通过一系列的数学公式对经纬度进行偏移。

Python 代码实现

python

import math

# 判断是否在中国范围内
def out_of_china(lng, lat):
    return (lng < 72.004 or lng > 137.8347) or (lat < 0.8293 or lat > 55.8271)

# 转换公式用到的一些辅助函数
def transform_lat(x, y):
    ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))
    ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
    ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
    return ret

def transform_lng(x, y):
    ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))
    ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
    ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0 * math.pi)) * 2.0 / 3.0
    return ret

# 计算偏移量
def delta(lng, lat):
    a = 6378245.0  # 地球长半轴
    ee = 0.00669342162296594323  # 扁率
    dLat = transform_lat(lng - 105.0, lat - 35.0)
    dLng = transform_lng(lng - 105.0, lat - 35.0)
    radLat = lat / 180.0 * math.pi
    magic = math.sin(radLat)
    magic = 1 - ee * magic * magic
    sqrtMagic = math.sqrt(magic)
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * math.pi)
    dLng = (dLng * 180.0) / (a / sqrtMagic * math.cos(radLat) * math.pi)
    return dLng, dLat

# WGS84 转 GCJ02
def wgs84_to_gcj02(lng, lat):
    if out_of_china(lng, lat):
        return lng, lat
    dLng, dLat = delta(lng, lat)
    mgLng = lng + dLng
    mgLat = lat + dLat
    return mgLng, mgLat

# 示例使用
wgs84_lng = 120.123456
wgs84_lat = 30.654321
gcj02_lng, gcj02_lat = wgs84_to_gcj02(wgs84_lng, wgs84_lat)
print(f"WGS84 坐标: ({wgs84_lng}, {wgs84_lat})")
print(f"GCJ02 坐标: ({gcj02_lng}, {gcj02_lat})")

代码解释

  1. out_of_china 函数:用于判断给定的经纬度是否在中国范围内。如果不在中国范围内,则不进行转换,直接返回原经纬度。
  2. transform_lat 和 transform_lng 函数:这两个函数是转换公式中用到的辅助函数,用于计算纬度和经度的偏移量。
  3. delta 函数:根据输入的经纬度,计算偏移量。
  4. wgs84_to_gcj02 函数:将 WGS84 坐标系的经纬度转换为 GCJ02 坐标系的经纬度。如果经纬度不在中国范围内,则直接返回原经纬度。

注意事项

  • 这个算法是一个近似算法,可能会存在一定的误差。
  • 该算法仅适用于中国范围内的经纬度转换。如果输入的经纬度不在中国范围内,将直接返回原经纬度。
### WGS84坐标系换为GCJ02坐标系的方法 WGS84是一种全球定位系统的标准坐标体系,而GCJ02是中国特有的加密坐标系统。两者之间的换涉及到一定的数学运算和地理信息处理。 #### 换原理 为了实现从WGS84GCJ02换,通常采用一种基于多项式的变换方法。该过程涉及到了地球椭球体参数以及特定区域内的偏差修正因子。具体的换公式如下: 对于给定的一组WGS84经纬度(lng, lat),可以通过下面的Python函数将其化为对应的GCJ02坐标[^1]。 ```python import math def transformlng(lng, lat): 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 * math.pi) + 20.0 * math.sin(2.0 * lng * math.pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * math.pi) + 320 * math.sin(lat * math.pi / 30.0)) * 2.0 / 3.0 if ret > 1000.0: ret = 1000.0 elif ret < -1000.0: ret = -1000.0 return ret def transformlat(lng, lat): 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 * math.pi) + 20.0 * math.sin(2.0 * lng * math.pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * math.pi) + 40.0 * math.sin(lat / 3.0 * math.pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * math.pi) + 320 * math.sin(lat * math.pi / 30.0)) * 2.0 / 3.0 if ret > 1000.0: ret = 1000.0 elif ret < -1000.0: ret = -1000.0 return ret def wgs84_to_gcj02(wgs_lng, wgs_lat): dLat = transformlat(wgs_lng - 105.0, wgs_lat - 35.0) dLng = transformlng(wgs_lng - 105.0, wgs_lat - 35.0) radLat = wgs_lat / 180.0 * math.pi magic = math.sin(radLat) magic = 1 - 0.00669342162296594323 * magic * magic sqrtMagic = math.sqrt(magic) dLat = (dLat * 180.0) / ((6378245 * (1 - 0.00669342162296594323)) / (magic * sqrtMagic) * math.pi) dLng = (dLng * 180.0) / (6378245 / sqrtMagic * math.cos(radLat) * math.pi) mgLat = wgs_lat + dLat mgLng = wgs_lng + dLng return mgLng, mgLat ``` 上述代码实现了由WGS84GCJ02坐标的换逻辑,其中包含了必要的数学计算以适应中国的地理位置特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值