文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。前端
公司在樂亭的項目中,工程同事提出了須要在對接車輛GPS上報點時,可以實時判斷該點是否落在樂亭行政區內。若是不在,將其報警。算法
處理思路分爲了兩種,一種是前端實時從數據庫中拉取存入的GPS點,而後判斷點是否落在區域面中。第二種,就是在與GPS廠商實時對接GPS數據,將GPS數據存入到我方數據庫中對應表時,就進行點是否落在區域面中的判斷,若是不是,則在對應表的判斷點面關係字段中將其標註。數據庫
考慮到效率以及記錄的保存,最後選擇第二種方案,即在數據庫層面進行操做,並保存判斷記錄方式。json
判斷點面關係的算法通常有以下幾種:微信
a差乘判別法(只針對凸多邊形)測試
b.面積判別法(只針對凸多邊形)優化
c.角度和判別法等(任意多邊形都可)blog
爲了之後存儲過程的通用性,選擇使用角度和判別法更符合需求。get
原理:令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裏面。
以上角度和算法是相對耗時的,若是咱們在判斷點面關係前先用最簡單的方式作一次過濾判斷,讓只有知足要求的點進入到角度和算法的判斷中,會對效率提示有更大的幫助。
這裏,能夠直接在獲取到點時使用範圍的四角座標對該點進行過濾。
由於GPS存在必定的偏差範圍,特將樂亭的邊界進行了必定的外延。而後將外延的範圍變成ring格式的json點串。而後選擇多個點進行測試。
重複測試多個樣本,均符合要求。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^