浏览代码

坐标系转换:从 WGS84 转换为 GCJ-02

shizhongqi 4 月之前
父节点
当前提交
45b35dfef8
共有 2 个文件被更改,包括 65 次插入0 次删除
  1. 8 0
      app-hd/controllers/GhsController.php
  2. 57 0
      common/components/mapUtil.php

+ 8 - 0
app-hd/controllers/GhsController.php

@@ -445,12 +445,20 @@ class GhsController extends BaseController
     public function actionSearchNearbyGhs()
     {
         $get = Yii::$app->request->get();
+        $locationType = $get['locationType'];
         $toLat = $get['lat'] ?? '';
         $toLnt = $get['long'] ?? '';
         if ($toLat == '' || $toLnt == '') {
             util::fail('未获取到定位数据');
         }
 
+        if ($locationType == 'wgs84') {
+            // WGS84 → GCJ-02 转换
+            $re = \common\components\mapUtil::wgs84ToGcj02($toLnt, $toLat);
+            $toLat = $re['lat'];
+            $toLnt = $re['lnt'];
+        }
+
         $where = [];
         $where['ownShopId'] = $this->shopId;
         $where['delStatus'] = 0;

+ 57 - 0
common/components/mapUtil.php

@@ -96,4 +96,61 @@ class mapUtil
         $result = Json::decode($result);
         return $result;
     }
+
+    /**
+     * 坐标系转换:从 WGS84 转换为 GCJ-02
+     * @param $lng
+     * @param $lat
+     * @return array
+     */
+    public static function wgs84ToGcj02($lng, $lat)
+    {
+        $lng = (float)$lng;
+        $lat = (float)$lat;
+        if (self::outOfChina($lng, $lat)) {
+            return ['lng' => $lng, 'lat' => $lat];
+        }
+
+        $a = 6378245.0;
+        $ee = 0.00669342162296594323;
+        $dLat = self::transformLat($lng - 105.0, $lat - 35.0);
+        $dLng = self::transformLng($lng - 105.0, $lat - 35.0);
+        $radLat = $lat / 180.0 * M_PI;
+        $magic = sin($radLat);
+        $magic = 1 - $ee * $magic * $magic;
+        $sqrtMagic = sqrt($magic);
+        $dLat = ($dLat * 180.0) / (($a * (1 - $ee)) / ($magic * $sqrtMagic) * M_PI);
+        $dLng = ($dLng * 180.0) / ($a / $sqrtMagic * cos($radLat) * M_PI);
+
+        return ['lng' => $lng + $dLng, 'lat' => $lat + $dLat];
+    }
+
+    private static function transformLat($lng, $lat)
+    {
+        $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 * M_PI) + 20.0 * sin(2.0 * $lng * M_PI)) * 2.0 / 3.0;
+        $ret += (20.0 * sin($lat * M_PI) + 40.0 * sin($lat / 3.0 * M_PI)) * 2.0 / 3.0;
+        $ret += (160.0 * sin($lat / 12.0 * M_PI) + 320.0 * sin($lat * M_PI / 30.0)) * 2.0 / 3.0;
+        return $ret;
+    }
+
+    private static function transformLng($lng, $lat)
+    {
+        $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 * M_PI) + 20.0 * sin(2.0 * $lng * M_PI)) * 2.0 / 3.0;
+        $ret += (20.0 * sin($lng * M_PI) + 40.0 * sin($lng / 3.0 * M_PI)) * 2.0 / 3.0;
+        $ret += (150.0 * sin($lng / 12.0 * M_PI) + 300.0 * sin($lng / 30.0 * M_PI)) * 2.0 / 3.0;
+        return $ret;
+    }
+
+    private static function outOfChina($lng, $lat)
+    {
+        if ($lng < 72.004 || $lng > 137.8347) {
+            return true;
+        }
+        if ($lat < 0.8293 || $lat > 55.8271) {
+            return true;
+        }
+        return false;
+    }
 }