2010-06-14 245 views

Respuesta

11

otra solución: Google-Maps-Point-in-Polygon

A Javascript Google Maps v3 e xtensión para la clase Polygon para detectar si un punto reside dentro de ella ...

+0

Por alguna extraña razón esto funciona, pero nunca pude obtener containsLocation de Google () funcionar para funcionar ..... – WildBill

+0

@WildBill - Necesitará la biblioteca de geometría para que funcione. Ejemplo:? Sensor = false & libraries = drawing, geometry – jjwdesign

+0

Agregué la biblioteca de geometría de Google pero aún no funciona para mí – AllJs

4

he utilizado este algoritmo para detectar que el punto se encuentra dentro del polígono: http://alienryderflex.com/polygon/

I añaden un nuevo método contains al polígono:

// Add a function contains(point) to the Google Maps API v.3 

google.maps.Polygon.prototype.contains = function(point) { 
    var j=0; 
    var oddNodes = false; 
    var x = point.lng(); 
    var y = point.lat(); 

    var paths = this.getPath(); 

    for (var i=0; i < paths.getLength(); i++) { 
    j++; 
    if (j == paths.getLength()) {j = 0;} 
    if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y)) 
    || ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) { 
     if (paths.getAt(i).lng() + (y - paths.getAt(i).lat()) 
    /(paths.getAt(j).lat()-paths.getAt(i).lat()) 
     * (paths.getAt(j).lng() - paths.getAt(i).lng())<x) { 
     oddNodes = !oddNodes 
     } 
    } 
    } 
    return oddNodes; 
} 

google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains; 
+0

Muy bueno, funciona. Simplemente cambie 'var x = point.getPosition(). Lng();' y 'var y = point.getPosition(). Lat();' –

21

Usted puede utilizar esto en Google Map V3: -

google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons); 

polígonos es un objeto devuelto por la función después de polygoncomplete.

var polygons=null; 
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) { 
     polygons=polygon; 
}); 

referencia https://developers.google.com/maps/documentation/javascript/reference

2

Cada método descrito aquí no de una manera u otra.

Los métodos dados por Andrei I y Natim No consideran polígonos con bordes geodésicas. Estos métodos tampoco se dan cuenta de que una ventaja no geodésica en Google Maps es solo directa dentro de la proyección de Mercator. Estos métodos suponen que los vértices se encuentran en una cuadrícula lat/lon de igual distancia, donde un grado de latitud equivale a un grado de longitud. Como resultado de este error, estos métodos indicarán que un punto está fuera del polígono, mientras se muestra dentro de algunos casos. Esto se observa fácilmente para bordes largos no verticales/no horizontales. Para resolver este problema, todos los puntos se deben convertir primero de latitud, longitud a coordenadas X, Y en la proyección de Mercator. Here is the method to convert the coordinates from lat/lon to x/y in Mercator. (Falta precisión) Rhumb line navigation can be used as a basis for an alternative method. La versión experimental 3.10 de Google Maps implementa este método.

El método mencionado por Paul Gibbs, swapnil udare, y Adi Lester hace consideran bordes geodésicas, pero a partir de Google Maps v3.9 se utiliza el mismo método mencionado anteriormente para los polígonos no geodésicas. Como tal, también sufre del mismo problema descrito anteriormente.

Actualización - El problema con Google Maps ha sido corregido en la versión experimental actual de Google Maps v3.10.

2

Sin necesidad de algoritmos complejos, pude lograr esto utilizando el método isPointInPath() de lienzo html.

http://www.w3schools.com/tags/canvas_ispointinpath.asp

Crear un elemento canvas. Dibuje un polígono con múltiples puntos finales utilizando los métodos moveTo(), lineTo(). Verificar si un punto (x, y) se encuentra dentro del polígono utilizando el método isPointInPath().

<canvas id="canvas"></canvas> 

//x,y are coordinate of the point that needs to be tested 
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3.... 
function isPointInPolygon(x, y, coordinates) { 
var ctx = canvas.getContext("2d"); 
var coords = coordinates.split(','); 

if (coords != null && coords.length > 4) { 
    ctx.beginPath(); 
    ctx.moveTo(coords[0], coords[1]); 
    for (j = 2; j < coords.length; j++) { 
     ctx.lineTo(coords[j], coords[j + 1]); 
     j++; 
    } 
    ctx.closePath(); 
    if (ctx.isPointInPath(x, y)) 
     return true; 
    else 
     return false; 
} 
return false; 
} 
+0

El póster preguntaba por Polygons en los mapas de Google. No todos los navegadores admiten lienzos y el método anterior supone una cuadrícula X, Y estándar. Si uno está dibujando en un lienzo, el método anterior es perfecto, de lo contrario, es un desperdicio. Los otros métodos mencionados anteriormente pueden calcular esto sin la sobrecarga de dibujar en un lienzo. El mejor método de Google Maps v3.10 es google.maps.geometry.poly.containsLocation() ya que maneja polígonos geodésicos y polígonos mercator. – deAtog

+0

Estoy de acuerdo. No responde exactamente esta pregunta, pero podría ayudar a las personas que trabajan en el entorno html5 y terminar en esta publicación para detectar puntos en el polígono. Llegué a esta publicación e intenté implementar todos los algoritmos, pero nada funcionó a la perfección. Básicamente implementé un mapa personalizado en una imagen de planta con lienzo. Tuve que mostrar información sobre herramientas en diferentes partes de la imagen e imitar la funcionalidad del mapa de imágenes html. –

Cuestiones relacionadas