使用多边形方法的简单地理围栏






4.13/5 (12投票s)
使用多边形方法的简单地理围栏。
引言
GPS跟踪软件使用GPS跟踪设备的一个重要功能是地理围栏,以及它帮助跟踪资产的能力。地理围栏允许GPS跟踪解决方案的用户在工作场所、客户站点和安全区域周围绘制区域(即地理围栏)。当配备GPS的车辆或人员跨越这些地理围栏时,可以通过短信或电子邮件向用户或操作员触发警告。
地理围栏
地理围栏是使用基于位置的服务在地理区域上建立的虚拟边界,当地理围栏设备进入或离开该区域时,会生成通知。该通知可以包含设备位置信息,并可能发送到移动电话或电子邮件帐户。参考:http://en.wikipedia.org/wiki/Geofence。
背景
对于地理围栏,我使用了多边形地理围栏方法,在该方法中围绕路线或区域绘制多边形。使用这种方法,GPS跟踪设备可以被跟踪在多边形内部或外部。
确定一个点
如果点X,Y在多边形内部,该函数将返回 true
,如果不在内部,则返回 false
。如果点正好在多边形的边缘上,则该函数可能返回 true
或 false
。感谢文章“Determining Whether A Point Is Inside A Complex Polygon”。
public bool FindPoint(double X, double Y)
{
int sides = this.Count() - 1;
int j = sides - 1;
bool pointStatus = false;
for (int i = 0; i < sides; i++)
{
if (myPts[i].Y < Y && myPts[j].Y >= Y ||
myPts[j].Y < Y && myPts[i].Y >= Y)
{
if (myPts[i].X + (Y - myPts[i].Y) /
(myPts[j].Y - myPts[i].Y) * (myPts[j].X - myPts[i].X) < X)
{
pointStatus = !pointStatus ;
}
}
j = i;
}
return pointStatus;
}
创建多边形

在地图上绘制一个多边形到要进行地理围栏的区域,并捕获多边形的角点并将其存储到XML文件中(参见:PolygonPoints.XML)。loadData()
函数将使用XML文件中定义的角点创建多边形。
private void loadData()
{
DataSet ds = new DataSet();
ds.ReadXml("PolygonPoints.XML");
foreach (DataRow dr in ds.Tables[0].Rows)
{
Point p = new Point();
//Convert Latitude into degrees
String Lat = dr[0].ToString();
double LatSec = Double.Parse(Lat.Substring(4, 4)) / 6000;
double LatMin = (Double.Parse(Lat.Substring(2, 2)) + LatSec) / 60;
p.X = Double.Parse(Lat.Substring(0, 2)) + LatMin;
//Convert Longitude into degrees
String Long = dr[1].ToString();
double LongSec = Double.Parse(Long.Substring(5, 4)) / 6000;
double LongMin = (Double.Parse(Long.Substring(3, 2)) + LongSec) / 60;
p.Y = Double.Parse(Long.Substring(0, 3)) + LongMin;
points.Add(p);
}
}
示例代码

当您运行并输入多边形外部的经度和纬度时,将显示消息“点不在路线中”,否则将显示消息“点在路线中”。

PolyGon myRoute = new PolyGon(points);
bool stat = myRoute.FindPoint(Double.Parse(txtLat.Text.ToString()),
Double.Parse(txtLang.Text.ToString()));
if(stat)
{
lblResult.Text = "Point found in the route";
}
else
lblResult.Text = "Point not found in the route";