13 votos

La determinación de si dos polígonos son la superposición de los Mapas de Google?

Estoy trabajando con google maps y polígonos, pero tengo que validar que los polígonos no se superponen unos a otros.

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

Alguna sugerencia?

10voto

warsze Puntos 178

JSFiddle Ejemplo

He creado un JSFiddle demostrando una solución a su problema mediante el JavaScript de la Topología de la Suite (JSTS) (JSTS) de la biblioteca.

Explicación

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

Para comprender realmente este deberá tener una comprensión básica de WKT. Debido a que el polígono geometrías en su Mapa de Google no son ampliamente apoyadas formato, puedo convertir de inmediato en WKT geometrías de manera que podamos trabajar con ellos en JSTS.

Para hacer esto fácilmente, he utilizado el de la Peatonal de la biblioteca. Por supuesto, usted puede siempre en casa-rollo de su propia Google-Polígono a-WKT método, o eres bienvenido a utilizar uno me escribió una vez, o puede utilizar alguna otra solución que usted pueda encontrar. Personalmente, en estos días acabo de uso Peatonal, que como se puede ver, es malvado-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 el de la carne y las patatas, utilizando JSTS tomar dos WKT geometrías y probar si o no que se cruzan. Una vez más, confiando en la biblioteca, no hay mucho a ella:

// 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 he enlazado las bibliotecas en el Violín

El violín enlazado más arriba, y la solución que he demostrado requiere la adición de dos 3ª parte de las bibliotecas para su proyecto--JSTS, y de la Peatonal. Conseguir el código de sus respectivos Githubs y la incorporación de éste en el proyecto es un ejercicio diferente. Pero para el violín, me vinculadas a las bibliotecas por referencia a los mismos en una ya existente JSTS ejemplo he encontrado publicado por Christopher Manning, así como de la Peatonal de la propia página de demostración. Básicamente me abrió las páginas, selecciona "Ver código Fuente", y arrebató las referencias a las dos bibliotecas. Estos eran exacta de la biblioteca de los extremos que he usado:

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X