介绍

使用GPS跟踪设备的GPS跟踪软件的一个重要功能是地理围栏及其帮助跟踪资产的能力。地理围栏允许GPS跟踪解决方案的用户在工作场所、客户场所和安全区域周围绘制区域(即地理围栏)。当这些地理围栏被配备GPS的车辆或人员越过时,可以通过短信或电子邮件向用户或运营商发出警告。

关怀区域异常回报

地理围栏是地理区域上使用基于位置的服务的虚拟周界,因此当地理围栏设备进入或退出该区域时,将生成通知。通知可以包含有关设备位置的信息,并且可以发送到移动电话或电子邮件帐户。参考文献:http://en.wikipedia.org/wiki/geofance

背景

对于地理围栏,我使用了多边形地理围栏方法,即在路线或区域周围绘制多边形。使用这种方法,GPS跟踪设备可以在多边形内部或外部进行跟踪。

确定一个点

如果点X,Y在多边形内,函数将返回true,否则返回false。如果点正好在多边形的边上,则函数可能返回true或false。感谢您的文章“确定一个点是否在复杂多边形内”。

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;
}

在多边形地图上查看要绘制的多边形和多边形的角点:PolygonPoints.XML). 函数的作用是:使用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";

Tags: 围栏算法, 地理围栏

Related Posts:

Leave a Comment