某车辆智能监控系统 VisActor/VTable 实践总结

本文由 VisActor 用户访谈整理而来,文档内容已经脱敏。

业务场景介绍

车辆智能管理监控系统,提供给车辆管理人员和司机使用。主要功能包括如下内容:

  • 车辆监控
  • 指挥调度
  • 统计分析
  • 其他功能

VisActor 实践

目前系统中使用的可视化组件是VisActor 的表格可视化组件 VTable,用来展示某一辆车的轨迹数据,并且使用表格和地图进行联动。

下面对几个核心功能进行讲解。

展示轨迹明细数据

由于轨迹数据上报频繁,需要表格支持至少万级别的无分页呈现,通常需要呈现几十万、百万的轨迹数据。 这里对关键数据进行梳理,然后使用VTable的ListTable进行数据展示,可以解决dom表格的的性能问题。无卡顿,效果丝滑。

这里使用VTable的方式做简单介绍,首先通过 columns 做行头的定义。

js 复制代码
             const  columns=[
                {
                    title: '车牌号',
                    field: 'plateNum',
                    disableSelect:true,
                    disableHeaderSelect:true,
                    headerStyle:{
                        bgColor:"#F5F7FA",
                        fontSize:15,
                        fontWeight:"normal"
                    },
                    style:{
                        color:"#606266",
                    },
                    width: 120,
                },
                (略...)
               ]

             const option = {
                records:this.tableData,
                columns:columns,
                widthMode:'standard',
                select:{
                    disableSelect:true,
                    disableHeaderSelect:true
                },
                hover:{
                    disableHeaderHover:true
                },
                tooltip:{
                    isShowOverflowTextTooltip: true,
                }
            };
            tableInstance = new VTable.ListTable(document.getElementById("tableContainer"), option);

对"车辆位置"一列进行了自定义渲染,需要实现自定义按钮的一个样式。

这里借助列的自定义渲染能力,结合VTable提供的 recttext 图元进行样式的设置,核心代码如下:

js 复制代码
{
                    title: '车辆位置',
                    field: 'address',
                    customRender(args){
                            elements.push({
                                type: 'rect',
                                fill: '#143D7D',
                                x: left+40,
                                y: 3,
                                radius:6,
                                width: 55,
                                height:30,
                                pickable:true,
                                cursor:"pointer"
                            });
                            elements.push({
                                type: 'text',
                                font: '14px Helvetica Neue',
                                fill: '#ffffff',
                                x: left+53,
                                y: 22,
                                text: "位置",
                                width: 30,
                                height:30,
                                cursor:"pointer"
                            });
                       
                        }

                        return {
                            elements,
                            expectedHeight:top+20,
                            expectedWidth: maxWidth+20,
                        }
                    },
                
                };

轨迹定位

该功能要求点击表格行数据进行轨迹线路定位,在地图上展示轨迹和定位信息。

这里没有找到VTable的行点击事件,所以监听了单元格事件,通过相关信息进行定位。

核心代码如下:

js 复制代码
 tableInstance.on('click_cell', args => {
                const { col, row,originData,target } = args;
                if(col==4&&target.type=='rect'){
                       that.geo2Address(originData,row)
                }else{
                      this.$refs.bmap.dimensionMarker({lon:originData.longitude,lat:originData.latitude,time:originData.createtime})
                }
            })

轨迹播放

根据车辆行驶轨迹数据在地图上动态演示车辆的轨迹变化,改变表格中对应的行背景色并向上自动滚动。

这里实现方案比较简单,将走过的位置数据保存到数组,调用vtable的updateTheme方法,数组匹配行数据返回背景色,根据表格行高和行驶过的行数计算向上滚动的距离,设置vtable的scrollTop属性。

核心代码

js 复制代码
    isChangeBg(pitem,scrolldis){
             requestAnimationFrame(()=>{
                let to=null
                this.scrolldis=scrolldis
                this.colorArr.push({longitude:pitem.lng,latitude:pitem.lat})
                to=this.updateTheme()
                this.tableInstance&&(this.tableInstance.scrollTop=scrolldis)
                to&&this.tableInstance.updateTheme(to)
             })
          },
        updateTheme(){
             let that=this
                const themeobj=VTable.themes.DEFAULT.extends({
                bodyStyle: {
                    bgColor(args) {
                        const { row, col } = args;
                        const record = args.table.getRecordByCell(col, row);
                        const fobj=that.colorArr.find(ele=>ele.longitude==record.longitude&&ele.latitude==record.latitude)
                        if(fobj){
                            return "#13ce66"
                        }
                    }
                }
                })
                return themeobj
        },

存在的问题

更新主题问题

问题描述

可以通过接口更新指定行的样式。

解决方案

后续VTable可能增加针对单元格或者整行整列的样式更新接口,或者是提供刷新单元格或者整行整列的接口。

行操作问题

问题描述

希望可以增加对行的操作,整行的点击事件,选中事件等,行属性配置,单独改变行数据,可以改变列的隐藏显示。

解决方案

VTable已经规划了行选的功能,事件方面也完善。

单独改变行数据已经有了接口updateRecords。

改变列的隐藏显示后续也会增加对应的接口来提供这个能力;

本文作者获得由VisActor 提供的字节新年礼包一份

欢迎交流

欢迎大家与我们进行交流:

1)VisActor 微信订阅号留言(可以通过订阅号菜单加入微信群):

2)飞书群:

3)VisActor 官网:www.visactor.io/

今夜无月,期待你点亮星空,感谢Star:

githubgithub.com/VisActor/VT...

更多参考:

  1. VTable------不只是高性能的多维数据分析表格,开源,免费,百万数据秒级渲染
  2. VisActor------面向叙事的智能可视化解决方案 - 掘金
  3. 火山引擎DataWind产品可视化能力揭秘 - 掘金
  4. 更多 VTable 示例

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

相关推荐
flay2 小时前
Claude进阶秘籍:10个高级技巧让效率翻倍
人工智能
猫头虎2 小时前
Paper2Agent:将科研论文转化为可交互的AI智能体工具项目
人工智能·prompt·aigc·交互·pip·agi·ai-native
喜欢吃豆2 小时前
微调高级推理大模型(COT)的综合指南:从理论到实践
人工智能·python·语言模型·大模型·微调·强化学习·推理模型
Tfly__2 小时前
Ubuntu 20.04 安装Aerial Gym Simulator - 基于 Gym 的无人机强化学习仿真器
linux·人工智能·ubuntu·github·无人机·强化学习·运动规划
一枚前端小能手2 小时前
🔍 那些不为人知但是好用的JS小秘密
前端·javascript
北城以北88882 小时前
Vue-- Axios 交互(二)
javascript·vue.js·交互
喜欢吃豆2 小时前
从指令遵循到价值对齐:医疗大语言模型的进阶优化、对齐与工具集成综合技术白皮书
人工智能·python·语言模型·自然语言处理·大模型·强化学习·constitutional
진영_2 小时前
LLMs From Scratch(一)---理解大语言模型
人工智能·语言模型·自然语言处理
无风听海2 小时前
神经网络之理解梯度和方向导数
人工智能·深度学习·神经网络
Zuckjet_3 小时前
第 7 篇:交互的乐趣 - 响应用户输入
前端·javascript·webgl