判斷點是否落在面中的Oracle存儲過程描述


文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處: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/

                                                                           如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM