百度地图 车辆行驶轨迹,使用聚合点 实现轨迹展示,聚合点样式自定义和点击事件,图片旋转方向,

一,话不多说,先看效果
        1.1 首先看到的效果是聚合后的点位,并且支持点击查看车辆当时的情况(聚合点样式)

        1.2 可以拖动放大地图。其实就是改变了展示级别,同时也支持点击查看详情(聚合点样式)

     1.3 当放到 最小颗粒 展示的才是(标点样式)

1.4 最后看个完整的样子,下面还有一个 所有点位的列表集合

二,用到的内容

        2.0.思路:聚合点的时候,获取某个聚合点下面的markers。

        然后获取第一个marker 里面的        内容(坐标,图片旋转角度,车牌号 等信息)用来给聚合点做样式的时候使用。

灵感 参考了这篇文章(万分感谢):百度地图中自定义点聚合实现_百度地图 聚合图层 标注_想吃变态辣条的博客-CSDN博客

 2.1 marker可以自定义传参数

        marker.carNum=“苏E2345”;  后面直接 marker.carNum 就可以取到车牌号

2.2.Vue百度地图maker标注的添加和删除()

    const lng = parseFloat(e.longitude)
    const lat = parseFloat(e.latitude)
    const point = new BMap.Point(lng, lat)
    const marker = new BMap.Marker(point)  
    map.addOverlay(marker)
    marker.setPosition(point)//添加标注
    //删除标注文档上注明了是removeOverlay()这个方法,具体使用如下
    marker.id = data[0].id//给marker添加id对应数组里的id(非必要不要赋值id,不要这么写)
    const allOverlays = map.getOverlays()//返回地图上所有的覆盖物
    //循环找到数组里面id和返回覆盖物相同的
    for (let i = 0; i < allOverlays.length; i++) {
      if (allOverlays[i].id == data[0].id) { //data[0].id即是你要删除标注的id
        map.removeOverlay(allOverlays[i])
      }
    }

2.3用到的api 

百度地图JSAPI 3.0类参考

百度地图JSAPI WebGL v1.0类参考

jspopularGL | 百度地图API SDK

地图 JS API | 百度地图API SDK

2.4 特别的方法
var myIcon = new BMap.Icon('https://y.com/yzz/9.png', new BMap.Size(15, 18));
var point = new BMap.Point(p.longitude,p.latitude);
//打点并标记旋转角度
var _marker = new BMap.Marker(point, {icon: myIcon,rotation:p.angle});
// 拿到所有的聚合点
//markerClusterer中的 _clusters是一个数组,包含了可视范围的所有聚合点
var cluster = markerClusterer._clusters;

三,代码展示

3.1 代码写的有点乱望见谅
3.2 引用的js
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=iOcuXeUHMaif7qM9szGq7xrHGiztE3d6"></script>
    <!-- 路书功能 -->
    <script type="text/javascript" src="https://api.map.baidu.com/library/LuShu/1.2/src/LuShu_min.js"></script>
    <!-- 聚合点 -->
    <script type="text/javascript" src="//api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script>
    <script type="text/javascript" src="//api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>
