在某項目中,巡更人員的手持GPS會每隔固定時間將此時人員所在位置上報至總數據庫中。現在,我們需要知道指定人員在規定的時間內,是否有在某個點處停留超過20分鐘的行為。
首先,停留並不能理解為兩點完全重合為停留。GPS坐標本身會有偏移和誤差;並且在某個范圍內無意義的移動也不能理解為有效的移動。
其次,代碼上應該盡量提高通用度,將距離容差范圍、時間容差范圍、查詢人員、查詢時間段均應該設置為可控參數。
最後,作為統計需求,在無法進行每次上報位置時就進行實時判斷的情況下,寫成存儲過程效率會比較高些。
以上方案,是屬於後發型統計行為,試想如果我要統計一周的情況,一個人員一周能上報幾十萬個軌跡點,在最壞的情況下,統計一個人員的循環遍歷次數就要超過幾十萬次。
如果選擇優化,優化的方向可以是將壓力分散到每次上報時就進行判斷。
我們以需要統計一周的停留超過預定時間人員來假設,具體思路如下:
A.建立一張每周定時情況的表,表名叫做tchumanweekstaycheck。此表可以包含兩個字段:humanID和checked。用來記錄這一周內哪些人員是的軌跡是不符合需求的。建立時,將所有人員編號均錄入到此表,並且所有checked字段均是true。
B.上報軌跡點時,首先去tchumanweekstaycheck表中尋找該humanID對應的checked是否為false。
如果是,表示該人員已經有不符合規定的停留出現了,然後將該人員手持設備中的判斷停留參數設置為false,下次上報案卷時不再進行停留判斷,提高效率(判斷已無意義)。
如果否,表示該人員一直合乎要求,然後將此坐標與之前的該人員坐標進行判斷,如果有停留,記錄停留時間。如果沒停留,不記錄停留時間。整個邏輯,和上面存儲過程描述的邏輯相似。
C.當某個人員上報位置時,進行了停留判斷,並且判斷出此點出現了超過預設時間的停留,則將tchumanweekstaycheck表中對應的humanID的checked值變為false。
D.查看tchumanweekstaycheck即可知道哪些人員出現了超出停留時間。
——歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/