查看: 144|回复: 0

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

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2026-5-28 18:53:27 | 显示全部楼层 |阅读模式
类库代码:

  1. <?php

  2. namespace addons\eshop\library;

  3. class Zbzh
  4. {
  5.     /**
  6.      * WGS84 转 GCJ02 (国测局坐标,适用于高德、腾讯地图)
  7.      * @param float $lat  WGS84 纬度
  8.      * @param float $lng  WGS84 经度
  9.      * @return array  ['lat'=>GCJ纬度, 'lng'=>GCJ经度]
  10.      */
  11.     public function wgs84_to_gcj02($lat, $lng)
  12.     {
  13.         // 常量定义
  14.         $pi = 3.1415926535897932384626;
  15.         $a = 6378245.0;
  16.         $ee = 0.00669342162296594323;
  17.    
  18.         // 判断是否在国内,不在国内不做偏移
  19.         if (!$this->is_in_china($lat, $lng)) {
  20.             return ['lat' => $lat, 'lng' => $lng];
  21.         }
  22.    
  23.         $dlat = $this->transform_lat($lng - 105.0, $lat - 35.0);
  24.         $dlng = $this->transform_lng($lng - 105.0, $lat - 35.0);
  25.         $radlat = $lat / 180.0 * $pi;
  26.         $magic = sin($radlat);
  27.         $magic = 1 - $ee * $magic * $magic;
  28.         $sqrtmagic = sqrt($magic);
  29.    
  30.         $dlat = ($dlat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtmagic) * $pi);
  31.         $dlng = ($dlng * 180.0) / ($a / $sqrtmagic * cos($radlat) * $pi);
  32.    
  33.         $gcj_lat = $lat + $dlat;
  34.         $gcj_lng = $lng + $dlng;
  35.    
  36.         return [
  37.             'lat' => round($gcj_lat, 6),
  38.             'lng' => round($gcj_lng, 6)
  39.         ];
  40.     }
  41.    
  42.     // 纬度转换
  43.     public function transform_lat($x, $y)
  44.     {
  45.         $pi = 3.1415926535897932384626;
  46.         $ret = -100.0 + 2.0 * $x + 3.0 * $y + 0.2 * $y * $y + 0.1 * $x * $y + 0.2 * sqrt(abs($x));
  47.         $ret += (20.0 * sin(6.0 * $x * $pi) + 20.0 * sin(2.0 * $x * $pi)) * 2.0 / 3.0;
  48.         $ret += (20.0 * sin($y * $pi) + 40.0 * sin($y / 3.0 * $pi)) * 2.0 / 3.0;
  49.         $ret += (160.0 * sin($y / 12.0 * $pi) + 320.0 * sin($y * $pi / 30.0)) * 2.0 / 3.0;
  50.         return $ret;
  51.     }
  52.    
  53.     // 经度转换
  54.     public function transform_lng($x, $y)
  55.     {
  56.         $pi = 3.1415926535897932384626;
  57.         $ret = 300.0 + $x + 2.0 * $y + 0.1 * $x * $x + 0.1 * $x * $y + 0.1 * sqrt(abs($x));
  58.         $ret += (20.0 * sin(6.0 * $x * $pi) + 20.0 * sin(2.0 * $x * $pi)) * 2.0 / 3.0;
  59.         $ret += (20.0 * sin($x * $pi) + 40.0 * sin($x / 3.0 * $pi)) * 2.0 / 3.0;
  60.         $ret += (150.0 * sin($x / 12.0 * $pi) + 300.0 * sin($x / 30.0 * $pi)) * 2.0 / 3.0;
  61.         return $ret;
  62.     }
  63.    
  64.     // 判断是否在中国境内
  65.     public function is_in_china($lat, $lng)
  66.     {
  67.         return ($lng > 73.666666 && $lng < 135.055555 && $lat > 3.866666 && $lat < 53.555555);
  68.     }
  69. }
复制代码
方法调用:
在需要的页面use类库,比如:
use addons\eshop\library\Zbzh;

调用代码:
  1. // 实例化坐标类
  2.                     $zbzh = new Zbzh();
  3.                     $latlng = $zbzh->wgs84_to_gcj02($qxlogs->lat, $qxlogs->lng);
  4.                     $at = $latlng['lat'];
  5.                     $lng = $latlng['lng'];
复制代码
就可以了。
道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部