lunes, febrero 15, 2010

Cómo detectar si un punto esta fuera o dentro de un polígono en Google Map

Cuando estamos trabajando con Google Maps puede que nos encontremos con la situación de querer detectar si un determinado punto (una coordenada) está fuera o dentro de un área que hayamos delimitado con un polígono (una serie de puntos).
Por defecto el API de Google Map no soporta esta opción (o yo no se la he encontrado). La única opción es usando la función getBounds() pero esta no tiene encuenta todos los puntos sino que trata el polígono como si de un rectángulo se tratara.

La función que os pongo a continuación y que no he escrito yo pero que no recuerdo donde la encontré os solucionará este problema:

// The problem with the default functions in Google Map API is they only use two points for the polygon.
// With this new function we are going to use all the points.
GPolygon.prototype.containsLatLng = function(latLng) {

// Firstly we try with the bounds (remember, it's a rectangle). We can avoid to do the calculation.
// If the point it's outside of the rectangle then it's outside of the polygon.
var bounds = this.getBounds();
if(!bounds.containsLatLng(latLng)) {
return false;
}

// Now we know the point is inside of the rectangle but we have to check if it's inside of the polygon

var numPoints = this.getVertexCount();
var inPoly = false;
var i;
var j = numPoints-1;

for(var i=0; i < numPoints; i++) {
var vertex1 = this.getVertex(i);
var vertex2 = this.getVertex(j);

if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) {
if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
inPoly = !inPoly;
}
}

j = i;
}

return inPoly;
};

10 comentarios:

  1. Tengo una app similar, pero ya tengo los puntos listo en un KML generado con gogle earth, lo que quiero es saber si la geolocalizacion que me da el dispositivo, o un punto determinado en coordenadas con su latitud y longitud, esta dentro o afuera, cabe señalar que puedo tener n cantidad de puntos q componen el poligono..

    ResponderEliminar
  2. un ejemplo un poco mas completo please me quede con muchas dudas ...xd

    ResponderEliminar
  3. Ese código vale para cualquier forma de polígono con "n" esquinas o es sólo válido para polígonos rectangulares (sólo 4 esquinas ortogonales entre sí)

    ResponderEliminar
  4. Hola Daniel, el código debería funcionar para cualquier polígono, independientemente del número de esquinas, aunque tiene más de 5 años así que no se que tal funcionara con la actual API

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Hola, como uso ese codigo ?? me refiero a si lo debo de meter en una función o como le hago ?? saludos

    ResponderEliminar
  7. No Arturo, ese código añade una nueva función al objeto GPolygon que es parte del API the GMaps. De forma que cuando tengas tu polígono ya definido sólo tienes que usar esta nueva función pasando una coordenada para saber si esta se encuentra dentro del polígono o no.
    A tu pregunta, simplemente copia/pega el código en un fichero .js que estés importando (o en un html entre las tags script)

    ResponderEliminar
  8. Alguien podría explicarme en qué consiste el segundo if?

    ResponderEliminar