Saturday, June 05, 2010

Um ponto está dentro de um polígono? Google Maps API + JQuery + Rails

Tive alguns problemas para saber se um ponto estava em um polígono nesses últimos 2 dias, agora matei o bixo!

Lá vai:
function contem(poligono, point) {
        var j=0;
        var oddNodes = false;
        var x = point.lng();
        var y = point.lat();
        for (var i=0; i < poligono.getVertexCount(); i++) {
            j++;
            if (j == poligono.getVertexCount()) {
                j = 0;
            }
            if (((poligono.getVertex(i).lat() < y) &&
            (poligono.getVertex(j).lat() >= y))
            || ((poligono.getVertex(j).lat() < y) &&
            (poligono.getVertex(i).lat() >= y))) {
                if ( poligono.getVertex(i).lng() + (y -
                    poligono.getVertex(i).lat()) / (poligono.getVertex(j).lat()-poligono.getVertex(i).lat())
                    *  (poligono.getVertex(j).lng() - poligono.getVertex(i).lng())
                        oddNodes = !oddNodes
                    }
                }
            }
            return oddNodes;
        }



Um exemplo de utilização:
    var nas_barcas_niteroi =  new GLatLng(-22.9002528744688, -43.123140335083);
    //Quadrado no Centro do Rio
    var vertices =
    [
    new GLatLng(-22.8980627323264, -43.1954956054688),
    new GLatLng(-22.9020160300563, -43.1989288330078),
    new GLatLng(-22.9043879533846, -43.1954956054688),
    new GLatLng(-22.9001184615258, -43.1884574890137),
    ]

    var poligono = new GPolygon(vertices, "#000000", 1, 1, "#336699", 0.3);
    var contem = contem(poligono, nas_barcas_niteroi);
    alert("Contem? " + contem)

Bem legal trabalhar com a API do Google Maps + JQuery + Rails

Ferramenta certa, pra coisa certa!!!

Valeu!

5 comments:

  1. Estrou precisando de uma rotina desta finalidade, mas não entendi o 3º "if" da function contem, se puder me ajudar, gostaria de mais explicações.
    Paulo

    ReplyDelete
    Replies
    1. Conseguiu fazer este script funcionar Paulo?

      Delete
  2. Amigo seu código está com a sintaxe ERRADA! Está sobrando uma chave aí que tá fechando o que não abriu. Você pode por favor corrigir o código e disponibilizar o código direito pra que as pessoas vendo o tutorial não tenham que se foder pra resolver uma porra de um erro uma vez que já estão sofrendo pesquisando pra caralho tentando achar solução?

    ReplyDelete
    Replies
    1. This comment has been removed by the author.

      Delete
  3. Amigo estou precisando urgente deste tipo de Script, você tem como mostrar um DEMO desta sua aplicação?

    ReplyDelete