Compruebe si el punto lat / long está dentro de un conjunto de polígonos usando google maps

9

Sé cómo hacer lo anterior con Esri (tarea de consulta en shapefile), pero ¿esto también se puede hacer con Google Maps? ¿Tengo que consultar cada polígono o hay un método para consultar un conjunto de polígonos?

ngramsky
fuente

Respuestas:

9

La API de Google Maps aún no proporciona un método para verificar puntos en polígonos. Después de investigar un poco, me topé con el algoritmo de proyección de rayos que determinará si una coordenada XY está dentro de una forma trazada. Esto se traducirá en latitud y longitud. A continuación se extiende el google.maps.polygon.prototype para usar este algoritmo. Simplemente incluya este código en un punto del código después de que google.maps se haya cargado:

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

Aquí hemos ampliado la funcionalidad de google.maps.Polygon definiendo una función con el nombre 'Contiene' que se puede usar para determinar si la longitud de latitud proporcionada en el parámetro de la función está dentro del polígono o no. Aquí utilizamos el algoritmo de fundición de rayos y desarrollamos una función utilizando el mismo. Después de hacer todo este ejercicio ahora, podemos verificar un punto de la siguiente manera:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

Para obtener el código completo y la demostración, visite: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

techabhi
fuente
Sí, creo que el reparto de rayos es el camino a seguir. De hecho, utilicé ese algoritmo a través de un script de Python. Mi implementación se puede encontrar aquí: gramsky.blogspot.com/2012/12/…
ngramsky
Tuve que eliminar los bits que agregaron 360 a las coordenadas negativas para que esto funcione correctamente alrededor de la longitud 0.
user1431317
4

Yo iría al plugin Open Layers; buscarlo, y luego incluso puede agregar cualquier capa dinámica a su mapa y exportar.

* Antes de hacerlo, asegúrese de tener su CRS de proyecto (EPSG) configurado en WGS84 y que la transformación CRS 'sobre la marcha' esté habilitada en la configuración de Propiedades del proyecto.

Espero que esto ayude.

Bryce Touchstone
fuente
0

Si utiliza un programa de terceros como geodjango, puede verificar su punto, ya sea dentro de un conjunto de polígonos o no. Más información está aquí .

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

Espero que te ayude...

Aragón
fuente
0

Sé que esto es un poco tarde, pero podría ser útil en caso de que SomeOne no haya probado la biblioteca Android-Map-Utils. He publicado los métodos específicos de esta pregunta solo para Android. Aqui tienes:

https://stackoverflow.com/a/31988461/2054348

Sagar Shah
fuente