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