文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。数据库
在某项目中,巡更人员的手持GPS会每隔固定时间将此时人员所在位置上报至总数据库中。如今,咱们须要知道指定人员在规定的时间内,是否有在某个点处停留超过20分钟的行为。微信
首先,停留并不能理解为两点彻底重合为停留。GPS坐标自己会有偏移和偏差;而且在某个范围内无心义的移动也不能理解为有效的移动。优化
其次,代码上应该尽可能提升通用度,将距离容差范围、时间容差范围、查询人员、查询时间段均应该设置为可控参数。blog
最后,做为统计需求,在没法进行每次上报位置时就进行实时判断的状况下,写成存储过程效率会比较高些。get
以上方案,是属于后发型统计行为,试想若是我要统计一周的状况,一我的员一周能上报几十万个轨迹点,在最坏的状况下,统计一我的员的循环遍历次数就要超过几十万次。博客
若是选择优化,优化的方向能够是将压力分散到每次上报时就进行判断。效率
咱们以须要统计一周的停留超过预约时间人员来假设,具体思路以下:循环
A.创建一张每周定时状况的表,表名叫作tchumanweekstaycheck。此表能够包含两个字段:humanID和checked。用来记录这一周内哪些人员是的轨迹是不符合需求的。创建时,将全部人员编号均录入到此表,而且全部checked字段均是true。遍历
B.上报轨迹点时,首先去tchumanweekstaycheck表中寻找该humanID对应的checked是否为false。im
若是是,表示该人员已经有不符合规定的停留出现了,而后将该人员手持设备中的判断停留参数设置为false,下次上报案卷时再也不进行停留判断,提升效率(判断已无心义)。
若是否,表示该人员一直合乎要求,而后将此坐标与以前的该人员坐标进行判断,若是有停留,记录停留时间。若是没停留,不记录停留时间。整个逻辑,和上面存储过程描述的逻辑类似。
C.当某我的员上报位置时,进行了停留判断,而且判断出此点出现了超过预设时间的停留,则将tchumanweekstaycheck表中对应的humanID的checked值变为false。
D.查看tchumanweekstaycheck便可知道哪些人员出现了超出停留时间。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^