php微信位置坐标,微信企业号(服务号)坐标定位发生偏移解决方案记录( 附PHP代码)...

在使用微信提供的企业号获取接口的过程中,发现获取的坐标和后台使用腾讯地图设置的坐标在距离有200-400米左右的偏差。于是上网搜了一下,发现坐标被区分成火星坐标系(GCJ-02)和地球坐标系(WGS-84)。

火星坐标系并非真的和火星有很关系,只是它与真实的地球坐标有偏差(200-400米),如果夸张理解为偏到了火星上,那么火星坐标系就不难理解了。。。那么为什么要把真实的坐标进行偏差呢?因为在天朝,地图是战略保密的。为了我们的国土安全,所以大家要理解。

到正题,火星坐标系的偏差算法是公开的秘密,但是又不是我们这种凡夫俗子能够随意得到的,那么我们又要使用到,所以大多是地图都提供坐标转换,获取希望获得的坐标。

对于微信企业号 在getLocation 方法中加入type:'gcj02'  即可获得火星坐标系,如果不加那么获得的就是地球坐标系。由于pc端地图提供的经纬度是火星坐标系的经纬度,所以为了统一,我们都使用火星坐标系来进行距离计算,如果在 某些情况下,你只获得了地球坐标系,需要转换成火星坐标系,那么下面这段代码可以为你提供参考和使用:

class getGps{

//

// Krasovsky 1940

//

// a = 6378245.0, 1/f = 298.3

// b = a * (1 - f)

// ee = (a^2 - b^2) / a^2;

const pi = 3.14159265358979324;

const a = 6378245.0;

const ee = 0.00669342162296594323;

//

// World Geodetic System ==> Mars Geodetic System

public function transform($wgLat, $wgLon)

{

if ($this->outOfChina($wgLat, $wgLon))

{

$mgLat = $wgLat;

$mgLon = $wgLon;

return;

}

$dLat = $this->transformLat($wgLon - 105.0, $wgLat - 35.0);

$dLon = $this->transformLon($wgLon - 105.0, $wgLat - 35.0);

$radLat = $wgLat / 180.0 * self::pi;

$magic = sin($radLat);

$magic = 1 - self::ee * $magic * $magic;

$sqrtMagic = sqrt($magic);

$dLat = ($dLat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrtMagic) * self::pi);

$dLon = ($dLon * 180.0) / (self::a / $sqrtMagic * cos($radLat) * self::pi);

$mgLat = $wgLat + $dLat;

$mgLon = $wgLon + $dLon;

echo $mgLat.','.$mgLon;

}

public function outOfChina($lat, $lon)

{

if ($lon < 72.004 || $lon > 137.8347)

return true;

if ($lat < 0.8293 || $lat > 55.8271)

return true;

return false;

}

public function transformLat($x, $y)

{

$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 * self::pi) + 20.0 * sin(2.0 * $x * self::pi)) * 2.0 / 3.0;

$ret += (20.0 * sin($y * self::pi) + 40.0 * sin($y / 3.0 * self::pi)) * 2.0 / 3.0;

$ret += (160.0 * sin($y / 12.0 * self::pi) + 320 *sin($y * self::pi / 30.0)) * 2.0 / 3.0;

return $ret;

}

public function transformLon($x, $y)

{

$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 * self::pi) + 20.0 * sin(2.0 * $x * self::pi)) * 2.0 / 3.0;

$ret += (20.0 * sin($x * self::pi) + 40.0 * sin($x / 3.0 * self::pi)) * 2.0 / 3.0;

$ret += (150.0 * sin($x / 12.0 * self::pi) + 300.0 * sin($x / 30.0 * self::pi)) * 2.0 / 3.0;

return $ret;

}

}

$Gps= new getGps();

$Gps->transform('Lat','Lon');不知道会不会被和谐。。。。如果被和谐那我也没办法了,我是爱国家的!只是分享一些知识!

好了,就到这了。。。觉得有用的就给点个赞好么。。。都是自己码的字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值