65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (12投票s)

2010年3月5日

CPOL

2分钟阅读

viewsIcon

238962

downloadIcon

7103

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

引言

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

地理围栏

地理围栏是使用基于位置的服务在地理区域上建立的虚拟边界,当地理围栏设备进入或离开该区域时,会生成通知。该通知可以包含设备位置信息,并可能发送到移动电话或电子邮件帐户。参考:http://en.wikipedia.org/wiki/Geofence

背景

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

确定一个点

如果点X,Y在多边形内部,该函数将返回 true,如果不在内部,则返回 false。如果点正好在多边形的边缘上,则该函数可能返回 truefalse。感谢文章“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";
© . All rights reserved.