【问题标题】:c# Check if point exist inside a polygonc# 检查点是否存在于多边形内
【发布时间】:2016-01-17 11:10:53
【问题描述】:

您好,我正在寻找一种方法来从我的 c# 代码中检查一个点是否存在于多边形内。我使用 Google 地图几何库 作为 this link 的参考成功地使用 javascript 实现了相同的功能.现在我需要从 c# 代码中做同样的事情。谷歌是否提供任何 web 服务或 dll 来做同样的事情?

如果没有,任何人都可以为相同目的推荐任何第三方 api 或插件。我已经尝试了一些第三方项目,但没有找到任何提供准确性的工具,如谷歌地图几何库

【问题讨论】:

  • gis.stackexchange.com 可能更适合这类问题

标签: javascript c# google-maps google-maps-api-3 geometry


【解决方案1】:

这个问题对编程来说是微不足道的。

为简化起见,首先假设测试点位于原点。您需要检查正 X 轴与多边形边缘的交点数量的奇偶性。

Inside= False
for k in in 0..N-1:
    if (Y[k] > 0) != (Y[k+1] > 0):
        # The edge straddles the X-axis...
        if (Y[k] > 0) == (Y[k] * X[k+1] > Y[k+1] * X[k]):
            # ... and intersects it on the positive side
            Inside= not Inside

N为模,得到N≡0

对于不在原点的测试点,只需转换所有多边形顶点的坐标即可,无需实际修改多边形即可。

如果多边形穿过 180° 子午线,则在经度 ± 360° 的情况下重复多边形内点测试。

【讨论】:

  • 谷歌是否有任何 api 或 web 服务可以从服务器端进行操作
【解决方案2】:
private static bool EstaDentroDeZona(double latitudActual, double longitudActual, List<PuntoPorZona> listaPuntosPorZona)
    {
        Punto<double> vector1 = new Punto<double>();
        Punto<double> vector2 = new Punto<double>();



        int i = 0;
        double a = 0;

        for (i = 0; i < listaPuntosPorZona.Count - 1; i++)
        {
            vector1.X = Convert.ToDouble(listaPuntosPorZona[i].Latitud) - latitudActual;
            vector1.Y = Convert.ToDouble(listaPuntosPorZona[i].Longitud) - longitudActual;
            vector2.X = Convert.ToDouble(listaPuntosPorZona[i + 1].Latitud) - latitudActual;
            vector2.Y = Convert.ToDouble(listaPuntosPorZona[i + 1].Longitud) - longitudActual;

            a = a + Angulo(vector1, vector2);
        }

        double grados = a * 180 / Math.PI;
        return Math.Abs(grados) > 180;
    }

    private static double Angulo(Punto<double> v1, Punto<double> v2)
    {
        double angulo;
        double calculoModulos;
        double calculoProductoEscalar;
        calculoModulos = Modulo(v1) * Modulo(v2);
        calculoProductoEscalar = ProductoEscalar(v1, v2);

        if (ModuloDelProductoVectorialConSigno(v1, v2) > 0)
        {
            angulo = Math.Acos(calculoProductoEscalar / calculoModulos);
        }
        else
        {
            angulo = -1 * (Math.Acos(calculoProductoEscalar / calculoModulos));
        }
        return angulo;
    }

    private static double ProductoEscalar(Punto<double> punto1, Punto<double> punto2)
    {
        double productoEscalcar;
        productoEscalcar = (punto1.X * punto2.X) + (punto1.Y * punto2.Y);
        return productoEscalcar;
    }

    private static double Modulo(Punto<double> punto)
    {
        double modulo;
        modulo = Math.Sqrt(punto.X * punto.X + punto.Y * punto.Y);
        return modulo;
    }

    private static double ModuloDelProductoVectorialConSigno(Punto<double> v1, Punto<double> v2)
    {
        double angulo = ((v1.X * v2.Y) - (v1.Y * v2.X));
        return angulo;
    }

    private struct Punto<T>
    {
        T x;
        T y;

        public Punto(T a, T b)
        {
            x = a;
            y = b;
        }

        public T X
        {
            get { return x; }
            set { x = value; }
        }

        public T Y
        {
            get { return y; }
            set { y = value; }
        }
    }

刚刚翻译成英文方法

listaPuntoPorZona = 多边形点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多