文章著作權由作者李曉暉和部落格園共有,若轉載請於明顯處標明出處: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點串。然後選擇多個點進行測試。
重複測試多個樣本,均符合要求。