vue实现百度地图H5 标注平移动画实现

index.html中引入

  <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=秘钥"></script>
    <script type="text/javascript"  src="http://mapopen.bj.bcebos.com/github/BMapGLLib/TrackAnimation/src/TrackAnimation.min.js"></script>

地图页面 template

  <div id="allmap" ></div>
    <div class="btn_box">
      <van-button id="startBtn" type="warning" plain size="small" :disabled='canClick'>开始</van-button>
    </div>

绘制地图的函数

import { BMPGL } from "@/bmpgl.js"

  //绘制地图
    drawMap(x,y){
        let ele = document.getElementById('allmap')
      let w = window.innerWidth
      let h = window.innerHeight
      ele.style.width = w+'px'
      ele.style.height = h+'px'
     BMPGL().then(BMPGL=>{
        //标注初始坐标
        let markerPoint = {'lng': 106.43382448112298, 'lat': 29.529910212258855}
        //目标坐标数组
        let markerTargetArr = [
            {'lng': 106.43382448112298, 'lat': 29.529910212258855},
            {'lng': 106.49246586479498, 'lat': 29.549015320619937},
             {'lng': 106.50022722439861, 'lat': 29.61108172249397},
            {'lng': 106.45193432019816, 'lat': 29.614849695100908},
            {'lng': 106.43784888980636, 'lat': 29.57540453450064},
            {'lng': 106.47384187988962, 'lat': 29.521054322731263},
            {'lng': 106.5195270539051, 'lat': 29.531557797747364},
        ]
        var map = new BMap.Map("allmap");
      map.centerAndZoom(new BMap.Point(x,y), 13);
      map.enableScrollWheelZoom(true);
      map.setMapStyleV2({styleId: '6c46640ce9ae337e7fbfb5e7b495ef25'});
      let deviceSize = new BMap.Size(34, 25)
      //图片可以用网络格式  这里是通过import myicons from '../static/image/car.png' 引入的
      var myIcon = new BMap.Icon(myicons,deviceSize,{  imageSize: deviceSize});
        // 初始化
        //创建标注
        let p  = new BMap.Point(markerPoint.lng,markerPoint.lat);
        let m  = new BMap.Marker(p,{icon:myIcon});
        map.addOverlay(m)
        let startBtn = document.getElementById('startBtn')
         // 开始
        startBtn.addEventListener('click',function(){
            let point = new BMap.Point(markerTargetArr[0].lng,markerTargetArr[0].lat)
                _move(p, point,m);
                p = point
        })
    let  checkBtn = document.getElementById('checkBtn')
    checkBtn.addEventListener('click',()=>{
        map.centerAndZoom(new BMap.Point( 106.5195270539051,29.531557797747364),13)
    })
// 绘制路线
let pointArr=[]
markerTargetArr.forEach(ele=>{
  pointArr.push(new BMap.Point(ele.lng,ele.lat))
})
    var polyline = new BMap.Polyline(pointArr, {strokeColor:"lightgreen", strokeWeight:5, strokeOpacity:1,setStrokeStyle:'dashed'});
    map.addOverlay(polyline);
        window._move = (initPos,targetPos, nowMarker)=>{
            var me = this,
                //当前的帧数
                currentCount = 0,
                //步长,米/秒
                timer = 10,
                step = 4000 / (1000 / timer),
                //初始坐标
                init_pos = map.getMapType().getProjection().lngLatToPoint(initPos),
                //获取结束点的(x,y)坐标
                target_pos = map.getMapType().getProjection().lngLatToPoint(targetPos),
                //当前移动断数
                moveNumber = 0,
                //开始坐标值
                staratCoord = initPos,
                //中间段坐标值
                centerCoord = targetPos,
                //总的步长
                count = Math.round(_getDistance(init_pos, target_pos) / step);
                //两点之间匀速移动
                me._intervalFlag = setInterval(function() {
                //两点之间当前帧数大于总帧数的时候,则说明已经完成移动
                    if (currentCount >= count) {
                        moveNumber+=1;
                        if(moveNumber==markerTargetArr.length){
                            clearInterval(me._intervalFlag);
                            return;
                        }
                        currentCount = 0,
                        init_pos = target_pos;
                        target_pos = map.getMapType().getProjection().lngLatToPoint(new BMap.Point(markerTargetArr[moveNumber].lng,markerTargetArr[moveNumber].lat));
                        count = Math.round(_getDistance(init_pos, target_pos) / step);
                        staratCoord = centerCoord
                        centerCoord = new BMap.Point(markerTargetArr[moveNumber].lng,markerTargetArr[moveNumber].lat)
                    }else {
                            currentCount++;
                            var x = tweenLinear(init_pos.x, target_pos.x, currentCount, count),
                                y = tweenLinear(init_pos.y, target_pos.y, currentCount, count),
                                pos = map.getMapType().getProjection().pointToLngLat(new BMap.Pixel(x, y));
                            if(currentCount == 1){
                                var proPos = null;
                                setRotation(proPos,staratCoord,centerCoord, nowMarker);
                            }
                            //正在移动
                            nowMarker.setPosition(pos);
                            //设置自定义overlay的位置
                            // me._setInfoWin(pos);
                        }
                },timer);
        }
    
        /**
         * 计算两点间的距离
         * @param {Point} poi 经纬度坐标A点.
         * @param {Point} poi 经纬度坐标B点.
         * @return 无返回值.
         */
        window._getDistance= function(pxA, pxB) {
            return Math.sqrt(Math.pow(pxA.x - pxB.x, 2) + Math.pow(pxA.y - pxB.y, 2));
        };
    
        /**
        *在每个点的真实步骤中设置小车转动的角度
        */
        window.setRotation=(prePos,curPos,targetPos, nowMarker)=>{
            var me = this;
            var deg = 0;
            //start!
            curPos =  map.pointToPixel(curPos);
            targetPos =  map.pointToPixel(targetPos);   
            if(targetPos.x != curPos.x){
                    var tan = (targetPos.y - curPos.y)/(targetPos.x - curPos.x),
                    atan  = Math.atan(tan);
                    deg = atan*360/(2*Math.PI);
                    //degree  correction;
                    if(targetPos.x < curPos.x){
                        deg = -deg + 90 + 90;
                    } else {
                        deg = -deg;
                    }
                    nowMarker.setRotation(-deg);   
            }else {
                    var disy = targetPos.y- curPos.y ;
                    var bias = 0;
                    if(disy > 0)
                        bias=-1
                    else
                        bias = 1
                    nowMarker.setRotation(-bias * 90);  
            }
            return;
        }
        // 缓动效果 : 初始坐标,目标坐标,当前的步长,总的步长
        window.tweenLinear=function(initPos, targetPos, currentCount, count) {
            var b = initPos, c = targetPos - initPos, t = currentCount,
                d = count;
            return c * t / d + b;
        }
     })
    },

