定位记录

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="format-detection" content="telephone=no" />
    <meta id="viewPorts" name="viewport" content="width=device-width">
    <title>定位测试</title>
</head>
<body>
<div class="wrap">
    <div class="box">
        <div class="phtxt"><img src="__STATIC_PATH__/images/bftxt.png"></div>
        <div class="baifang">
            <form class="baifangform" id="baifangform" action="">
                <p>
                    <label><font>*</font>地理位置</label>
                    <span class="area" id="show_address">地理位置正在获取中···</span>
                    <input type="hidden" name="province" value="" />
                    <input type="hidden" name="city" value="" />
                    <input type="hidden" name="district" value="" />
                    <input type="hidden" name="address" value="" />
                    <input type="hidden" name="lng" value="" />
                    <input type="hidden" name="lat" value="" />
                </p>
                <p class="btn">
                    <input type="button" onclick="submitData()" value="立即提交" />
                </p>
            </form>
        </div>
    </div>
</div>
</body>
<div style="display: none" id="allmap"></div>
<input type="hidden" name="deviceType" value="{$deviceType}" />
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=*****"></script>
<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=*****"></script>
<script>
    //微信公众号参数
    wx.config({
        debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId : '{$signPackage.appId}', // 必填,公众号的唯一标识
        timestamp : '{$signPackage.timestamp}', // 必填,生成签名的时间戳
        nonceStr : '{$signPackage.nonceStr}', // 必填,生成签名的随机串
        signature : '{$signPackage.signature}',// 必填,签名,见附录1
        jsApiList : ['getLocation','getLocalImgData']
    });


    //腾讯定位配置
    var geolocation = new qq.maps.Geolocation("*****",'auth_zhao');
    var options = {timeout: 8000,failTipFlag:true};

    /**
     * 获取定位
     */
    function getAddress() {
        var deviceType = $("input[name='deviceType']").val();
        if(deviceType == 'android'){
            getWxAddress();
        }else{
            geolocation.getLocation(getQQAddress, getWxAddress, options);
        }
    }

    /**
     * 腾讯定位
     */
    function getQQAddress(position){
        //alert('腾讯定位');alert(JSON.stringify(position));
        if(position.addr){
            $("input[name='province']").val(position.province);
            $("input[name='city']").val(position.city);
            $("input[name='district']").val(position.district);
            $("input[name='address']").val(position.addr);
            $("input[name='lng']").val(position.lng);
            $("input[name='lat']").val(position.lat);
            //补全市县信息
            if(position.addr.indexOf(position.district) == -1){
                position.addr = position.district + position.addr
            }
            if(position.addr.indexOf(position.city) == -1){
                position.addr = position.city + position.addr
            }
            $("#show_address").html(position.addr);
        }else{
            getWxAddress();
        }
    }

    /**
     * 微信公众号定位【微信公众号api】
     */
    function getWxAddress() {
        wx.getLocation({
            type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
            success: function (res) {
                //alert(JSON.stringify(res));
                var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                var speed = res.speed; // 速度,以米/每秒计
                var accuracy = res.accuracy; // 位置精度


                /************************微信定位GPS坐标转百度坐标START【百度api功能】************************/
                var ggPoint = new BMapGL.Point(longitude,latitude);
                //地图初始化
                var bm = new BMapGL.Map("allmap");
                bm.centerAndZoom(ggPoint, 15);
                bm.addControl(new BMapGL.ZoomControl());
                //添加gps marker和label
                var markergg = new BMapGL.Marker(ggPoint);
                bm.addOverlay(markergg); //添加GPS marker
                var labelgg = new BMapGL.Label("未转换的GPS坐标(错误)",{offset:new BMapGL.Size(10, -10)});
                markergg.setLabel(labelgg); //添加GPS label
                //坐标转换完之后的回调函数
                translateCallback = function (data){
                    var newPoint = JSON.stringify(data);
                    //坐标转换
                    var postData = {
                        newPoint:newPoint
                    };
                    $.ajax({
                        url : "{:U('visit/getNewPoint')}",
                        data : postData,
                        type : "POST",
                        success:function(data){
                            ajaxGetBaiDuAddress(data.longitude,data.latitude)
                        }
                    });
                    return false;
                };
                setTimeout(function(){
                    var convertor = new BMapGL.Convertor();
                    var pointArr = [];
                    pointArr.push(ggPoint);
                    convertor.translate(pointArr, COORDINATES_WGS84, COORDINATES_BD09, translateCallback)
                }, 100);
                /**
                 * 坐标常量说明:
                 * COORDINATES_WGS84 = 1, WGS84坐标
                 * COORDINATES_WGS84_MC = 2, WGS84的平面墨卡托坐标
                 * COORDINATES_GCJ02 = 3,GCJ02坐标
                 * COORDINATES_GCJ02_MC = 4, GCJ02的平面墨卡托坐标
                 * COORDINATES_BD09 = 5, 百度bd09经纬度坐标
                 * COORDINATES_BD09_MC = 6,百度bd09墨卡托坐标
                 * COORDINATES_MAPBAR = 7,mapbar地图坐标
                 * COORDINATES_51 = 8,51地图坐标
                 */
                /************************微信定位GPS坐标转百度坐标END【百度api功能】************************/
            }
        });
    }

    /**
     * 用所定位的经纬度查找所在地省市街道等信息【百度api功能】
     */
    function ajaxGetBaiDuAddress(longitude,latitude) {
        var point = new BMap.Point(longitude,latitude);
        var gc = new BMap.Geocoder();
        gc.getLocation(point, function (rs) {
            var addressData = JSON.stringify(rs);
            var deviceType = $("input[name='deviceType']").val();
            var postData = {
                addressData:addressData,
                deviceType:deviceType,
                serverType:'baidu'
            };
            $.ajax({
                url : "{:U('visit/getAddress')}",
                data : postData,
                type : "POST",
                success:function(data){
                    if(data.status) {
                        $("input[name='province']").val(data.province);
                        $("input[name='city']").val(data.city);
                        $("input[name='district']").val(data.district);
                        $("input[name='address']").val(data.address);
                        $("input[name='lng']").val(data.lng);
                        $("input[name='lat']").val(data.lat);
                        $("#show_address").html(data.address);
                    }else{
                        TenCentApi(latitude,longitude);
                    }
                }
            });
        });
    }
    /**
     * 腾讯位置服务 WebService API
     * 逆地址解析
     * @param lat
     * @param lng
     * 逆地址解析
     */
    function TenCentApi(lat,lng) {
        var postData = {
            lat:lat,
            lng:lng,
        };
        $.ajax({
            url : "{:U('Visit/tenCent')}",
            data : postData,
            type : "POST",
            success:function(data){
                if(data.status) {
                    $("input[name='province']").val(data.province);
                    $("input[name='city']").val(data.city);
                    $("input[name='district']").val(data.district);
                    $("input[name='address']").val(data.address);
                    $("input[name='lng']").val(data.lng);
                    $("input[name='lat']").val(data.lat);
                    $("#show_address").html(data.address);
                }else{
                    layer_alert(data.message);
                }
            }
        });
    }
    getAddress();
