美文网首页
react 定位实现 基于百度地图

react 定位实现 基于百度地图

作者: 不不作为 | 来源:发表于2020-01-13 10:57 被阅读0次

    一:第一种获取位置信息的方法

    第一步: 需要申请百度地图AK码 (进入百度地图开放平台根据步骤申请即可)
    第二部:在项目html根目录中加入下面代码
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=刚申请的码" ></script>
    
    第三部:挂载到组件中:
     componentDidMount() {
            const _this=this;
            var BMap = window.BMap;
            var geoc = new BMap.Geocoder();
            var geolocation = new BMap.Geolocation();
            geolocation.getCurrentPosition(function (r) {
                geoc.getLocation(r.point, function (rs) {
                    console.log(rs)   //具体信息可以打印出来看一下,根据需求取值     经纬度,城市,街道等等
                    var addComp = rs.addressComponents;
                    let cityName = addComp.city;
                    _this.setState({
                        cityName:cityName,  //城市名
                    })
                });
            });
        }  
        //这种方法比较简单,但返回数据的经纬度有误差,城市信息只能定位到市一级
    

    二:如何调用百度api进行导航

    点击跳转到百度页面
     window.location.href = "http://api.map.baidu.com/marker?location=" + lat + "," + lng + "&title=" + titleName + "&content=" +content+ "&output=html"
    lat:纬度坐标       //用户起始位置
    lng:经度坐标      //用户起始位置
    titleName:定位位置显示的标题,一般为定位地点的名称   //用户目标位置
    content:内容介绍,可写地点地址或者简介等。                //用户目标位置
    
    备注:此导航方式只导航到路线,如果用户需要具体的语音指导路线功能,需要下载百度地图,而且封装app时需要安卓协助。
    

    三:GPRS定位

    引入百度aip
     <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=AK码" ></script>
    //注意,此处http一定要带s   后台配置的服务器网站地址也要带s
     //
    
    此方法运用于手机端, 有两种方式,如果gprs定位失败,还可以用百度api获取位置 具体代码可以看map.html
    app应用代码可以参考indexPage.js

    map.html:

    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
        </style>
        <!--script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script-->
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ak密钥" ></script>
        <title>浏览器定位</title>
    </head>
    <body>
        <div id="allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
        var type3 = [550, 30];//设定  google  gps格式转换
        var transTypesParam = "";
    
        function getLocation(){ 
            var options = {
                      enableHighAccuracy: true,
                      timeout: 5000,
                      maximumAge: 0
                    };
            if (navigator.geolocation){ //用浏览器获取坐标地址
                navigator.geolocation.getCurrentPosition(showPosition,showError,options); 
            }else{ 
                alert("浏览器不支持地理定位。"); 
            } 
        } 
    
        //获取浏览器GPS成功
        function showPosition(position){ 
            var x = position.coords.longitude; //经度 
            var y = position.coords.latitude;//纬度 
            
            transTypesParam = getTransType(position.coords.accuracy);//该方法很重要,用来判断手机定位格式,方法在下方
        //     if($("#testInfo") != null && $("#testInfo").length >0) {
        //      $("#testInfo").html("accuracy : " + position.coords.accuracy +  "x : " + x + "  y : " + y);
        //     }
            console.log("返回数据的信息=======",position.coords.accuracy);
            var ggPoint = new BMap.Point(x,y);
            showMap(ggPoint, true);//显示地图坐标
        } 
    
    
        //获取失败,失败后用百度地图自带的方法,但是定位会不准
        function showError(error){
            var geolocation = new BMap.Geolocation();
            geolocation.getCurrentPosition(function(r){
                    if(this.getStatus() == BMAP_STATUS_SUCCESS){
                        showMap(r.point, false);
                    }
                    else {
                        alert('定位失败1:'+this.getStatus());
                    }        
                },{enableHighAccuracy: true})
            
                switch(error.code){
                    case error.PERMISSION_DENIED:
                        alert("用户拒绝了地理定位请求");
                        //$("#testInfo").html(error.code + "User denied the request for Geolocation.");
                      break;
                    case error.POSITION_UNAVAILABLE:
                        alert("位置信息不可用");
                        //$("#testInfo").html(error.code + "Location information is unavailable.");
                      break;
                    case error.TIMEOUT:
                        alert("获取用户位置的请求超时");
                        //$("#testInfo").html(error.code + "The request to get user location timed out.");
                      break;
                    case error.UNKNOWN_ERROR:
                        alert("发生未知错误");
                        //$("#testInfo").html(error.code + "An unknown error occurred.");
                      break;
                }
                
        } 
        // 用来判断手机定位格式
        function getTransType(accuracy) {
            if(window.localStorage){
                var transType = localStorage.getItem("xdlcfwapp_transType");
                if(transType != null && transType != "") {
                    return transType;
                } 
            }
            
            for(var i=0; i<type3.length ; i++) {
                if(type3[i] == accuracy) {
                    localStorage.setItem("xdlcfwapp_transType", 3);
                    return 3;
                }
            }
            localStorage.setItem("xdlcfwapp_transType", 1);
            return 1;
        };
    
        var bm = null;
        function showMap(ggPoint,isTrans) {
            // 百度地图API功能
            bm = new BMap.Map("allmap");
            bm.centerAndZoom(ggPoint, 15);
            bm.enableScrollWheelZoom(true);
            if(isTrans) {
                bm.addControl(new BMap.NavigationControl());
    
                //坐标转换完之后的回调函数
                translateCallback = function (data){
                  if(data.status === 0) {
                        console.log("经纬度++++11111++:",data.points[0]);
                        //showPositionIcon(data.points[0]);
                        //queryMarkers();
                  }
                }
    
                setTimeout(function(){
                    var convertor = new BMap.Convertor();
                    var pointArr = [];
                    pointArr.push(ggPoint);
                    convertor.translate(pointArr, transTypesParam, 5, translateCallback)
                }, 1000);
            } else {
                console.log("经纬度22222:",ggPoint);
                //showPositionIcon(ggPoint);
                //queryMarkers();
            }
        }
    
        getLocation();
    
    </script>
    
    

    indexPage.js

    import React, { Component } from 'react';
    import Foot from "../../components/foot"
    import { Button, Toast, WingBlank, Card, Modal, Carousel, NoticeBar, WhiteSpace, Icon } from 'antd-mobile';
    import { connect } from 'dva';
    import { APIHost, loggedIn } from "../../utils/fetch"
    // import { routerRedux } from 'dva/router';
    import style from "../allstyle/indexPage.less";
    import head from '../../assets/img/head.png';
    import *as home from "../../services/home";
    
    var lat = 0;
    var lng = 0;
    
    class IndexPage extends Component {
        constructor(props) {
            super(props);
            this.state = {
                lat: '',//自身纬度
                lng: '',//自身经度
            }
        }
    
    
        componentDidMount(){
            var type3 = [550, 30];//设定  google  gps格式转换
            var transTypesParam = "";
            const _this = this;
            function getLocation() {
                var options = {
                    enableHighAccuracy: true,
                    timeout: 5000,
                    maximumAge: 0
                };
                if (navigator.geolocation) { //用浏览器获取坐标地址
                    navigator.geolocation.getCurrentPosition(showPosition, showError, options);
                } else {
                    alert("浏览器不支持地理定位。");
                }
            }
    
            //获取浏览器GPS成功
            function showPosition(position) {
                var x = position.coords.longitude; //经度 
                var y = position.coords.latitude;//纬度 
    
                transTypesParam = getTransType(position.coords.accuracy);//该方法很重要,用来判断手机定位格式,方法在下方
                var BMap = window.BMap;
                var ggPoint = new BMap.Point(x, y);
                showMap(ggPoint, true);//显示地图坐标
            }
    
    
            //获取失败,失败后用百度地图自带的方法,但是定位会不准
            function showError(error) {
                var BMap = window.BMap;
                var geolocation = new BMap.Geolocation();
                geolocation.getCurrentPosition(function (r) {
                    if (this.getStatus() == 'BMAP_STATUS_SUCCESS') {
                        showMap(r.point, false);
                    }
                    else {
                        //向后台传值经纬度  此位GPRS定位失败后走的方法,如果GPRS定位成功,这不走此方法
                         home.index({ longitude: r.longitude, latitude: r.latitude }).then((result) => {
                            if (result.code === 1) {
                                _this.setState({
                                    data: result.data,
                                })
                            } else { Toast.offline(result.msg, 1) }
                        })  
                        alert('定位失败1:' + this.getStatus());
                    }
                }, { enableHighAccuracy: true })
    
                switch (error.code) {
                    case error.PERMISSION_DENIED:
                        alert("用户拒绝了地理定位请求");
                        //$("#testInfo").html(error.code + "User denied the request for Geolocation.");
                        break;
                    case error.POSITION_UNAVAILABLE:
                        alert("位置信息不可用");
                        //$("#testInfo").html(error.code + "Location information is unavailable.");
                        break;
                    case error.TIMEOUT:
                        alert("获取用户位置的请求超时");
                        //$("#testInfo").html(error.code + "The request to get user location timed out.");
                        break;
                    case error.UNKNOWN_ERROR:
                        alert("发生未知错误");
                        //$("#testInfo").html(error.code + "An unknown error occurred.");
                        break;
                }
    
            }
            // 用来判断手机定位格式
            function getTransType(accuracy) {
                if (window.localStorage) {
                    var transType = localStorage.getItem("xdlcfwapp_transType");
                    if (transType != null && transType != "") {
                        return transType;
                    }
                }
    
                for (var i = 0; i < type3.length; i++) {
                    if (type3[i] == accuracy) {
                        localStorage.setItem("xdlcfwapp_transType", 3);
                        return 3;
                    }
                }
                localStorage.setItem("xdlcfwapp_transType", 1);
                return 1;
            };
    
            var bm = null;
            function showMap(ggPoint, isTrans) {
                // 百度地图API功能
                var BMap = window.BMap;
                bm = new BMap.Map("allmap");
                bm.centerAndZoom(ggPoint, 15);
                bm.enableScrollWheelZoom(true);
                if (isTrans) {
                    bm.addControl(new BMap.NavigationControl());
                    //坐标转换完之后的回调函数
                    var translateCallback = function (data) {
                        if (data.status === 0) {
                            alert(JSON.stringify(data));//弹出的数据是一个对象,需要取值经纬度
                            lng = data.points && data.points.length > 0 ? data.points[0].lng : '';
                            lat = data.points && data.points.length > 0 ? data.points[0].lat : '';
                            alert(JSON.stringify(data.points[0].lng));
                            alert(JSON.stringify(data.points[0].lat));
                            //向后台传值经纬度  如果GPRS定位成功,程序走的此方法
                            home.index({ longitude: lng, latitude: lat }).then((result) => {
                                if (result.code === 1) {
                                    _this.setState({
                                        data: result.data,
                                    })
                                } else { Toast.offline(result.msg, 1) }
                            })
                        } else {
                            //  alert("经纬度:333333333====="+transTypesParam);
                        }
                    }
                    setTimeout(function () {
                        var convertor = new BMap.Convertor();
                        var pointArr = [];
                        pointArr.push(ggPoint);
                        convertor.translate(pointArr, transTypesParam, 5, translateCallback);
                    }, 1000)
                } else {
                    alert("经纬度:" + ggPoint.lng + "," + ggPoint.lat);
                }
            }
            getLocation();
        }
        render() {
            const { history } = this.props;
            const { cityName, data, gg, lat, lng, img } = this.state;
            const data_props = {
                history,
                title: 'home',
            }
            return (
                <div className={style.all}>
                    <div id="allmap" style={{ width: 0, height: 0 }}></div>
                </div>
            );
        }
    }
    
    export default IndexPage;
    

    此文章为同事分享,出处不明,如若侵权,请通知本人删除

    相关文章

      网友评论

          本文标题:react 定位实现 基于百度地图

          本文链接:https://www.haomeiwen.com/subject/inygactx.html