¿Determinar si dos polígonos se superponen en Google Maps?

12

Estoy trabajando con google maps y polígonos, pero tengo que validar que los polígonos no se superponen entre sí.

Tengo una función que devuelve VERDADERO cuando un punto (lat, lng) está dentro de un polígono, pero no es suficiente para determinar si cada punto de un polígono está dentro de otro polígono.

¿Cualquier sugerencia?

Marcelo Magarzo
fuente
1
Me llevó unos 10 segundos encontrar github.com/tparkin/Google-Maps-Point-in-Polygon . ¿Intentaste algo?
John Powell
44
Escribió "Tengo una función que devuelve VERDADERO cuando un punto (lat, lng) está dentro de un polígono". Creo que es una buena prueba, pero no responde si todo el polígono está dentro de otro.
user30184
1
Yo añadiría la biblioteca de Javascript topología suite a su proyecto y aprovechar sus operadores espaciales para este tipo de comparación. Proporcioné una respuesta a una pregunta similar que muestra cómo incluir la biblioteca jsts en un proyecto y realizar una disolución / unión en dos geometrías de polígonos . Puede que te resulte útil. Si tengo la oportunidad, veré si puedo encontrar o crear un ejemplo que pruebe la intersección de dos geometrías: el polígono, la línea o el punto no importan, se cruzan o no. :)
elrobis

Respuestas:

8

JSFiddle Ejemplo

He creado un jsFiddle demostrando una solución a su problema usando el JavaScript topología Suite (JSTS) (JSTS) biblioteca.

Explicación

Hay dos pasos para este enfoque. El primer paso convierte sus geometrías de Google en expresiones de geometría WellKnownText (WKT) , que es un formato ampliamente compatible. El segundo paso usa JSTS para realizar una geometry.intersects()comparación JSTS de dos geometrías WKT.

Para comprender realmente esto, necesitará tener una comprensión básica de WKT. Debido a que las geometrías de polígonos en su mapa de Google no tienen un formato ampliamente compatible, las convierto inmediatamente en geometrías WKT para que podamos trabajar con ellas en JSTS.

Para hacer esto fácilmente, utilicé la biblioteca Wicket . Por supuesto, siempre puede crear su propio método Google-Polygon-to-WKT, o puede usar uno que escribí alguna vez , o puede usar alguna otra solución que pueda encontrar. Personalmente, en estos días solo uso Wicket, que como puedes ver, es muy simple:

// Pass in two Google Polygon objects.
// It returns two WellKnownText (WKT) geometry expressions.
// 
function UseWicketToGoFromGooglePolysToWKT( poly1, poly2 )
{
    var wicket = new Wkt.Wkt();

    wicket.fromObject(poly1);
    var wkt1 = wicket.write();

    wicket.fromObject(poly2);
    var wkt2 = wicket.write();

    return [wkt1, wkt2];
}

El siguiente es la carne y las papas: usar JSTS para tomar dos geometrías WKT y probar si se cruzan o no. Una vez más, confiando en la biblioteca, no hay mucho:

// Pass in two WKT geometry expressions.
// It performs a JSTS intersects() comparison.
// 
function UseJstsToTestForIntersection( wkt1, wkt2 )
{
    // Instantiate JSTS WKTReader and get two JSTS geometry objects
    var wktReader = new jsts.io.WKTReader();
    var geom1 = wktReader.read(wkt1);
    var geom2 = wktReader.read(wkt2);

    if (geom2.intersects(geom1)) {
      alert('intersection confirmed!');
    } else {
      alert('..no intersection.');
    }
}

Cómo vinculé las bibliotecas en Fiddle

El violín vinculado anteriormente, y la solución que demostré requiere agregar dos bibliotecas de terceros a su proyecto: JSTS y Wicket. Obtener el código de sus respectivos Githubs e incorporarlo a su proyecto es un ejercicio diferente. Pero para el violín, me vinculé a esas bibliotecas haciendo referencia a ellas en un ejemplo JSTS existente que encontré publicado por Christopher Manning , así como a la página de demostración de Wicket . Básicamente, abrí las páginas, seleccioné "Ver código fuente" y seleccioné referencias relevantes a las dos bibliotecas. Estos fueron los puntos finales exactos de la biblioteca que utilicé:

http://arthur-e.github.io/Wicket/wicket.js
http://arthur-e.github.io/Wicket/wicket-gmap3.js
http://bl.ocks.org/christophermanning/raw/4450188/javascript.util.min.js
http://bl.ocks.org/christophermanning/raw/4450188/jsts.min.js
elrobis
fuente
También FWIW, hay una superposición útil en este hilo en SO .
elrobis