admin 发表于 2026-5-28 18:53:27

wgs84转gcj02坐标php类库实现方法

类库代码:

<?php

namespace addons\eshop\library;

class Zbzh
{
    /**
   * WGS84 转 GCJ02 (国测局坐标,适用于高德、腾讯地图)
   * @param float $latWGS84 纬度
   * @param float $lngWGS84 经度
   * @return array['lat'=>GCJ纬度, 'lng'=>GCJ经度]
   */
    public function wgs84_to_gcj02($lat, $lng)
    {
      // 常量定义
      $pi = 3.1415926535897932384626;
      $a = 6378245.0;
      $ee = 0.00669342162296594323;
   
      // 判断是否在国内,不在国内不做偏移
      if (!$this->is_in_china($lat, $lng)) {
            return ['lat' => $lat, 'lng' => $lng];
      }
   
      $dlat = $this->transform_lat($lng - 105.0, $lat - 35.0);
      $dlng = $this->transform_lng($lng - 105.0, $lat - 35.0);
      $radlat = $lat / 180.0 * $pi;
      $magic = sin($radlat);
      $magic = 1 - $ee * $magic * $magic;
      $sqrtmagic = sqrt($magic);
   
      $dlat = ($dlat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtmagic) * $pi);
      $dlng = ($dlng * 180.0) / ($a / $sqrtmagic * cos($radlat) * $pi);
   
      $gcj_lat = $lat + $dlat;
      $gcj_lng = $lng + $dlng;
   
      return [
            'lat' => round($gcj_lat, 6),
            'lng' => round($gcj_lng, 6)
      ];
    }
   
    // 纬度转换
    public function transform_lat($x, $y)
    {
      $pi = 3.1415926535897932384626;
      $ret = -100.0 + 2.0 * $x + 3.0 * $y + 0.2 * $y * $y + 0.1 * $x * $y + 0.2 * sqrt(abs($x));
      $ret += (20.0 * sin(6.0 * $x * $pi) + 20.0 * sin(2.0 * $x * $pi)) * 2.0 / 3.0;
      $ret += (20.0 * sin($y * $pi) + 40.0 * sin($y / 3.0 * $pi)) * 2.0 / 3.0;
      $ret += (160.0 * sin($y / 12.0 * $pi) + 320.0 * sin($y * $pi / 30.0)) * 2.0 / 3.0;
      return $ret;
    }
   
    // 经度转换
    public function transform_lng($x, $y)
    {
      $pi = 3.1415926535897932384626;
      $ret = 300.0 + $x + 2.0 * $y + 0.1 * $x * $x + 0.1 * $x * $y + 0.1 * sqrt(abs($x));
      $ret += (20.0 * sin(6.0 * $x * $pi) + 20.0 * sin(2.0 * $x * $pi)) * 2.0 / 3.0;
      $ret += (20.0 * sin($x * $pi) + 40.0 * sin($x / 3.0 * $pi)) * 2.0 / 3.0;
      $ret += (150.0 * sin($x / 12.0 * $pi) + 300.0 * sin($x / 30.0 * $pi)) * 2.0 / 3.0;
      return $ret;
    }
   
    // 判断是否在中国境内
    public function is_in_china($lat, $lng)
    {
      return ($lng > 73.666666 && $lng < 135.055555 && $lat > 3.866666 && $lat < 53.555555);
    }
}方法调用:
在需要的页面use类库,比如:
use addons\eshop\library\Zbzh;

调用代码:
// 实例化坐标类
                  $zbzh = new Zbzh();
                  $latlng = $zbzh->wgs84_to_gcj02($qxlogs->lat, $qxlogs->lng);
                  $at = $latlng['lat'];
                  $lng = $latlng['lng'];就可以了。
页: [1]
查看完整版本: wgs84转gcj02坐标php类库实现方法