文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.背景
公司在樂亭的項目中,工程同事提出了需要在對接車輛GPS上報點時,能夠實時判斷該點是否落在樂亭行政區內。如果不在,將其報警。
處理思路分為了兩種,一種是前端實時從數據庫中拉取存入的GPS點,然后判斷點是否落在區域面中。第二種,就是在與GPS廠商實時對接GPS數據,將GPS數據存入到我方數據庫中對應表時,就進行點是否落在區域面中的判斷,如果不是,則在對應表的判斷點面關系字段中將其標注。
考慮到效率以及記錄的保存,最后選擇第二種方案,即在數據庫層面進行操作,並保存判斷記錄方式。
2.判斷點面關系的算法
2.1 算法選擇
判斷點面關系的算法一般有如下幾種:
a差乘判別法(只針對凸多邊形)
b.面積判別法(只針對凸多邊形)
c.角度和判別法等(任意多邊形均可)
為了以后存儲過程的通用性,選擇使用角度和判別法更符合需求。
2.2 角度和判別方法的原理
原理:令P={p1,p2,…,pn,p1}是一個頂點為pi(xi,yi), i=1,2,…,n的封閉多角形,pt是一個測試點。PtPi為連接pt和pi的向量,αi表示向量PtPi到PtPi+1的夾角。
若Σαi = 0 Pt在P的外面;
若Σαi = ±2π Pt在P里面。
3.用存儲過程實現該算法
3.1 單個角度獲取(夾角αi算法)
3.2 角度總和判別
3.算法優化
以上角度和算法是相對耗時的,如果我們在判斷點面關系前先用最簡單的方式做一次過濾判斷,讓只有滿足要求的點進入到角度和算法的判斷中,會對效率提示有更大的幫助。
這里,可以直接在獲取到點時使用范圍的四角坐標對該點進行過濾。
4.算法測試
因為GPS存在一定的誤差范圍,特將樂亭的邊界進行了一定的外延。然后將外延的范圍變成ring格式的json點串。然后選擇多個點進行測試。
重復測試多個樣本,均符合要求。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^