3.3 业务代码
<script th:inline="javascript">
         var prefix = ctx + "business/car";
         var map = new BMap.Map("allmap");    // 创建Map实例
         map.centerAndZoom(new BMap.Point(121.01230133514115,31.270734366088245), 14);  // 初始化地图,设置中心点坐标和地图级别
         map.enableScrollWheelZoom(true);
         var markerClusterer;

        function insterGPS(){
            $.modal.loading("正在加载数据,请稍候...");
            //清除打点
            map.centerAndZoom(new BMap.Point(121.01230133514115,31.270734366088245), 14);
            var table= document.getElementById("test_tbody");
            var innerHTML= "";
            var startTime=$('#startTime').val();
            var endTime=$('#endTime').val();
            var carId=$('#carId').val();
            console.log("开始车辆-->"+carId);
            $.ajax({
                url: prefix + '/single/trajectory/list',
                type: "post",
                dataType: "json",
                data: { "startTime":startTime,"endTime":endTime,"carId":carId},
                success: function (result) {
                    if (result.code == 0) {
                        var data=result.data;
                        if(data){
                            //循环车辆轨迹
                             var veh = data[0];//获取LIST里面的对象
                            if(null === veh.positionX){
                                map.centerAndZoom(new BMap.Point(121.01230133514115,31.270734366088245), 14);
                                map.clearOverlays();
                                table.innerHTML="";
                            }else{
                                map = new BMap.Map("allmap");    // 创建Map实例
                                map.centerAndZoom(new BMap.Point(veh.positionX,veh.positionY), 14);  // 初始化地图,设置中心点坐标和地图级别
                                map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
                                //坐标集合
                                var gpsList=veh.eventGpsInfoList;

                                if(gpsList!=null){
                                    var paths = [];
                                    var markers = [];
                                    for(var i = 0;i<gpsList.length;i++) {  //循环轨迹
                                        var p = gpsList[i];
                                        // console.log(p);
                                        //创建折线点
                                        var point = new BMap.Point(p.longitude,p.latitude);
                                        paths.push(point);
                                        // console.log(p.longitude+"||"+p.latitude);
                                        // 创建点标记
                                        var sContent =
                                            "<div class='baiduPopBox' style='height: 30px; color: rgb(255, 255, 255);background-color: rgb(64, 150, 209);padding: 5px;width: 440px;'>"
                                            + p.createTime
                                            + "</div>"
                                            + "<table class='boxTop' style='width: 440px;'>"
                                            +"<tr>"
                                            +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 车牌号" +"</td>"
                                            +"<td style='width: 150px;'>"+veh.carNum+"</td>"
                                            +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 速度" +"</td>"
                                            +"<td style='width: 150px;'>"+p.speed+" 公里/小时</td>"
                                            + "</tr>"
                                            +"<tr>"
                                            +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 地址" +"</td>"
                                            +"<td colspan='3'>"+p.address+"</td>"
                                            + "</tr>"
                                            + "</table>";
                                        createMark = function(lng, lat, info_html,createTime,carNum,speed,address) {
                                            var myIcon = new BMap.Icon('https://yzz.oss-cn.com/y/9.png', new BMap.Size(15, 18));
                                            var point = new BMap.Point(p.longitude,p.latitude);
                                            //打点并标记旋转角度
                                            var _marker = new BMap.Marker(point, {icon: myIcon,rotation:p.angle});
                                            _marker.createTime=createTime;
                                            _marker.carNum=carNum;
                                            _marker.speed=speed;
                                            _marker.address=address;
                                            _marker.angle=p.angle;
                                            _marker.addEventListener("click", function(e) {
                                                this.openInfoWindow(new BMap.InfoWindow(info_html));
                                                this.setIcon(new BMap.Icon('https://yzz.oss-cn.com/y/7.png', new BMap.Size(31, 31)));
                                                this.setRotation(this.getRotation())
                                            });
                                            _marker.addEventListener("infowindowclose", function(e) {
                                                this.setIcon(new BMap.Icon('https://yzz.oss-cn.com/y/9.png', new BMap.Size(15, 18)));
                                                this.setRotation(this.getRotation())
                                            });
                                            return _marker;
                                        };
                                        var marker1 = createMark(p.longitude,p.latitude, sContent,p.createTime,veh.carNum,p.speed,p.address);

                                        markers.push(marker1);
                                        //给列表数据
                                        innerHTML= innerHTML+"<tr style='display: table;width: 100%;'>" +
                                            " <td class='td2' style='width: 5%;'>"+i+"</td>" +
                                            "<td class='td1' style='width:15%;'><img src='https://yzz.oss-cn.com/y/7.png' title='在线-行驶' style='max-width: 20px;max-height: 20px;vertical-align: middle;transform: rotate("+p.angle+"deg);'></td>" +
                                            "<td class='td2' style='width: 15%;'>"+p.speed+"</td>" +
                                            "<td class='td2' style='width: 15%;'>"+p.createTime+"</td>" +
                                            "<td class='td3' style='width: 50%;'>"+p.address+"</td>" +
                                            "</tr>"
                                    }

                                    //地图添加聚合点
                                     markerClustersPoint(markers);
                                    //地图缩放重新计算聚合点
                                    map.addEventListener("zoomend",function(){
                                        markerClustersPoint(markers);
                                    });
                                    //底部列表添加数据
                                    table.innerHTML=innerHTML;
                                    //添加折线
                                    var polyline = new BMap.Polyline(paths, {
                                        enableEditing: false,//是否启用线编辑,默认为false
                                        enableClicking: true,//是否响应点击事件,默认为true
                                        icons:[],
                                        strokeWeight:'2',//折线的宽度,以像素为单位
                                        strokeOpacity: 0.8,//折线的透明度,取值范围0 - 1
                                        strokeColor:"#416EBF" //折线颜色
                                    });
                                    map.addOverlay(polyline);


                                }
                            }

                        }
                    } else{
                        console.log("异常");
                        layer.msg(result.msg, {icon: 2});
                        $.modal.closeLoading();
                    }
                    $.modal.closeLoading();
                }
            })
            console.log("结束-车辆")
        }
         var oldmk = [];
         //聚合添加
         function markerClustersPoint(markers) {
             if (markerClusterer) {
                 // console.log("清除聚合前。",markerClusterer);

                 markerClusterer.clearMarkers();//清除聚合
                 // console.log("清除聚合后。",markerClusterer);
             }
             // 老点位 去除
             if(oldmk.length != 0){
                 for (var i = 0; i < oldmk.length; i++) {
                     map.removeOverlay(oldmk[i])
                 }
                 oldmk = [];
             }
          //添加点聚合API(index.html中需引入文件)
             markerClusterer = new BMapLib.MarkerClusterer(this.map, {
                 markers: markers,
                 minClusterSize: 3, //最小的聚合数量,小于该数量的不能成为一个聚合,默认为2
                 styles: [
                     {
                     //此处仅放置style,不要写任何内容,否则会有默认聚合的数字显示溢出
                     }
                 ]
             });
             // console.log("进入聚合函数markerClusterer", markerClusterer);
             // 拿到所有的聚合点
             //markerClusterer中的 _clusters是一个数组,包含了可视范围的所有聚合点
             var cluster = markerClusterer._clusters;
             // console.log("进入聚合函数cluster", cluster);

             for (var i = 0; i < cluster.length; i++) {
             //cluster[i]._markers中包含此聚合点的所有marker集合
             //marker长度大于2时不进行聚合效果显示
             if (cluster[i]._markers.length < 2) continue;
             //自定义函数内容,可进行聚合点数据获取操作
             //......
             //cluster[i]._markers[0] 就是获取的第一个点,里面放有车牌号,速度 等信息    
             //......
             //拿到聚合点中的marker数量,用于数字显示
             var cluserMakerSum = cluster[i]._markers.length;
             //添加marker
             oldmk.push(addMarkerCluser(cluster[i]._center,cluserMakerSum,cluster[i]._markers[0]));
             }
         }

         // 标记自定义marker
         function addMarkerCluser(point,cluserMakerSum,marker) {
             // console.log("标记自定义marker===>");
             // console.log(point);
             var myIcon2 = new BMap.Icon('https://yzz.oss-cn.com/y/9.png', new BMap.Size(15, 18));
             //打点并标记旋转角度
             var markerdef = new BMap.Marker(point, {
                 // icon: 设置marker样式
                 icon: myIcon2,rotation:marker.angle
             });
             //设置marker的label
             var labelTitleCluser = cluserMakerSum;
             let label = new BMap.Label(labelTitleCluser, {
                 offset: new BMap.Size(12, 12)
             });
             //设置label样式
             label.setStyle({
                 color: "#fff",
                 fontSize: "14px",
                 backgroundColor: "0.05",
                 border: "0px "
             });
             markerdef.setLabel(label);

             var sContent2 =
                 "<div class='baiduPopBox' style='height: 30px; color: rgb(255, 255, 255);background-color: rgb(64, 150, 209);padding: 5px;width: 440px;'>"
                 + marker.createTime
                 + "</div>"
                 + "<table class='boxTop' style='width: 440px;'>"
                 +"<tr>"
                 +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 车牌号" +"</td>"
                 +"<td style='width: 150px;'>"+marker.carNum+"</td>"
                 +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 速度" +"</td>"
                 +"<td style='width: 150px;'>"+marker.speed+" 公里/小时</td>"
                 + "</tr>"
                 +"<tr>"
                 +"<td style='width: 70px;height: 30px;color: rgb(44, 120, 191);background-color: #f1f1f1;'> 地址" +"</td>"
                 +"<td colspan='3'>"+marker.address+"</td>"

                 + "</tr>"
                 + "</table>";
             //监听点击事件
             markerdef.addEventListener("click", function() {
                 console.log("点击自定义聚合maker");
                 this.openInfoWindow(new BMap.InfoWindow(sContent2));
                 this.setIcon(new BMap.Icon('https://yzz.oss-cn.com/y/7.png', new BMap.Size(31, 31)));
                 this.setRotation(marker.angle);
             });
             markerdef.addEventListener("infowindowclose", function(e) {
                 this.setIcon(new BMap.Icon('https://yzz.oss-cn.com/y/9.png', new BMap.Size(15, 18)));
                 this.setRotation(this.getRotation())
             });
             map.addOverlay(markerdef);

             return markerdef;
         }
    </script>
3.4 两个图片

7.png

9.png

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值