Determinando se dois polígonos estão sobrepostos no Google Maps?

12

Estou trabalhando com o Google Maps e polígonos, mas tenho que validar que os polígonos não se sobrepõem.

Eu tenho uma função que retorna TRUE quando um ponto (lat, lng) está dentro de um polígono, mas não é suficiente para determinar se todos os pontos de um polígono estão dentro de outro polígono.

Alguma sugestão?

Marcelo Magarzo
fonte
1
Levei cerca de 10 segundos para encontrar o github.com/tparkin/Google-Maps-Point-in-Polygon . Você tentou alguma coisa?
John Powell
4
Ele escreveu "Eu tenho uma função que retorna VERDADEIRO quando um ponto (lat, lng) está dentro de um polígono". Eu acho que é um bom teste, mas não responde se todo o polígono está dentro de outro.
user30184
1
Eu adicionaria a biblioteca Javascript Topology Suite ao seu projeto e aproveitaria seus operadores espaciais para esse tipo de comparação. Forneci uma resposta sobre uma pergunta semelhante, mostrando como incluir a biblioteca jsts em um projeto e realizar uma dissolução / união em duas geometrias de polígonos . Você pode achar isso útil. Se eu tiver uma chance, verei se consigo encontrar ou criar um exemplo que testa a interseção de duas geometrias - polígono, linha ou ponto não importa, eles se cruzam ou não. :)
elrobis

Respostas:

8

Exemplo JSFiddle

Criei um JSFiddle demonstrando uma solução para o seu problema usando a biblioteca JSTS (JavaScript Topology Suite) (JSTS).

Explicação

Existem duas etapas para essa abordagem. A primeira etapa converte suas geometrias do Google em expressões de geometria WellKnownText (WKT) , que é um formato amplamente suportado. A segunda etapa usa o JSTS para executar uma geometry.intersects()comparação JSTS de duas geometrias WKT.

Para realmente entender isso, você precisará ter um entendimento básico do WKT. Como as geometrias de polígonos no seu mapa do Google não são amplamente suportadas, eu as converto imediatamente em geometrias WKT para que possamos trabalhar com elas no JSTS.

Para fazer isso facilmente, usei a biblioteca Wicket . É claro que você sempre pode usar o seu próprio método do Google-Polígono para WKT, ou pode usar um que escrevi uma vez , ou pode usar outra solução que possa encontrar. Pessoalmente, hoje em dia eu apenas uso o Wicket, que, como você pode ver, é muito simples:

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

A seguir, a carne e as batatas - usando o JSTS para pegar duas geometrias WKT e testar se elas se cruzam ou não. Mais uma vez, contando com a biblioteca, não há muito o que fazer:

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

Como eu vinculei as bibliotecas no Fiddle

O violão vinculado acima e a solução que demonstrei exigem a adição de duas bibliotecas de terceiros ao seu projeto - JSTS e Wicket. Obter o código de seus respectivos Githubs e incorporá-lo ao seu projeto é um exercício diferente. Mas para o violino, vinculei a essas bibliotecas fazendo referência a elas em um exemplo JSTS existente que encontrei postado por Christopher Manning , bem como na página de demonstração do próprio Wicket . Basicamente, abri as páginas, selecionei "View Source" e retirei referências relevantes para as duas bibliotecas. Estes foram os pontos de extremidade exatos da biblioteca que usei:

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
fonte
Além disso, FWIW, há alguma sobreposição útil nesse segmento no SO .
elrobis