用存储过程判断某个人员在一天的行进轨迹中是否有超过指定时间的停留

简介: 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.问题描述 在某项目中,巡更人员的手持GPS会每隔固定时间将此时人员所在位置上报至总数据库中。

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.问题描述

在某项目中,巡更人员的手持GPS会每隔固定时间将此时人员所在位置上报至总数据库中。现在,我们需要知道指定人员在规定的时间内,是否有在某个点处停留超过20分钟的行为。

2.分析

首先,停留并不能理解为两点完全重合为停留。GPS坐标本身会有偏移和误差;并且在某个范围内无意义的移动也不能理解为有效的移动。

其次,代码上应该尽量提高通用度,将距离容差范围、时间容差范围、查询人员、查询时间段均应该设置为可控参数。

最后,作为统计需求,在无法进行每次上报位置时就进行实时判断的情况下,写成存储过程效率会比较高些。

3.具体实现

     

    

                          

4.优化

以上方案,是属于后发型统计行为,试想如果我要统计一周的情况,一个人员一周能上报几十万个轨迹点,在最坏的情况下,统计一个人员的循环遍历次数就要超过几十万次。

如果选择优化,优化的方向可以是将压力分散到每次上报时就进行判断。

我们以需要统计一周的停留超过预定时间人员来假设,具体思路如下:

A.建立一张每周定时情况的表,表名叫做tchumanweekstaycheck。此表可以包含两个字段:humanID和checked。用来记录这一周内哪些人员是的轨迹是不符合需求的。建立时,将所有人员编号均录入到此表,并且所有checked字段均是true。

B.上报轨迹点时,首先去tchumanweekstaycheck表中寻找该humanID对应的checked是否为false。

如果是,表示该人员已经有不符合规定的停留出现了,然后将该人员手持设备中的判断停留参数设置为false,下次上报案卷时不再进行停留判断,提高效率(判断已无意义)。

如果否,表示该人员一直合乎要求,然后将此坐标与之前的该人员坐标进行判断,如果有停留,记录停留时间。如果没停留,不记录停留时间。整个逻辑,和上面存储过程描述的逻辑相似。

C.当某个人员上报位置时,进行了停留判断,并且判断出此点出现了超过预设时间的停留,则将tchumanweekstaycheck表中对应的humanID的checked值变为false。

D.查看tchumanweekstaycheck即可知道哪些人员出现了超出停留时间。

 

                                                                                   -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                                            如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                      

目录
相关文章
|
10月前
|
Oracle 数据库 UED
后台查询接口影响响应时间最大的因素:用空间换时间的优缺点及解决方案
1.当数据库的一个表记录很多显然查询数据很慢。 2.当数据库的一个表记录不大,但是数据很大也可能很慢。 我们的一个用户表中一个building很大,当查询100条数据就会把服务器的内存搞爆掉。 当然查询时要查询筛选有用字段,不可以直接把记录的所有字段都查拆来。这样能减少内存消耗和提高查询速度。 3.在经常查询字段上建立索引。据说oracle上用索查询和不用索引查询在超多记录的情况下相差1000倍。 4.若出现嵌套查询显然会大大增加相应查询时间。要先预处理用管道操作把能合并的查询合并到一个查询中,然后生成map,然后再处理。这是标准的用空间换时间的方案。
123 8
|
6月前
|
存储 测试技术 定位技术
需要统计出轨迹点出入某个区域的信息,包括:驶入时间、驶出时间
Lindorm Ganos 通过内置的 `ST_TrajectoryProfile` 算子高效统计轨迹的出入信息,利用时空索引技术减少扫描量和内存使用,降低计算成本。它通过空间索引+过滤下推减少扫描量,聚合加速提升效率,并在聚合算子内部完成进出点判断和轨迹信息提取。然而,该算子受限于时间阈值设定,可能在轨迹点不均匀采集时产生误差。测试环境下,查询耗时在20秒内,具体表现取决于过滤后的数据量和空间范围复杂度。
44 0
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
文本,好看的设计------我独自升级,六芒星技能表,可以用来判断是否在能力值之内的事情,使用六芒星可以显示能力之内,能力之外的事情,用以判断
【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
如何确定两个日期之间的工作日有多少天、计算—年中每周内各日期出现次数、确定当前记录和下一条记录之间相差的天数【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本章节的三个需求:确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数有些许难度,不过建议还是学会比较好。
【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
时间大小判断
大家可以根据自己的理解去使用 before 是在什么之前 after 是在什么之后 true 对 false 错
83 0
时间大小判断
|
存储 测试技术 开发工具
BSTestRunner增加历史执行记录展示和重试功能
之前对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中,以后我们使用BSTestRunner直接就可以使用里面的失败重试和展示历史记录了。
BSTestRunner增加历史执行记录展示和重试功能
|
缓存 前端开发
【前端三分钟】优化判断语句
【前端三分钟】优化判断语句
193 0
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 21丨报告系统状态的连续日期【难度困难】​
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 21丨报告系统状态的连续日期【难度困难】​
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 27丨每次访问的交易次数【难度困难-提前放出来】​
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 27丨每次访问的交易次数【难度困难-提前放出来】​