</script>
</html>
<?php
namespace Mobile\Controller;
class VisitController extends BaseController {
    /**
     * 拜访日志- 此页面中定位
     */
    public function index(){
        $deviceType = $this->getDeviceType();
        $this->assign('deviceType',$deviceType);
        $this->assign('seo_title','拜访日志');
        $this->display();
    }

    /**
     * 微信获取的GPS定位坐标转为百度坐标
     * 此方法只是为了数据格式转换
     */
    public function getNewPoint(){
        try{
            $param = I('param.');
            $newPoint = $param['newPoint'];
            $res = json_decode(htmlspecialchars_decode($newPoint),true);

            $point = $res['points'][0];
            $lng = $point['lng'];
            $lat = $point['lat'];

            $return['longitude'] = $lng;
            $return['latitude'] = $lat;
            $this->ajaxReturn($return);
        }catch (\Exception $e){
            $errorMsg = $e->getCode() == 50001 ? $e->getMessage() : '请求失败';
            $return['status'] = 0;
            $return['message'] = $errorMsg;
            $this->ajaxReturn($return);
        }
    }

    /**
     * web端经纬度解析地址数据格式化
     * 此方法只是为了数据格式转换
     */
    public function getAddress(){
        try{
            $param = I('param.');
            $addressData = $param['addressData'];
            $res = json_decode(htmlspecialchars_decode($addressData),true);

            $serverType = $param['serverType'] == 'baidu' ? 'baidu_' : 'tencent_';
            if($param['deviceType'] == 'android'){
                file_put_contents('map_android/'.$serverType.'map_android_'.$this->UID.'.txt',var_export($res,true));
            }else{
                file_put_contents('map_ios/'.$serverType.'map_ios_'.$this->UID.'.txt',var_export($res,true));
            }

            if($res['type'] == 'GEO_INFO'){//腾讯位置服务
                $point = $res['detail']['location'];
                $lng = $point['lng'];
                $lat = $point['lat'];

                $addressComponents = $res['detail']['addressComponents'];
                $province = $addressComponents['province'];
                $city = $addressComponents['city'];
                $district = $addressComponents['district'];

                $address = $res['detail']['address'];
            }else{//百度位置服务
                $point = $res['point'];
                $lng = $point['lng'];
                $lat = $point['lat'];

                $addressComponents = $res['addressComponents'];
                $province = $addressComponents['province'];
                $city = $addressComponents['city'];
                $district = $addressComponents['district'];

                $surroundingPois = $res['surroundingPois'];
                $address = $surroundingPois[0]['address'];
                if(!$address){
                    throw new \Exception('百度未获取到详细位置',50001);
                }
                //补全地址中的市县信息
                if(strpos($address,$district) === false){
                    $address = $district.$address;
                }
                if(strpos($address,$city) === false){
                    $address = $city.$address;
                }
            }

            //统一数据返回
            $return['status'] = 1;
            $return['province'] = $province;
            $return['city'] = $city;
            $return['district'] = $district;
            $return['lng'] = $lng;
            $return['lat'] = $lat;
            $return['address'] = $address;
            $this->ajaxReturn($return);
        }catch (\Exception $e){
            $errorMsg = $e->getCode() == 50001 ? $e->getMessage() : '请求失败';
            $return['status'] = 0;
            $return['message'] = $errorMsg;
            $this->ajaxReturn($return);
        }
    }

