Anonymous user  |  Log in  |  Create Account


Points inside a gPolygon
Return to the code gallery
Autor: alee
Publicado: 12/11/2007
Leído: 63821 veces
Comentarios (0)
Valoracion: 3.15972


/**** Explicación / Description  ****/

Castellano
La función GetPointsIntoPolygon recibe como parámetro una lista de GLatLng que representan los puntos ordenados de un polígono y otra lista de GLatLng que son los puntos que queremos saber si están dentro de este polígono.

IsOnRigth nos indica si el punto esta sobre la derecha o izquierda de la recta que une dos puntos del polígono.

La forma de determinar si un punto esta dentro de un poligono es saber cuantas veces se encuentra a la derecha de las rectas que conforman los puntos.

Recordar pasar en orden los puntos del poligono como si se fuera a escribir a mano.

En algun aspx que tenga un mapa utilicen un foreach para recorrer el retorno de GetPointsIntoPolygon y tendran los puntos que estan dentro de la zona que pasaron como parametro.

Alejo Pagadizabal.


English


/**** Código de servidor / Server code  ****/

using System.Collections.Generic;
using Subgurim.Controles;

/// <summary>
    /// recorre todas las rectas de poligono y ve si los puntos estan dentro de esta zona.
    /// si la cantidad de veces que esta a la derecha de las rectas es impar entonces esta dentro.
    /// </summary>
    /// <param name="Polypuntos"></param>
    /// <param name="puntos"></param>
    /// <returns></returns>
    public List<GLatLng> GetPointsIntoPolygon(List<GLatLng> Polypuntos, List<GLatLng> puntos)
    {
        List<GLatLng> retorno = new List<GLatLng>();
        Polypuntos.Add(Polypuntos[0]);

        int x = 0;
        int valor = 0;
        foreach (GLatLng punto in puntos)
        {
            x = 0;
            valor = 0;
            while (x + 1 < Polypuntos.Count)
            {
                if (IsOnRigth(Polypuntos[x], Polypuntos[x + 1], punto))
                    valor++;
                x++;
            }

            //si es impar entonces esta dentro de punto.
            if ((valor % 2) != 0)
                retorno.Add(punto);
        }
        return retorno;
    }

    /// <summary>
    /// Retorna true si el punto esta a la derecha.
    /// </summary>
    /// <param name="PolyPointA"></param>
    /// <param name="PolyPointB"></param>
    /// <param name="point"></param>
    /// <returns></returns>
    private Boolean IsOnRigth(GLatLng PolyPointA, GLatLng PolyPointB, GLatLng point)
    {
        //x = Long
        //y = Lat
        double M = 0;
        double LngInFunction = 0;
        //Si el punto esta entre la Lat de los dos puntos
        if ((PolyPointA.lat >= point.lat && PolyPointB.lat <= point.lat) || (PolyPointB.lat >= point.lat && PolyPointA.lat <= point.lat))
        {
            M = (PolyPointA.lat - PolyPointB.lat) / (PolyPointA.lng - PolyPointB.lng);
            LngInFunction = ((point.lat - PolyPointA.lat) / M) + PolyPointA.lng;
            //si esta a la derecha, sumo uno, sino no hago nada.
            if (LngInFunction <= point.lng)
                return true;
        }
        return false;
    }




Powered by Subgurim.NET