判斷點是否落在面中的Oracle預存程序描述

來源:互聯網
上載者:User

判斷點是否落在面中的Oracle預存程序描述

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點串。然後選擇多個點進行測試。

重複測試多個樣本,均符合要求。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.