    /**
     * 腾讯位置服务 WebService API
     * 逆地址解析
     * https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder#2
     */
    public function tenCent(){
        $ApiUrl = 'https://apis.map.qq.com/ws/geocoder/v1/?';
        $key = '*****';
        $param = I('param.');

        //经纬度(GCJ02坐标系),格式:location=lat<纬度>,lng<经度>
        $location = $param['lat'].','.$param['lng'];
        //是否返回周边地点(POI)列表,可选值:0 不返回(默认) 1 返回
        $get_poi = 1;

        //用于控制POI列表
        $poi_options = 'address_format=short;radius=1000;page_size=20;page_index=1;policy=2';
        $strIng = 'location='.$location.'&key='.$key.'&get_poi='.$get_poi.'&poi_options='.$poi_options;

        $requestUrl = $ApiUrl.$strIng;
        $res = curl_get($requestUrl);
        $res = json_decode($res,true);
        file_put_contents('mapData/map_'.$this->UID.'.txt',var_export($res,true));
        if($res['status'] == 0){
            $province = $res['result']['address_component']['province'];
            $city = $res['result']['address_component']['city'];
            $district = $res['result']['address_component']['district'];
            $address = $res['result']['formatted_addresses']['recommend'];
            $address = $address ? $address : $res['result']['address'];
            //补全地址中的市县信息
            if(strpos($address,$district) === false){
                $address = $district.$address;
            }
            if(strpos($address,$city) === false){
                $address = $city.$address;
            }

            //统一数据返回
            $return['status'] = 1;
            $return['province'] = $province;
            $return['city'] = $city;
            $return['district'] = $district;
            $return['lng'] = $param['lng'];
            $return['lat'] = $param['lat'];
            $return['address'] = $address;
            $this->ajaxReturn($return);
        }else{
            //统一数据返回
            $return['status'] = 0;
            $this->ajaxReturn($return);
        }
    }


    /**
     * 判断安卓IOS
     */
    function getDeviceType(){
        $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
        $type = 'other';
        if(strpos($agent, 'iphone') || strpos($agent, 'ipad')){
            $type = 'ios';
        }else if(strpos($agent, 'android')) {
            $type = 'android';
        }
        return $type;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨四点的_LA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值