Verifique se o ponto lat / long está dentro de um conjunto de polígonos usando o google maps

9

Eu sei como fazer o acima usando Esri (tarefa de consulta no shapefile), mas isso também pode ser feito usando o Google Maps? Preciso consultar cada polígono ou existe um método para consultar um conjunto de polígonos?

ngramsky
fonte

Respostas:

9

A API do Google Maps ainda não fornece um método para verificar pontos nos polígonos. Depois de pesquisar um pouco, deparei-me com o algoritmo de projeção de raios, que determinará se uma coordenada XY está dentro de uma forma plotada. Isso se traduzirá em latitude e longitude. A seguir, estende o google.maps.polygon.prototype para usar esse algoritmo. Basta incluir esse código em um ponto no código após o carregamento do google.maps:

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

Aqui, estendemos a funcionalidade do google.maps.Polygon definindo uma função com o nome 'Contém' que pode ser usada para determinar se a longitude de latitude fornecida no parâmetro de função está dentro do polígono ou não. Aqui, usamos o algoritmo de fundição por raio e desenvolvemos uma função usando o mesmo. Depois de fazer tanto exercício agora, podemos verificar um ponto da seguinte maneira:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

Para obter o código completo e a demonstração, acesse: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

techabhi
fonte
Sim, acho que o elenco de raios é o caminho a seguir. Na verdade, eu mesmo utilizei esse algoritmo por meio de um script python. Minha implementação pode ser encontrada aqui: gramasky.blogspot.com/2012/12/…
ngramsky
Eu tinha que remover os bits que adicionados 360 para coordenadas negativas para que isso funcione corretamente em torno de longitude 0.
user1431317
4

Eu iria no plugin Open Layers; buscá-lo e, em seguida, você pode adicionar qualquer camada dinâmica ao seu mapa e exportar.

* Antes de fazer isso, verifique se o CRS do projeto (EPSG) está definido como WGS84 e se a transformação do CRS 'on the fly' está ativada nas configurações de Propriedades do projeto.

Espero que isto ajude.

Bryce Touchstone
fonte
0

se você usar um programa de terceiros como geodjango, poderá verificar seu ponto dentro de um conjunto de polígonos ou não. mais informações estão aqui .

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

espero que ajude você ...

Aragão
fonte
0

Eu sei que isso é um pouco tarde, mas pode ser útil no caso de SomeOne não experimentar a biblioteca Android-Map-Utils. Publiquei os métodos específicos desta pergunta apenas para Android. Aqui está:

https://stackoverflow.com/a/31988461/2054348

Sagar Shah
fonte