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

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/前端

1.背景

公司在樂亭的項目中,工程同事提出了須要在對接車輛GPS上報點時,可以實時判斷該點是否落在樂亭行政區內。若是不在,將其報警。算法

處理思路分爲了兩種,一種是前端實時從數據庫中拉取存入的GPS點,而後判斷點是否落在區域面中。第二種,就是在與GPS廠商實時對接GPS數據,將GPS數據存入到我方數據庫中對應表時,就進行點是否落在區域面中的判斷,若是不是,則在對應表的判斷點面關係字段中將其標註。數據庫

考慮到效率以及記錄的保存,最後選擇第二種方案,即在數據庫層面進行操做,並保存判斷記錄方式。json

2.判斷點面關係的算法

2.1 算法選擇

判斷點面關係的算法通常有以下幾種:微信

a差乘判別法(只針對凸多邊形)測試

b.面積判別法(只針對凸多邊形)優化

c.角度和判別法等(任意多邊形都可)blog

爲了之後存儲過程的通用性,選擇使用角度和判別法更符合需求。get

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/

                                                                           若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                      

相關文章
相關標籤/搜索