页面初始化时,加载百度地图JS,加载实现后执行回调函数开始定位,定位胜利后初始化地图对象,计算导航路线,而后展现。

反对IP定位须要在页面<head>标签引入的JS:<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
vue单文件组件:  mounted () {    this.loadBaiduMapAsync()  },  methods: {    /**     * 初始化百度地图并定位用户以后地位     */    loadBaiduMapAsync() {      // 加载百度地图js      let script = document.createElement('script')      script.src = 'https://api.map.baidu.com/api?v=2.0&ak=申请的key&callback=initMap'      document.body.appendChild(script)      script.onload = (data) => { // 地图js加载胜利        console.log('百度地图JS加载胜利,开始定位')        window.initMap = this.startLocate      }      script.onerror = (data) => { // 地图js加载失败        console.log('百度地图JS加载失败,无奈定位')        common.showConfirm('舒适提醒','地图加载出错,请重试!', () => { this.loadBaiduMapAsync() }, null, '从新加载')      }    },    /**     * 获取用户以后定位 -- APP端端     */    startLocate() {      if (this.isApp) { // APP端          this.getPositionByAPP().then(point => {            console.log('APP定位胜利--地位:', point);            this.currPos = point            this.showMapAndGuide() // 展现地图及导航          }).catch(msg => {            this.status = 0            console.log(msg);            // common.showToast(msg, CONSTANTS.ERR_TOAST_TIME)            this.showDestination() // 展现地图和目的地          })      } else { // 浏览器端        this.getPositionByH5().then(point => {          console.log('浏览器定位胜利--地位:', point);          this.currPos = point          this.showMapAndGuide() // 展现地图及导航        }).catch(msg => {          this.status = 0          console.log(msg);          // common.showToast(msg, CONSTANTS.ERR_TOAST_TIME)          this.showDestination() // 展现地图和目的地        })      }    },    /**     * 获取用户以后定位 -- APP端端     */    getPositionByAPP() {      return new Promise(function(resolve, reject) {        const cb = (err, data) => {          if (err) {            if (err.code === '001') { // 未开启定位服务              reject('请查看您的定位服务是否开启')            } else if (err.code === '002') { // 未受权利用拜访定位性能              reject('请受权APP拜访您的地位信息')            } else {              console.warn(err);              reject('定位失败,地位信息不可用')            }          } else { // app定位胜利            let point = {              longitude: data.Longitude,              latitude: data.Latitude            }            if (this.isiOS) { // IOS坐标转换              console.log('IOS坐标转换')              const convertor = new BMap.Convertor()              convertor.translate([new BMap.Point(point.longitude, point.latitude)], 1, 5, res => { // 经纬度转换,否则会定位不准                if (res.status === 0) {                  point.latitude = res.points[0].lat                  point.longitude = res.points[0].lng                  resolve(point)                }              })            } else { // Andorid坐标              resolve(point)            }          }        }        app.getCurrentLocation(cb)      })    },    /**     * 获取用户以后定位 -- 浏览器端     */    getPositionByH5() {      return new Promise(function(resolve, reject) {        const locateByIP = function () {          if (window.returnCitySN && window.returnCitySN.cip) { // 依据IP,通过百度api取得经纬度            console.log('returnCitySN:', window.returnCitySN);            $.getJSON("https://api.map.baidu.com/location/ip?callback=?", {              'ak' : '申请的百度地图key',              'coor' : 'bd09ll', // 百度经纬度坐标              'ip' : window.returnCitySN.cip // {cip: "116.77.145.35", cid: "440300", cname: "广东省深圳市"}            }, function(data) {              if (data && data.content) {                resolve({                  longitude: data.content.point.x,                  latitude: data.content.point.y                })              } else {                reject('定位失败,地位信息不可用')              }            })          }        }        if (navigator.geolocation) {          navigator.geolocation.getCurrentPosition(function(pos) {            resolve({              longitude: pos.coords.longitude,              latitude: pos.coords.latitude            })          }, function(error) {            let msg = ''            switch(error.code) {                case error.PERMISSION_DENIED:                    msg="用户回绝对获取地理位置的申请。"                    break;                case error.POSITION_UNAVAILABLE:                    msg="地位信息是不可用的。"                    break;                case error.TIMEOUT:                    msg="申请用户地理位置超时。"                    break;                case error.UNKNOWN_ERROR:                    msg="未知谬误。"                    break;            }            reject(msg)            // console.warn('浏览器端(geolocation定位失败)-依据IP定位');            // locateByIP()          }, {            enableHighAccuracy: true, // 批示浏览器获取高精度的地位,默认为false            timeout: 5000, // 指定获取地理位置的超时工夫,默认不限时,单位为毫秒            maximumAge: 2000 // 最长有效期,在反复获取地理位置时,此参数指定多久再次获取地位。          })        } else {          reject('定位失败,以后浏览器不反对定位!')          // console.warn('浏览器端(geolocation定位不反对)-依据IP定位');          // locateByIP()        }      })    },    /**     * 展现指标地位     */    showDestination() {      if (Number.isNaN(this.lng)|| Number.isNaN(this.lat)) {        common.showAlert('地址参数谬误!', CONSTANTS.ERR_TOAST_TIME)        return      }      // 展现地图      const map = new BMap.Map("allmap")      const endPos = new BMap.Point(this.urlParams.lng, this.urlParams.lat)      // 展现指标地位      this.status = 2      map.centerAndZoom(endPos, 16)      map.addOverlay(new BMap.Marker(endPos))      map.enableScrollWheelZoom(true)      // 在右上角增加缩放控件      const zoom = new BMap.NavigationControl({        anchor: BMAP_ANCHOR_TOP_RIGHT,        type: BMAP_NAVIGATION_CONTROL_LARGE,        enableGeolocation: true      })      map.addControl(zoom)    },    /**     * 展现地图并导航     */    showMapAndGuide() {      if (Number.isNaN(this.lng)|| Number.isNaN(this.lat)) {        common.showAlert('页面地址参数谬误!', CONSTANTS.ERR_TOAST_TIME)        return      }      // 展现地图      const map = new BMap.Map("allmap")      const startPos = new BMap.Point(this.currPos.longitude, this.currPos.latitude) // {lng: 114.02597366, lat: 22.54605355}      const endPos = new BMap.Point(this.lng, this.lat)      // 逆地址解析用户以后所在地址      const geoc = new BMap.Geocoder()      geoc.getLocation(startPos, res => {        const currCity = res.addressComponents.city // 用户以后定位所在城市        console.log(`定位城市:${currCity} -- 球场地址:${this.address}`);        if (this.cityName && this.cityName.indexOf(currCity) > -1) { // 用户和指标球场在同一城市          this.status = 1          map.centerAndZoom(startPos, 16)          this.driveRoute(map, startPos, endPos, true)        } else { // 用户和指标球场不在同一城市          this.status = 2          map.centerAndZoom(endPos, 16)          map.addOverlay(new BMap.Marker(endPos))          // this.driveRoute(map, startPos, endPos, true)        }      })      map.enableScrollWheelZoom(true)      // 在右上角增加缩放控件      const zoom = new BMap.NavigationControl({        anchor: BMAP_ANCHOR_TOP_RIGHT,        type: BMAP_NAVIGATION_CONTROL_LARGE,        enableGeolocation: true      })      map.addControl(zoom)    },    /**     * 计算驾驶路线     * @param startPos BMap.Point 终点地位     * @param endPos BMap.Point 起点地位     * @param show Boolean     */    driveRoute(map, startPos, endPos, show) {      const DRIVE = new BMap.DrivingRoute(map, {        renderOptions: {          map: map,          autoViewport: show,        },        onSearchComplete: res => {          let plan = res.getPlan(0)          console.warn('查问驾车计划后果:', plan);          if (plan) {            this.driveDistance = plan.getDistance(true)            this.driveTime = plan.getDuration(true)          }        },        onMarkersSet: routes => {          // map.removeOverlay(routes[0].marker)          // map.removeOverlay(routes[1].marker)          // 解决百度地图起始点图标重叠问题          const eles = $('.BMap_Marker img')          if (eles.length > 0) {            eles.forEach(v => {              v.style.maxWidth = 'none'              v.style.width = '94px'            })          }        }      })      DRIVE.search(startPos, endPos)    }  }}</script>