实施Geofence-C#

实施Geofence-C#,c#,geolocation,latitude-longitude,geo,C#,Geolocation,Latitude Longitude,Geo,我需要在C#中实现Geofence。Geofence区域可以是圆形、矩形、多边形等。是否有人在C#中实现Geofence 我找到了。但是,它只支持多边形。请参阅我的实现: 我已经测试了各种实现,这个示例对我来说运行正常: publicstaticboolpolycontainspoint(列表点,p点){ bool-inside=false; //暗示了一个假想的闭合段, //因此,从这一点开始测试。 点v1=点[points.Count-1]; foreach(点v0,以点为单位) { 双

我需要在C#中实现Geofence。Geofence区域可以是圆形、矩形、多边形等。是否有人在C#中实现Geofence


我找到了。但是,它只支持多边形。

请参阅我的实现:


我已经测试了各种实现,这个示例对我来说运行正常:

publicstaticboolpolycontainspoint(列表点,p点){
bool-inside=false;
//暗示了一个假想的闭合段,
//因此,从这一点开始测试。
点v1=点[points.Count-1];
foreach(点v0,以点为单位)
{
双d1=(p.Y-v0.Y)*(v1.X-v0.X);
双d2=(p.X-v0.X)*(v1.Y-v0.Y);
如果(p.Y
作为特例,多边形通常包含矩形(前提是您能够定义球体上的矩形实际是什么)。圆可以用毕达哥拉斯定理来检验。这是你对圆的实现,我无法在你的名字中找到任何答案伟大的答案!!
public static bool PolyContainsPoint(List<Point> points, Point p) {
    bool inside = false;

    // An imaginary closing segment is implied,
    // so begin testing with that.
    Point v1 = points[points.Count - 1];

    foreach (Point v0 in points)
    {
        double d1 = (p.Y - v0.Y) * (v1.X - v0.X);
        double d2 = (p.X - v0.X) * (v1.Y - v0.Y);

        if (p.Y < v1.Y)
        {
            // V1 below ray
            if (v0.Y <= p.Y)
            {
                // V0 on or above ray
                // Perform intersection test
                if (d1 > d2)
                {
                    inside = !inside; // Toggle state
                }
            }
        }
        else if (p.Y < v0.Y)
        {
            // V1 is on or above ray, V0 is below ray
            // Perform intersection test
            if (d1 < d2)
            {
                inside = !inside; // Toggle state
            }
        }

        v1 = v0; //Store previous endpoint as next startpoint
    }

    return inside; 
}