周喜平 姜斌
摘要:在車輛監控的地圖上,繪制一種基于矩形、圓形、多邊形的電子圍欄,當車輛在區域內滿足相應條件的時候,能夠報警或者做一些其他聯動處理。利用車輛GPS坐標結合電子圍欄的地圖信息,建立數學模型,設計算法,并通過編程實現車輛出區入區的判斷。該設計通過實際應用,效果較好。
關鍵詞:車輛監控;電子圍欄;出區入區;GPS坐標
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)13-0107-03
Abstract: On the vehicle monitoring map, draw a rectangle, circle, polygon of the electronic fence, when the vehicle in the area to meet the appropriate conditions, can alarm or do some other linkage processing. By using the GPS coordinate of the vehicle and the map information of the electronic fence, the mathematical model is built, and the algorithm is designed. This software is implemented by programming. This software through the practical application, the effect is good.
key words: vehicle monitoring ;electronic fence;GPS coordinate
1 背景
基于地圖的車輛監控系統中,電子圍欄是一個非常實用的功能。所謂電子圍欄,就是在地圖上繪制一個圖形區域,如果車輛進入或者離開該區域,監控系統會按照事先設定的條件,觸發相關的處理程序。該區域可以是規則的矩形、圓形,也可以是不規則的圖形,比如不規則的多邊形。本設計針對矩形、圓形和不規則的多邊形,進行討論,提供一種解決方法,設計實現的算法,并通過Java編程實現應用程序。
2 設計與實現
一般的車輛監控系統中,車輛的GPS位置信息是通過安裝在車上的GPS芯片完成GPS位置信息的感知,并通過通信網絡接入到采集服務器中。采集服務器將采集到的位置信息進行持久化,以備數據分析和后期處理。本設計以關系數據庫為例,假設位置信息是保存在關系數據庫中的。另外,GPS芯片感知的位置信息中,經緯度是地球坐標系,在不同的地圖上進行展示時,還要轉換成對應地圖支持的坐標系,否則會產生較大偏移。關于坐標系的轉換,這里不再論述,這里假定地圖是直接支持地球坐標系的。
GPSinfo表用以保存位置信息,其結構為GPSinfo(carid,lng,lat,addtime),carid為車輛標識,lng為經度信息,類型為浮點型,lat為緯度信息,類型為浮點型,addtime為采集的時間。一個代表性的數據是(7698,113.653655,35.045452, ‘2015/9/15 20:50:18‘)。
2.1 矩形區域處理
針對矩形區域處理,復雜度較低。設矩形ABCD的四個頂點分別為A,、B、C、D,坐標分別為A(x1,y1,)(x1,y1為A點經度緯度坐標,下同)、B(x 2,y2,)、C(x3,y3,)、D(x4,y4,),設點E(x5,y5)是采集到的車輛的坐標,那么判斷E點在矩形區域的方法是:x5>x3 且 x5 2.2 圓形區域處理 對于圓形區域,我們假設地球是正圓的,同時假設圓心為B(Xb,Yb),A(Xa,Ya)為判斷的點, Xb,Yb為B點經緯度,Xa,Ya為A點經緯度,A、B是地求表面的兩個點,如圖2中的a所示,已知A、B兩點的經度后,我們可以計算CD的地表長度為: 其中,R可取值6378千米,PI可取值3.1416。考慮到查詢的性能,我們可以在查詢之前,對查找的記錄做一些預篩選,找到圓的外切正方形的四個頂點,按照判斷點在矩形區域的方法,找到矩形區域中的點,之后再判斷是否在圓內,由于減少了記錄數量,查詢性能上有所提升。 2.3 多邊形區域處理 如圖3,判斷點p在多邊形內的方法是:用p點的水平坐標去和多邊形相交,得到若干個交點,如果點p兩側的交點數量都是奇數個時,說明p點在多邊形內,即鉛垂線內點法[1]。使用這種方法,適合任意多邊形,包括凸多邊形和凹多邊形,同時適用于有孔的多邊形。下面給出這種算法的Java實現,其中polySides是多邊形的頂點數量,polyX為頂點的x坐標數據,polyY為頂點的Y坐標數組。若方法pointInPolygon返回true則表名測試點t(x,y)在多邊形內部。 boolean pointInPolygon() { int i,j=polySides-1 ; boolean oddNodes=false; for (i=0;i if(polyY[i] if(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i]) oddNodes=!oddNodes; } } j=i; } return oddNodes; } 其實,在Java語言的開發環境中,提供了一種便捷的方法。類java.awt.geom.GeneralPath提供了根據直線、二次曲線和三次 (Bézier) 曲線構造的幾何路徑的方法,同時GeneralPath類繼承類Path2D,通過Path2D類提供的方法contains(double x, double y) 來判斷某個點是否在曲線或直線構成的邊界內。一種可行的使用方法是: Point2D.Double first = polygon.get(0); p.moveTo(first.x, first.y); for (Point2D.Double d : polygon) p.lineTo(d.x, d.y); p.lineTo(first.x, first.y); p.closePath(); return p.contains(point); 其中p為構造的GeneralPath對象,polygon包含了多邊形頂點的List對象,每個頂點被定義為Point2D.Double類型。point 則是要判斷的點,其類型也為Point2D.Double。p.contains (point)返回true則表示點point包含在多邊形polygon內。 在處理數據庫中的數據時,可以先將多邊形外切的矩形作為選區,選出滿足矩形選區的點,之后可以在判斷選出的點是否在多邊形區域內,這樣可以一定程度上改善數據庫操作的性能。 3 結束語 以上處理方法,在實際應用中取得了較好的效果,圖4、5、6分別展示了當車進入矩形、圓形、多邊形區域后立即顯示到地圖上的效果。如果結合出區入區的其他條件,比如出入區時間、區域內車輛速度、出入區次數等其他條件,則能夠設計和實現更加復雜的程序,以滿足更多的應用場合。 參考文獻: [1] 王潤科, 張彥麗. 判斷點與多邊形位置關系的算法綜述[J]. 甘肅聯合大學學報, 2006,20(11): 32-35.