精华内容
下载资源
问答
  • -topic elk 5,查看elasticsearch是否接受到数据 数据都已经上来本次模拟了2万条数据 一会测试下1000千万数据下的查询 六、后续 整体的业务流程是定位数据采集程序采集进入围栏内的车辆定位数据实时传递至kafka集群...

    在这里插入图片描述

    一、搭建zookeeper:
    1,zookeeper镜像采用wurstmeister/zookeeper:latest拉取zookeeper镜像
    docker pull wurstmeister/zookeeper
    在这里插入图片描述

    2,启动zookeeper
    docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
    在这里插入图片描述

    3,查看zookeeper启动日志
    docker logs -f zookeeper
    在这里插入图片描述

    4,查看zookeeper安装路径
    docker exec zookeeper pwd
    在这里插入图片描述

    5,查看zookeeper运行状态
    docker exec zookeeper bin/zkServer.sh status
    在这里插入图片描述

    6,zookeeper搭建完成
    二、搭建kafka:
    1,kafka镜像采用wurstmeister/kafka:latest 拉取kafka镜像
    docker pull wurstmeister/kafka
    在这里插入图片描述

    2,启动kafka
    docker run -d --name kafka
    –env KAFKA_ADVERTISED_HOST_NAME=localhost
    –env KAFKA_ZOOKEEPER_CONNECT=172.21.0.11:2181
    –env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.21.0.11:9092
    –env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
    –env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"
    –net=host wurstmeister/kafka
    在这里插入图片描述

    3,查看kafka启动日志
    docker logs -f kafka
    在这里插入图片描述

    4,查看kafka版本
    docker exec kafka find / -name *kafka_* | head -1 | grep -o ‘\kafka[^\n]*’
    在这里插入图片描述

    5,kafka搭建完成
    三、搭建logstash
    1,logstash镜像采用logstash:7.9.1拉取logstash镜像
    docker pull logstash:7.9.1
    在这里插入图片描述2,启动logstash
    docker run -d --restart=always --privileged=true
    -p 5044:5044 --name logstash
    -v /root/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
    -v /data/elk/logstash/conf.d/:/usr/share/logstash/conf.d/
    logstash:7.9.1
    在这里插入图片描述3,查看启动日志
    docker exec -it logstash /bin/bash
    4,进入容器
    docker exec -it -u root logstash /bin/bash
    5,找到配置文件修改
    在这里插入图片描述input{
    kafka{
    bootstrap_servers => “172.21.0.11:9092” #kafka地址
    auto_offset_reset => “earliest” #消息读取位置
    topics => [“oracle_test”] #kafka中topic名称,记得创建该topic
    group_id => “logstash” #默认为“logstash”
    codec => “json” #与Shipper端output配置项一致
    consumer_threads => 3 #消费的线程数
    max_poll_records => “2000”
    decorate_events => true #在输出消息的时候回输出自身的信息,包括:消费消息的大小、topic来源以及consumer的group信息。
    }
    }
    output {
    kafka {
    topic_id => “elk”
    bootstrap_servers => “172.21.0.11:9092”
    }
    elasticsearch {
    user => elastic
    password => zOhEjICix5EQBw1Jaxlkcw9i
    hosts => [“https://aws.found.io:9243”]
    index => “logstash-%{+YYYY.MM.dd}”
    }
    }

    6.重启logstash
    docker restart logstash
    四、搭建elasticsearch
    在这里插入图片描述本次elasticsearch采用的是云端官方的服务elasticsearch cloud集群配置是三个节点
    节点1:4 GB RAM
    节点2:1 GB RAM
    节点3:4 GB RAM

    1,集群环境健康检查
    在这里插入图片描述2,查询全部索引
    在这里插入图片描述五、模拟业务环境
    1,进入kafka
    docker exec -it kafka /bin/bash
    2,打开生产者console
    ./kafka-console-producer.sh --broker-list 172.21.0.11:9092 --topic oracle_test
    3,测试数据是从生产库上下载了一会定位数据
    在这里插入图片描述4,logstash的out我配置了个两个通道一个是到elasticsearch,一个是到kafka的另一个topic
    查询测试topic是否接受到数据
    docker exec kafka kafka-console-consumer.sh --bootstrap-server 172.21.0.11:9092 --from-beginning --topic elk
    在这里插入图片描述
    5,查看elasticsearch是否接受到数据
    在这里插入图片描述在这里插入图片描述
    数据都已经上来本次模拟了2万条数据 一会测试下1000千万数据下的查询
    六、后续
    整体的业务流程是定位数据采集程序采集进入围栏内的车辆定位数据实时传递至kafka集群通过管道进入elasticsearch然后供实时查询分析

    展开全文
  • 我们有个项目是用来查询车辆轨迹,在某个市的每条主要道路的十字路口都安装了采集设备,车辆经过时会采集到车辆信息,包括车牌号码、采集时间、采集经纬度。平均每天有1亿条采集数据。现在我的需求是按车牌号和...
  • 页面需求:查询输入框实现车辆的对应轨迹,在地图上显示相应的轨迹(此处,上一辆车的轨迹必须清除才能绘制下一辆车的运动轨迹) 自己写了个类似功能的demo效果如下: 项目中一般是通过输入车牌号并通过查询按钮...

    最近项目实践中接触高德地图比较多,也发现高德地图新增了一系列的UI组件库,因此遇到一些新问题也只能自己琢磨。

    页面需求:查询输入框实现车辆的对应轨迹,在地图上显示相应的轨迹(此处,上一辆车的轨迹必须清除才能绘制下一辆车的运动轨迹)

    自己写了个类似功能的demo效果如下:

    项目中一般是通过输入车牌号并通过查询按钮请求接口得到数据并进行渲染(效果图如下)

    此处直接用静态数据+两个车辆按钮查询,直接贴入代码:

    <!doctype html>
    <html lang="zh-CN">
    
    <head>
        <!-- 原始地址://webapi.amap.com/ui/1.0/ui/misc/PathSimplifier/examples/simple-demo.html -->
        <base href="//webapi.amap.com/ui/1.0/ui/misc/PathSimplifier/examples/" />
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
        <title>简单路径</title>
        <style>
        html,
        body,
        #container {
            width: 100%;
            height: 100%;
            margin: 0px;
        }
        .btn-group{
          position:absolute;
          z-index: 10;
          right: 10px;
          bottom:50px;
        }
        .btn-group button{
          background-color:cornflowerblue;
          color:#fff;
        }
        </style>
    </head>
    
    <body>
        <div id="container"></div>
        <div class="btn-group">
          <button class="btn-car1">车辆一模拟</button>    
          <button class="btn-car2">车辆二模拟</button>  
        </div>
        <script type="text/javascript" src='https://webapi.amap.com/maps?v=1.4.4&key=您申请的key值'></script>
        <!-- UI组件库 1.0 -->
        <script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
        <script type="text/javascript">
        //创建地图
        var map = new AMap.Map('container', {
            zoom: 4
        });
        //此处静态模拟两辆车数据:
        var Path={"car1": [
                    [116.405289, 39.904987],
                    [113.964458, 40.54664],
                    [111.47836, 41.135964],
                    [108.949297, 41.670904],
                    [106.380111, 42.149509],
                    [103.774185, 42.56996],
                    [101.135432, 42.930601],
                    [98.46826, 43.229964],
                    [95.777529, 43.466798],
                    [93.068486, 43.64009],
                    [90.34669, 43.749086],
                    [87.61792, 43.793308]
                ],
                "car2":[
                [113.964458, 40.54664],
                [98.46826, 43.229964],
                [116.405289, 39.904987],
                [103.774185, 42.56996],
                ]},navg1;
        //轨迹渲染函数,参数(Path:对应车辆的经纬度数组即轨迹相关数据)
        function renderTrace(Path){
          AMapUI.load(['ui/misc/PathSimplifier', 'lib/$'], function(PathSimplifier, $) {
            if (!PathSimplifier.supportCanvas) {
                alert('当前环境不支持 Canvas!');
                return;
            }
            var pathSimplifierIns = new PathSimplifier({
                zIndex: 100,
                //autoSetFitView:false,
                map: map, //所属的地图实例
    
                getPath: function(pathData, pathIndex) {
    
                    return pathData.path;
                },
                getHoverTitle: function(pathData, pathIndex, pointIndex) {
    
                    if (pointIndex >= 0) {
                        //point 
                        return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
                    }
    
                    return pathData.name + ',点数量' + pathData.path.length;
                },
                renderOptions: {
    
                    renderAllPointsIfNumberBelow: 100 //绘制路线节点,如不需要可设置为-1
                }
            });
            window.pathSimplifierIns = pathSimplifierIns;
            //设置数据
            pathSimplifierIns.setData([{
                name: '路线0',
                path:Path//传入的轨迹数据
            }]);
    
            //对第一条线路(即索引 0)创建一个巡航器
            navg1 = pathSimplifierIns.createPathNavigator(0, {
                loop: false, //循环播放
                speed: 1000000 //巡航速度,单位千米/小时
            });
            navg1.start();
            map.setFitView();//根据地图上添加的覆盖物分布情况,自动缩放地图到合适的视野级别,参数overlayList默认为当前地图上添加的所有覆盖物图层
        });
        }
        document.getElementsByClassName("btn-car1")[0].addEventListener("click",function(){
          renderTrace(Path.car1);
        });
        document.getElementsByClassName("btn-car2")[0].addEventListener("click",function(){
          renderTrace(Path.car2);
        });
        </script>
    </body>
    </html>

    运行上述代码你会发现出现两条轨迹,然而,我们是想要实现将上一条轨迹清除然后重新绘制新的车辆的运动轨迹,在经过百度一系列说没办法实现轨迹清除,和通过下面两个方法都没办法清除之后

     

    clearMap( )

     

    删除地图上所有的覆盖物

    remove(overlayers:Array)

     

    删除地图覆盖物数组,数组为一个或多个覆盖物。

    本着任何事情都能有对应的解决方法的想法,还是让自己找到了实现轨迹清除的方法,就是下面这段代码,完美的清除了上一条轨迹:

    if (window.pathSimplifierIns) {
    						//通过该方法清空上次传入的轨迹
    						pathSimplifierIns.setData([]);
    					}

    首先判断是否存在对应的轨迹组件示例,如果已经存在,则将该轨迹示例进行清空(此处曾尝试设置pathSimplifierIns=null也无法清除轨迹),清空的方法为通过setData传入空数组的轨迹数据。

     

    setData(data:Array)

     

    设定数据源数组,并触发重新绘制。data为空时将清除显示内容。 

    在本例demo中,只需将setData加入renderTrace方法开头处,即可每次进行重绘~

    在此,也给下导航器事件触发方法:

     

    start(pointIndex:number)

     

    开始路径巡航。 pointIndex用于指定巡航的起始节点索引,默认为节点索引范围(range)的最小值

     

    如果是浮点类型,则整数部分表示起始点索引,小数部分表示起始点和下一节点间的比例位置。比如7.5就表示7~8的中间位置

    pause()

     

    暂停巡航

    resume()

     

    恢复巡航

    stop() 

     

    停止巡航,同时清除已经过路径(这一点不同于pause)

    destroy() 

     

    销毁巡航器。巡航作为动画过程是非常耗费性能的,因此不再需要时应及时销毁

    项目中往往还要对轨迹播放速度进行调整,只需通过如navg.setSpeed(num)进行设置即可

     

    setSpeed(speed:number)

     

    设定巡航器的速度,单位千米/小时

    鉴于有好多朋友反馈说加上没有。因此附上最终的demo代码

    <!doctype html>
    <html lang="zh-CN">
     
    <head>
        <!-- 原始地址://webapi.amap.com/ui/1.0/ui/misc/PathSimplifier/examples/simple-demo.html -->
        <base href="//webapi.amap.com/ui/1.0/ui/misc/PathSimplifier/examples/" />
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
        <title>简单路径</title>
        <style>
        html,
        body,
        #container {
            width: 100%;
            height: 100%;
            margin: 0px;
        }
        .btn-group{
          position:absolute;
          z-index: 10;
          right: 10px;
          bottom:50px;
        }
        .btn-group button{
          background-color:cornflowerblue;
          color:#fff;
        }
        </style>
    </head>
     
    <body>
        <div id="container"></div>
        <div class="btn-group">
          <button class="btn-car1">车辆一模拟</button>    
          <button class="btn-car2">车辆二模拟</button>  
        </div>
        <script type="text/javascript" src='https://webapi.amap.com/maps?v=1.4.4&key=您申请的key值'></script>
        <!-- UI组件库 1.0 -->
        <script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
        <script type="text/javascript">
        //创建地图
        var map = new AMap.Map('container', {
            zoom: 4
        });
        //此处静态模拟两辆车数据:
        var Path={"car1": [
                    [116.405289, 39.904987],
                    [113.964458, 40.54664],
                    [111.47836, 41.135964],
                    [108.949297, 41.670904],
                    [106.380111, 42.149509],
                    [103.774185, 42.56996],
                    [101.135432, 42.930601],
                    [98.46826, 43.229964],
                    [95.777529, 43.466798],
                    [93.068486, 43.64009],
                    [90.34669, 43.749086],
                    [87.61792, 43.793308]
                ],
                "car2":[
                [113.964458, 40.54664],
                [98.46826, 43.229964],
                [116.405289, 39.904987],
                [103.774185, 42.56996],
                ]},navg1;
        //轨迹渲染函数,参数(Path:对应车辆的经纬度数组即轨迹相关数据)
        function renderTrace(Path){
            //判断是否已有轨迹,进行清除!!!注意,就是在此处清除了轨迹
            if(window.pathSimplifierIns){
                pathSimplifierIns.setData([]);
            }
          AMapUI.load(['ui/misc/PathSimplifier', 'lib/$'], function(PathSimplifier, $) {
            if (!PathSimplifier.supportCanvas) {
                alert('当前环境不支持 Canvas!');
                return;
            }
            var pathSimplifierIns = new PathSimplifier({
                zIndex: 100,
                //autoSetFitView:false,
                map: map, //所属的地图实例
     
                getPath: function(pathData, pathIndex) {
     
                    return pathData.path;
                },
                getHoverTitle: function(pathData, pathIndex, pointIndex) {
     
                    if (pointIndex >= 0) {
                        //point 
                        return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
                    }
     
                    return pathData.name + ',点数量' + pathData.path.length;
                },
                renderOptions: {
     
                    renderAllPointsIfNumberBelow: 100 //绘制路线节点,如不需要可设置为-1
                }
            });
            window.pathSimplifierIns = pathSimplifierIns;
            //设置数据
            pathSimplifierIns.setData([{
                name: '路线0',
                path:Path//传入的轨迹数据
            }]);
     
            //对第一条线路(即索引 0)创建一个巡航器
            navg1 = pathSimplifierIns.createPathNavigator(0, {
                loop: false, //循环播放
                speed: 1000000 //巡航速度,单位千米/小时
            });
            navg1.start();
            map.setFitView();//根据地图上添加的覆盖物分布情况,自动缩放地图到合适的视野级别,参数overlayList默认为当前地图上添加的所有覆盖物图层
        });
        }
        document.getElementsByClassName("btn-car1")[0].addEventListener("click",function(){
          renderTrace(Path.car1);
        });
        document.getElementsByClassName("btn-car2")[0].addEventListener("click",function(){
          renderTrace(Path.car2);
        });
        </script>
    </body>
    </html>

     

     

    展开全文
  • GPS监控系统是一套可以管理实时位置,轨迹回放,电子围栏,报警统计等功能的综合系统! GPS设备发送位置数据到后台服务器,经过后台算法解析,纠偏,过滤等处理将位置数据展示在WEB前端和APP端,然后通过web端和APP...

    GPS监控系统是一套可以管理实时位置,轨迹回放,电子围栏,报警统计等功能的综合系统!
    GPS设备发送位置数据到后台服务器,经过后台算法解析,纠偏,过滤等处理将位置数据展示在WEB前端和APP端,然后通过web端和APP端查询管理监控等!形成一套针对多行业应用的监控系统,比如渣土车,校车,租赁车辆,人员定位,宠物定位,企业车辆监控等功能!
    GPSBD是一套专为二次开发而设计的GPS监控系统,集成了实时定位,轨迹回放,电子围栏,报警统计等功能,可方便用户基于这套系统快速开发出其他位置行业应用!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    开发者可以快速基于GPSBD通用系统 开发出各类位置行业应用,GPSBD这套系统集成了市面上主流的几十种车机通信协议,开发者无需对接任何协议即可直接使用!

    展开全文
  • 车联网中一个非常典型的场景是采集车辆的行驶轨迹,通常来说车辆轨迹并不会实时上报,可能会堆积若干条轨迹记录,或者间隔多少时间上报一次。 一个典型的数据结构如下 (car_id, pos geometry, crt_time timestamp....

    标签

    PostgreSQL , 窗口函数 , 车联网 , 轨迹 , 轨迹清洗 , lag , lead


    背景

    车联网中一个非常典型的场景是采集车辆的行驶轨迹,通常来说车辆的轨迹并不会实时上报,可能会堆积若干条轨迹记录,或者间隔多少时间上报一次。

    一个典型的数据结构如下

    (car_id, pos geometry, crt_time timestamp)  
    

    车辆在行驶,行驶过程中会遇到堵车,红绿灯,那么上报的轨迹记录可能是这样的

    1, 位置1, '2017-01-01 12:00:00'  
    1, 位置1, '2017-01-01 12:00:05'  
    1, 位置1, '2017-01-01 12:00:10'  
    1, 位置1, '2017-01-01 12:00:15'  
    1, 位置1, '2017-01-01 12:00:20'  
    1, 位置2, '2017-01-01 12:00:30'  
    

    也就是说,在同一个位置,因为堵车、等红灯,可能会导致上传多条记录。

    那么就涉及到在数据库中清洗不必要的等待记录的需求,在一个点,我们最多保留2条记录,表示到达这个位置和离开这个位置。

    这个操作可以使用窗口函数实现。

    当然从最佳效率角度来分析,轨迹清洗这个事情,在终端做是更合理的,一个位置的起始点,只留两条。

    例子

    1、设计表结构

    create table car_trace (cid int, pos point, crt_time timestamp);  
    

    2、生成1000万测试数据,假设有1000量车,(为了让数据更容易出现重复,为了测试看效果,位置使用25个点)

    insert into car_trace select random()*999, point((random()*5)::int, (random()*5)::int), clock_timestamp() from generate_series(1,10000000);  
    

    3、创建索引

    create index idx_car on car_trace (cid, crt_time);  
    

    4、查询数据layout

    select * from car_trace where cid=1 order by crt_time limit 1000;  
      
       1 | (3,1) | 2017-07-22 21:30:09.84984  
       1 | (1,4) | 2017-07-22 21:30:09.850297  
       1 | (1,4) | 2017-07-22 21:30:09.852586  
       1 | (1,4) | 2017-07-22 21:30:09.854155  
       1 | (1,4) | 2017-07-22 21:30:09.854425  
       1 | (3,1) | 2017-07-22 21:30:09.854493  
      
    观察到了几个重复。  
    

    5、使用窗口过滤单一位置记录,最多仅保留到达这个位置和离开这个位置的两条记录。

    这里用到两个窗口函数:

    lag,表示当前记录的前面一条记录。

    lead,表示当前记录的下一条记录。

    判断到达点、离去点的方法如下:

    • 当前pos 不等于 前一条pos,说明这条记录是当前位置的到达点。

    • 当前pos 不等于 下一条pos,说明这条记录是当前位置的离去点。

    • 前一条pos 为空,说明这条记录是第一条记录。

    • 下一条pos 为空,说明这条记录是最后一条记录。

    select * from   
    (  
    select   
      *,   
      lag(pos) over (partition by cid order by crt_time) as lag,   
      lead(pos) over (partition by cid order by crt_time) as lead   
    from car_trace   
      where cid=1   
      and crt_time between '2017-07-22 21:30:09.83994' and '2017-07-22 21:30:09.859735'  
    ) t  
      where pos <> lag  
      or pos <> lead  
      or lag is null  
      or lead is null;  
      
     cid |  pos  |          crt_time          |  lag  | lead    
    -----+-------+----------------------------+-------+-------  
       1 | (2,1) | 2017-07-22 21:30:09.83994  |       | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.839953 | (2,1) | (5,2)  
       1 | (5,2) | 2017-07-22 21:30:09.840704 | (3,1) | (4,4)  
       1 | (4,4) | 2017-07-22 21:30:09.84179  | (5,2) | (5,2)  
       1 | (5,2) | 2017-07-22 21:30:09.843787 | (4,4) | (1,5)  
       1 | (1,5) | 2017-07-22 21:30:09.844165 | (5,2) | (0,5)  
       1 | (0,5) | 2017-07-22 21:30:09.84536  | (1,5) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.845896 | (0,5) | (3,3)  
       1 | (3,3) | 2017-07-22 21:30:09.846958 | (4,1) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.84984  | (3,3) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.850297 | (3,1) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.854425 | (1,4) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.854493 | (1,4) | (3,2)  
       1 | (3,2) | 2017-07-22 21:30:09.854541 | (3,1) | (2,0)  
       1 | (2,0) | 2017-07-22 21:30:09.855297 | (3,2) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.857592 | (2,0) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.857595 | (4,1) | (0,4)  
       1 | (0,4) | 2017-07-22 21:30:09.857597 | (4,1) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.858996 | (0,4) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.859735 | (3,1) |   
    (20 rows)  
    

    未加清洗轨迹,得到的结果如下:

    select   
      *,   
      lag(pos) over (partition by cid order by crt_time) as lag,   
      lead(pos) over (partition by cid order by crt_time) as lead   
    from car_trace   
      where cid=1   
      and crt_time between '2017-07-22 21:30:09.83994' and '2017-07-22 21:30:09.859735';  
      
     cid |  pos  |          crt_time          |  lag  | lead    
    -----+-------+----------------------------+-------+-------  
       1 | (2,1) | 2017-07-22 21:30:09.83994  |       | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.839953 | (2,1) | (5,2)  
       1 | (5,2) | 2017-07-22 21:30:09.840704 | (3,1) | (4,4)  
       1 | (4,4) | 2017-07-22 21:30:09.84179  | (5,2) | (5,2)  
       1 | (5,2) | 2017-07-22 21:30:09.843787 | (4,4) | (1,5)  
       1 | (1,5) | 2017-07-22 21:30:09.844165 | (5,2) | (0,5)  
       1 | (0,5) | 2017-07-22 21:30:09.84536  | (1,5) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.845896 | (0,5) | (3,3)  
       1 | (3,3) | 2017-07-22 21:30:09.846958 | (4,1) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.84984  | (3,3) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.850297 | (3,1) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.852586 | (1,4) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.854155 | (1,4) | (1,4)  
       1 | (1,4) | 2017-07-22 21:30:09.854425 | (1,4) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.854493 | (1,4) | (3,2)  
       1 | (3,2) | 2017-07-22 21:30:09.854541 | (3,1) | (2,0)  
       1 | (2,0) | 2017-07-22 21:30:09.855297 | (3,2) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.857592 | (2,0) | (4,1)  
       1 | (4,1) | 2017-07-22 21:30:09.857595 | (4,1) | (0,4)  
       1 | (0,4) | 2017-07-22 21:30:09.857597 | (4,1) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.858996 | (0,4) | (3,1)  
       1 | (3,1) | 2017-07-22 21:30:09.859735 | (3,1) |   
    (22 rows)  
    

    使用lag, lead清洗掉了停留过程中的记录。

    被跟踪对象散落导致的扫描IO放大的优化

    因为业务中涉及的车辆ID可能较多,不同车辆汇聚的数据会往数据库中写入,如果不做任何优化,那么不同车辆的数据进入数据库后,可能是交错存放的,也就是说一个数据块中,可能有不同车辆的数据。

    那么在查询单一车辆的轨迹时,会扫描很多数据块(扫描IO放大)。

    优化思路有两种。

    1、业务端汇聚分组排序后写入数据库。例如程序在接收到车辆终端提交的数据后,按车辆ID分组,按时间排序,写入数据库(insert into tbl values (),(),...();)。这样的话,同样车辆的数据,可能会尽可能的落在同一个数据块内。

    2、数据库端使用分区,重组数据。例如,按车辆ID,每辆车、或者车辆HASH分区存放。

    以上两种方法,都是要将数据按查询需求重组,从而达到降低扫描IO的目的。

    这个方法与《PostgreSQL 证券行业数据库需求分析与应用》的方法类似,有兴趣的朋友可以参考。

    展开全文
  • 移动管家车载终端车辆调度管理系统也叫做车辆调度监控终端功能介绍:在线监控:全方位、全智能、...对于所查询车辆的选bai择可以按单辆车、分组或全部车辆进行,选中车辆的实时位置信息和行驶数据信息将向管理中心报告
  • 抢修指挥系统简介 内容:指挥系统是 各项指标展示、车辆定位轨迹服务系统是一套车辆定位追踪管理,设备监管,轨迹查询的一套服务系统,能够方便直观的查询车辆所在位置,历史上所行驶的轨迹。 硬件:采用先进GPS...
  • 采用GeoHash编码存储海量车辆轨迹数据,实现车辆调度查询,时空精准发现
  • Android鹰眼轨迹追踪

    千次阅读 2019-11-20 20:18:35
    鹰眼是一套轨迹管理服务,接入该服务后,可追踪车辆/人员等运动物体,实现实时定位、轨迹追踪和轨迹存储查询等功能。基于鹰眼提供的接口和云端服务,可以迅速构建一套完全属于您自己的完整、精准且高性能的轨迹管理...
  • 轨迹数据库技术,以支持有效的数据组织和高效的查询处理;轨迹数据仓库,支持大规模轨迹的统计、理解和分析;最后是知识提取,从数据中挖掘有价值的模式与规律。因此,综述轨迹大数据分析,从企业数据、企业应用、...
  • 轨迹数据库技术,以支持有效的数据组织和高效的查询处理;轨迹数据仓库,支持大规模轨迹的统计、理解和分析;最后是知识提取,从数据中挖掘有价值的模式与规律。因此,综述轨迹大数据分析,从企业数据、企业应用、前沿技术...
  • PostgreSQL , PostGIS , 动态更新位置 , 轨迹跟踪 , 空间分析 , 时空分析 背景 随着移动设备的普及,越来越多的业务具备了时空属性,例如快递,试试跟踪包裹、快递员位置。例如实体,具备了空间属性。 例如餐饮...
  • 射频定位系统上位机采用IFIX组态软件编写,结合VB和Matlab编写的曲线拟合控件,可以查询车辆运行历史轨迹,实时监控井下车辆的运行状态,记录车辆违规的信息并报警,所有车辆运行信息储存到SQL数据库中。
  • 历史轨迹 请求: HEAD B D cID S1 sTime S1 eTime FOOT 回复: HEAD B D cID S1 信息点1 S2 信息点2 S2 信息点3 … FOOT 历史报警 请求: HEAD B E cIDs S1 sTime S1 eTime FOOT cIDs格式为cID1 + S2 + cID2 + S2 +...
  • 企业车辆调度系统

    2020-06-21 15:12:17
    1)实时查询车辆的位置和行驶数据信息 对于所查询车辆的选择可以按单辆车、分组或全部车辆进行,选中车辆的实时位置信息和行驶数据信息将向管理中心报告。位置信息包含经纬度值,行驶状态信息包括时间、速度、方向、...
  • 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹、快递物流流转、车辆定位轨迹等。该场景与地理位置管理类似,核心点与瓶颈都在数据库的存储性能与查询能力,同时需要时间字段正序排列,保证轨迹点顺序;一方面...
  • 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹、快递物流流转、车辆定位轨迹等。该场景与地理位置管理类似,核心点与瓶颈都在数据库的存储性能与查询能力,同时需要时间字段正序排列,保证轨迹点顺序;一方面...
  • 摘要: 基于TableStore轻松实现亿量级轨迹管理与地理围栏一、方案背景轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹、快递物流流转、车辆定位轨迹等。该场景与地理位置管理类似,核心点与瓶颈都在数据库的...
  • 轨迹管理系统日常生活中使用非常普遍,如外卖派送轨迹、快递物流流转、车辆定位轨迹等。该场景与地理位置管理类似,核心点与瓶颈都在数据库的存储性能与查询能力,同时需要时间字段正序排列,保证轨迹点顺序;一方面...
  • 在移动对象轨迹监控与分析的项目中,收集了数十万的车辆信息,每个车辆会定时的上报当前位置、事件、状态等信息,每天约数亿条轨迹点,需要能够存储。且前端用户在查询时,要能快速返回目标船舶的信息。 入库需求: ...

空空如也

空空如也

1 2 3 4 5
收藏数 81
精华内容 32
关键字:

查询车辆轨迹