Determinare se due poligoni si sovrappongono in Google Maps?


12

Sto lavorando con google maps e poligoni, ma devo confermare che i poligoni non si sovrappongono.

Ho una funzione che restituisce VERO quando un punto (lat, lng) si trova all'interno di un poligono, ma non è sufficiente per determinare se ogni punto di un poligono si trova all'interno di un altro poligono.

Qualche suggerimento?


1
Mi ci sono voluti circa 10 secondi per trovare github.com/tparkin/Google-Maps-Point-in-Polygon . Hai provato qualcosa?
John Powell,

4
Ha scritto "Ho una funzione che restituisce VERO quando un punto (lat, lng) si trova all'interno di un poligono". Penso che sia una buona prova ma non risponde se l'intero poligono è all'interno di un altro.
user30184

1
Vorrei aggiungere la libreria Javascript Topology Suite al tuo progetto e trarre vantaggio dai suoi operatori spaziali per questo tipo di confronto. Ho fornito una risposta su una domanda simile che mostra come includere la libreria jsts in un progetto ed eseguire una dissolvenza / unione su due geometrie poligonali . Potresti trovare utile. Se avrò la possibilità, vedrò se riesco a trovare o creare un esempio che verifica l'intersezione di due geometrie: poligono, linea o punto non contano, si intersecano o no. :)
elrobis

Risposte:


8

Esempio JSFiddle

Ho creato un JSFiddle che dimostra una soluzione al tuo problema utilizzando la libreria JavaScript Topology Suite (JSTS) (JSTS).

spiegazione

Ci sono due passaggi per questo approccio. Il primo passo converte le tue geometrie di Google in espressioni geometriche WellKnownText (WKT) , un formato ampiamente supportato. Il secondo passaggio utilizza JSTS per eseguire un geometry.intersects()confronto JSTS di due geometrie WKT.

Per capire davvero questo, devi avere una conoscenza di base di WKT. Poiché le geometrie poligonali nella tua Google Map non sono ampiamente supportate, le converto immediatamente in geometrie WKT in modo che possiamo lavorare con esse in JSTS.

Per farlo facilmente, ho usato la libreria Wicket . Ovviamente puoi sempre eseguire l'home roll del tuo metodo Google-Polygon-to-WKT, oppure puoi usare uno di quelli che ho scritto una volta , oppure puoi usare qualche altra soluzione che potresti trovare. Personalmente, in questi giorni uso solo Wicket, che come puoi vedere, è semplicissimo:

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

Il prossimo è la carne e le patate - usando JSTS per prendere due geometrie WKT e testare se si intersecano o meno. Ancora una volta, basandosi sulla libreria, non c'è molto da fare:

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

Come ho collegato le biblioteche nel violino

Il violino collegato sopra e la soluzione che ho dimostrato richiede l'aggiunta di due librerie di terze parti al progetto: JSTS e Wicket. Ottenere il codice dai rispettivi Github e incorporarlo nel progetto è un esercizio diverso. Ma per il violino, mi sono collegato a quelle librerie facendo riferimento a esse in un esempio JSTS esistente che ho trovato pubblicato da Christopher Manning , così come la pagina demo di Wicket . Fondamentalmente ho aperto le pagine, selezionato "Visualizza sorgente" e raccolto riferimenti pertinenti alle due librerie. Questi erano gli endpoint esatti della libreria che ho usato:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.