2017-11-10自定义百度地图类——把腾讯经纬度转成百度经纬度

您现在的位置是: 首页 > PHP技术 > 自定义百度地图类——把腾讯经纬度转成百度经纬度

542次阅读

在做微信公众号及微信小程序,遇到使用微信JSSDK获取的经纬度,如果需要调用百度接口来获取经纬度信息,直接传通过微信JSSDK获取的经纬度,返回地址偏差非常大,为了提高精准度,我们需要把企鹅经纬度 转成 百度经纬度

详情查看百度地图文档,http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition&qq-pf-to=pcqq.c2c 

微信h5页面调用微信JSSDK代码

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script><!--调用JSSDK-->
<script>

    wx.ready(function () {

        wx.getLocation({
            success: function (res) {
                var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                var speed = res.speed; // 速度,以米/每秒计
                var accuracy = res.accuracy; // 位置精度
                
                // 下面可以写代码 发送将通过微信JSSDK获取到的经纬度异步请求到php进行操作

            },
            cancel: function (res) {
                alert('用户拒绝授权获取地理位置');
            }
        });
    });

</script>



PHP代码,把腾讯经纬度转成百度经纬度

<?php


class BaiDuMaps{

    // 百度地图密钥
    private $ak;

    public function __construct()
    {
        $this->ak = 'ZQiFErjQB7inrGpx27M1GR5w3TxZ64k7';
    }


    public function httpGet($url='') {


        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;


    }


    // 把企鹅经纬度 转成 百度经纬度
    // 解决企鹅经纬度与百度地图偏差问题
    public function qqToBaiDu($longitude='',$latitude=''){


        $url = 'http://api.map.baidu.com/geoconv/v1/?coords='.$longitude.','.$latitude.'&from=1&to=5&ak='.$this->ak;
        $res = $this->httpGet($url);
        $res = json_decode($res,true);

        if($res['status']==0){
            $data = array(
                'longitude' => $res['result'][0]['x'],
                'latitude' => $res['result'][0]['y']
            );
            return $data;
        }else{
            return false;
        }

    }


    // 通过获取的百度经纬度获取详细地址
    // 获取到的地址是一个列表
    public function getAddressByLngLat($longitude,$latitude){


        $url = 'http://api.map.baidu.com/geocoder/v2/?location='.$latitude.','.$longitude.'&output=json&pois=1&ak='.$this->ak;
        $data = $this->httpGet($url);
        $data = json_decode($data,true);

        if($data['status']==0){
            return $data;
        }else{
            return false;
        }

    }


    // 通过详细地址获取 百度经纬度
    public function getLngLatByAddress($address){

        $url = 'http://api.map.baidu.com/geocoder/v2/?address='.$address.'&output=json&ak='.$this->ak;
        $res = $this->httpGet($url);
        $res = json_decode($res,true);

        if($res['status']==0){
            $data = array(
                'longitude' => $res['result']['location']['lng'],
                'latitude' => $res['result']['location']['lat'],
            );
            return $data;
        }else{
            return false;
        }

    }


        // 测试方法
    public function test(){

        // 公司
        $longitude = '113.9521';
        $latitude = '22.59123';

        $data = $this->qqToBaiDu($longitude,$latitude);


        if($data!==false){
            $longitude = $data['longitude'];
            $latitude = $data['latitude'];

            $address = $this->getAddressByLngLat($longitude,$latitude);

            echo '<pre>';
            var_dump($address);

        }



    }



}


$b = new BaiDuMaps();
$b->test();
$address = "中国广东省深圳市南山区大学城创意园内";
var_dump($b->getLngLatByAddress($address));