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]