最后在周期函数中调用即可 绘制地图的函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现百度地图坐标反查,可以使用百度地图 JavaScript API。具体实现步骤如下: 1. 在 HTML 文件中引入百度地图 JavaScript API: ```html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script> ``` 其中,您需要将“您的密钥”替换为您在百度地图开放平台申请的密钥。 2. 创建地图容器: ```html <div id="map"></div> ``` 在 JavaScript 文件中,可以使用以下代码创建地图: ```javascript var map = new BMap.Map("map"); // 创建地图实例 var point = new BMap.Point(116.404, 39.915); // 创建点坐标 map.centerAndZoom(point, 15); // 初始化地图,设置中心点和缩放级别 ``` 3. 添加地图控件: ```javascript map.addControl(new BMap.NavigationControl()); // 添加平移缩放控件 map.addControl(new BMap.ScaleControl()); // 添加比例尺控件 map.addControl(new BMap.OverviewMapControl()); // 添加缩略地图控件 map.addControl(new BMap.MapTypeControl()); // 添加地图类型控件 ``` 4. 实现坐标反查功能: ```javascript var geoc = new BMap.Geocoder(); // 创建地址解析器实例 map.addEventListener("click", function(e) { var pt = e.point; // 获取点击的地理坐标 geoc.getLocation(pt, function(rs) { var addComp = rs.addressComponents; // 获取地址组成部分 var address = addComp.province + addComp.city + addComp.district + addComp.street + addComp.streetNumber; // 拼接地址 alert(address); // 弹出反查结果 }); }); ``` 上述代码中,通过添加地图的 click 事件监听器,获取用户点击的地理坐标,然后调用地址解析器实例的 getLocation 方法获取该坐标对应的地址信息,并拼接成完整的地址字符串,最后弹出反查结果。 以上就是实现百度地图坐标反查的基本步骤。需要注意的是,使用百度地图 JavaScript API 需要申请密钥,并且需要在使用之前引入 API 文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

a small tree

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

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

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

打赏作者

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

抵扣说明:

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

余额充值