|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|