Ustalanie, czy dwa wielokąty pokrywają się w Mapach Google?

12

Pracuję z mapami Google i wielokątami, ale muszę sprawdzić, czy wielokąty się nie nakładają.

Mam funkcję, która zwraca PRAWDA, gdy punkt (lat, lng) znajduje się wewnątrz wielokąta, ale nie wystarczy ustalić, czy każdy punkt wielokąta znajduje się w innym wielokącie.

Jakieś sugestie?

Marcelo Magarzo
źródło
1
Zajęło mi około 10 sekund, aby znaleźć github.com/tparkin/Google-Maps-Point-in-Polygon . Próbowałeś czegoś?
John Powell,
4
Napisał „Mam funkcję, która zwraca PRAWDA, gdy punkt (lat, lng) znajduje się wewnątrz wielokąta”. Myślę, że to dobra próba, ale nie odpowiada, jeśli cały wielokąt jest w innym.
user30184,
1
Dodałbym bibliotekę JavaScript Topology Suite do twojego projektu i skorzystałem z jej operatorów przestrzennych do tego rodzaju porównania. Udzieliłem odpowiedzi na podobne pytanie pokazujące, jak włączyć bibliotekę jsts do projektu i wykonać połączenie / połączenie na dwóch geometriach wielokątów . Może ci się to przydać. Jeśli mam szansę, zobaczę, czy mogę znaleźć lub stworzyć przykład, który sprawdza, czy przecięcie dwóch geometrii - wielokąta, linii lub punktu nie będzie miało znaczenia, albo się przecinają, albo nie. :)
elrobis
Przyjrzyj się
Króliczek Gruff

Odpowiedzi:

8

Przykład JSFiddle

Stworzyłem JSFiddle demonstrujący rozwiązanie twojego problemu za pomocą biblioteki JavaScript Topology Suite (JSTS) (JSTS).

Wyjaśnienie

Istnieją dwa kroki do tego podejścia. Pierwszy krok konwertuje geometrie Google na wyrażenia geometryczne WellKnownText (WKT) , który jest powszechnie obsługiwanym formatem. Drugi krok wykorzystuje JSTS do geometry.intersects()porównania JSTS dwóch geometrii WKT.

Aby naprawdę to zrozumieć, musisz mieć podstawową wiedzę na temat WKT. Ponieważ geometrie wielokątów na mapie Google nie są powszechnie obsługiwanym formatem, natychmiast przekonwertowałem je na geometrie WKT, abyśmy mogli z nimi pracować w JSTS.

Aby to zrobić łatwo, skorzystałem z biblioteki Wicket . Oczywiście zawsze możesz rzucić do domu własną metodę Google-Polygon-do-WKT, możesz też użyć metody, którą napisałem dawno temu , lub możesz użyć innego rozwiązania, które możesz znaleźć. Osobiście w dzisiejszych czasach używam Wicket, który, jak widać, jest niesamowicie prosty:

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

Następne jest mięso i ziemniaki - używając JSTS do pobrania dwóch geometrii WKT i sprawdzenia, czy się przecinają. Po raz kolejny, opierając się na bibliotece, nie ma w niej wiele:

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

Jak połączyłem biblioteki w skrzypcach

Skrzypce połączone powyżej, a rozwiązanie, które pokazałem, wymaga dodania dwóch bibliotek zewnętrznych do twojego projektu - JSTS i Wicket. Pobieranie kodu z odpowiednich Githubów i włączanie go do projektu to inne ćwiczenie. Ale na skrzypce, podłączyłem do tych bibliotek, odwołując się do nich w istniejącym przykładzie JSTS opublikowanym przez Christophera Manninga , a także na własnej stronie demo Wicket . Zasadniczo otworzyłem strony, wybrałem „Wyświetl źródło” i zebrałem odpowiednie odniesienia do dwóch bibliotek. To były dokładne punkty końcowe biblioteki, których użyłem:

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
źródło
Również FWIW, istnieje pewne przydatne nakładanie się tego wątku w SO .
elrobis