Déterminer si deux polygones se chevauchent dans Google Maps?

12

Je travaille avec Google Maps et les polygones, mais je dois valider que les polygones ne se chevauchent pas.

J'ai une fonction qui renvoie VRAI lorsqu'un point (lat, lng) se trouve à l'intérieur d'un polygone, mais ce n'est pas suffisant pour déterminer si chaque point d'un polygone se trouve à l'intérieur d'un autre polygone.

Toute suggestion?

Marcelo Magarzo
la source
1
Il m'a fallu environ 10 secondes pour trouver github.com/tparkin/Google-Maps-Point-in-Polygon . Avez-vous essayé quelque chose?
John Powell
4
Il a écrit "J'ai une fonction qui renvoie VRAI quand un point (lat, lng) est à l'intérieur d'un polygone". Je pense que c'est un bon essai mais ne répond pas si tout le polygone est à l'intérieur d'un autre.
user30184
1
J'ajouterais la bibliothèque Javascript Topology Suite à votre projet et profiterais de ses opérateurs spatiaux pour ce genre de comparaison. J'ai fourni une réponse à une question similaire montrant comment inclure la bibliothèque jsts dans un projet et effectuer une dissolution / union sur deux géométries de polygones . Vous pourriez trouver cela utile. Si j'ai une chance, je verrai si je peux trouver ou créer un exemple qui teste l'intersection de deux géométries - le polygone, la ligne ou le point n'aura pas d'importance, ils se croisent ou non. :)
elrobis

Réponses:

8

Exemple JSFiddle

J'ai créé un JSFiddle démontrant une solution à votre problème en utilisant la bibliothèque JavaScript Topology Suite (JSTS) (JSTS).

Explication

Cette approche comporte deux étapes. La première étape convertit vos géométries Google en expressions géométriques WellKnownText (WKT) , qui est un format largement pris en charge. La deuxième étape utilise JSTS pour effectuer une geometry.intersects()comparaison JSTS de deux géométries WKT.

Pour vraiment comprendre cela, vous devrez avoir une compréhension de base de WKT. Étant donné que les géométries de polygones de votre Google Map ne sont pas largement prises en charge, je les convertis immédiatement en géométries WKT afin que nous puissions les utiliser dans JSTS.

Pour ce faire, j'ai utilisé la bibliothèque Wicket . Bien sûr, vous pouvez toujours lancer votre propre méthode Google-Polygon-to-WKT, ou vous pouvez en utiliser une que j'ai écrite une fois , ou vous pouvez utiliser une autre solution que vous pourriez trouver. Personnellement, ces jours-ci, j'utilise simplement Wicket, qui, comme vous pouvez le voir, est simple et méchant:

// 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];
}

Vient ensuite la viande et les pommes de terre - en utilisant JSTS pour prendre deux géométries WKT et tester si elles se croisent ou non. Encore une fois, en s'appuyant sur la bibliothèque, il n'y a pas grand-chose:

// 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.');
    }
}

Comment j'ai lié les bibliothèques dans le violon

Le violon lié ci-dessus et la solution que j'ai démontrée nécessitent l'ajout de deux bibliothèques tierces à votre projet - JSTS et Wicket. Obtenir le code de leurs Githubs respectifs et l'intégrer dans votre projet est un exercice différent. Mais pour le violon, j'ai lié à ces bibliothèques en les référençant dans un exemple JSTS existant que j'ai trouvé publié par Christopher Manning , ainsi que la propre page de démonstration de Wicket . Fondamentalement, j'ai ouvert les pages, sélectionné "View Source" et récupéré les références pertinentes aux deux bibliothèques. Ce sont des points de terminaison de bibliothèque exacts que j'ai utilisés:

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
la source
Aussi FWIW, il y a un certain chevauchement utile dans ce fil sur SO .
elrobis