【问题标题】:Implementing Geofence - C#实施地理围栏 - C#
【发布时间】:2026-02-15 10:35:01
【问题描述】:

我需要在 C# 中实现地理围栏。地理围栏区域可以是圆形、矩形、多边形等。有没有人用 C# 实现地理围栏?

我找到了Geo Fencing - point inside/outside polygon。但是,它只支持多边形。

【问题讨论】:

  • 多边形通常包含矩形作为特例(假设您设法定义球体上的矩形实际上是什么)。圆可以用毕达哥拉斯定理来检验。

标签: c# geolocation latitude-longitude geo


【解决方案1】:

我已经测试了各种实现,这个例子对我来说工作正常:

Example

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

【讨论】:

  • 伟大的答案 Fnascimento!
【解决方案2】:

参考我的实现:

Polygon

Circle

【讨论】:

  • 这是您对 Circle 的实施,我无法以您的名义找到任何答案