高德地图转天地图

高德地图转天地图示例:

python代码

"""
##高德经纬度(gcj02)转换为天地图经纬度(cgcs2000/WGS84)
#lon_2000,lat_2000=gcj02towgs84(lon_GD,lat_GD)
"""

import math

#常量定义
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率

"""
#改正量计算
"""
def delta(lng,lat):
    lat_rad = lat / 180.0 * pi#纬度的弧度表达
    #中间量 magic = 1 - ee * sin(lat_rad) * sin(lat_rad)
    magic = math.sin(lat_rad)
    magic = 1 - ee * magic * magic
    sqrtmagic = math.sqrt(magic)
    
    dlat = transformlat(lng - 105.0, lat - 35.0)
    dlng = transformlng(lng - 105.0, lat - 35.0)    
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
    dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
    return [dlng, dlat]

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(math.fabs(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):
    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
    0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(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 out_of_china(lng, lat):
    """
    判断是否在国内,不在国内不做偏移
    :param lng:
    :param lat:
    :return:
    """
    if lng < 72.004 or lng > 137.8347:
        return True
    if lat < 0.8293 or lat > 55.8271:
        return True
    return False

"""
GCJ02(火星坐标系,高德)转WGS84(CGCS2000),与https://tool.lu/coordinate/一致
:param gc_lng:GCJ02(火星坐标系)经度,degree
:param gc_lat:GCJ02(火星坐标系)纬度,degree
:return:WGS84(CGCS2000)下的经度(degree)和纬度(degree)
"""
def gcj02towgs84(gc_lng, gc_lat):
    if out_of_china(gc_lng, gc_lat):
        return gc_lng, gc_lat
    #改正量计算
    dlng, dlat=delta(gc_lng, gc_lat)
    lat = gc_lat - dlat
    lng = gc_lng - dlng
    return [lng, lat]

PHP代码

/**
* 获取转换后经纬度入口
* @param $lng
* @param $lat
* @return array
*/
public function gcj02towgs84($lng,$lat)
{
  if ($this->out_of_china($lng,$lat)){
    return array(
      'lng'=>$lng,
      'lat'=>$lat
    );
  }
  //改正量计算
  $snap=$this->delta($lng,$lat);
  $gc_lat = $lat - $snap['lat'];
  $gc_lng = $lng - $snap['lng'];
  return array(
    'lng'=>$gc_lng,
    'lat'=>$gc_lat
  );
}

public function delta($lng,$lat){
  //常量定义
  $pi = 3.1415926535897932384626;  // π
  $a = 6378245.0;  // 长半轴
  $ee = 0.00669342162296594323;  // 扁率
  $lat_rad=$lat / 180.0 * $pi;//纬度的弧度表达
  $magic=sin($lat_rad);
  $magic=1 - $ee * $magic *$magic;
  $sqrtmagic=sqrt($magic);
  
  $dlat=$this->transformlat($lng - 105.0, $lat - 35.0);
  $dlng=$this->transformlng($lng - 105.0, $lat - 35.0);
  $dlat=($dlat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtmagic) * $pi);
  $dlng=($dlng * 180.0) / ($a / $sqrtmagic * cos( $lat_rad) * $pi);
  return array(
    'lng'=>$dlng,
    'lat'=>$dlat
  );
}

public function transformlng($lng,$lat){
  $pi = 3.1415926535897932384626;  // π
  $ret=300.0 + $lng + 2.0 * $lat + 0.1 * $lng * $lng +
    0.1 * $lng * $lat + 0.1 * sqrt(abs($lng));
  $ret += (20.0 * sin(6.0 * $lng * $pi) + 20.0 *
           sin(2.0 * $lng * $pi)) * 2.0 / 3.0;
  $ret += (20.0 * sin($lng * $pi) + 40.0 *
           sin($lng / 3.0 * $pi)) * 2.0 / 3.0;
  $ret +=  (150.0 * sin($lng / 12.0 * $pi) + 300 *
            sin($lng / 30.0* $pi)) * 2.0 / 3.0;
  
  return $ret;
}
public function 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 * sqrt(abs($lng));
  
  $ret += (20.0 * sin(6.0 * $lng * $pi) + 20.0 *
           sin(2.0 * $lng * $pi)) * 2.0 / 3.0;
  
  $ret += (20.0 * sin($lat * $pi) + 40.0 *
           sin($lat / 3.0 * $pi)) * 2.0 / 3.0;
  
  $ret +=  (160.0 * sin($lat / 12.0 * $pi) + 320 *
            sin($lat * $pi / 30.0)) * 2.0 / 3.0;
  return $ret;
}

public function out_of_china($lng,$lat){
  if ($lng < 72.004 || $lng > 137.8347){
    return true;
  }
  if ($lat < 0.8293 || $lat > 55.8271){
    return true;
  }
  return false;
    }

d44b8acc-3be9-714d-5050-ff8b7f37c9aa

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。