Enlem / boylam noktasının google maps kullanan bir çokgen kümesi içinde olup olmadığını kontrol edin


9

Esri (şekil dosyası üzerinde sorgu görevi) kullanarak yukarıdakilerin nasıl yapıldığını biliyorum, ancak bu Google Haritalar kullanılarak da yapılabilir mi? Her çokgeni sorgulamak zorunda mıyım yoksa bir çokgen kümesini sorgulamak için bir yöntem var mı?

Yanıtlar:


9

Google Maps API zaten çokgenlerdeki noktaları kontrol etmek için bir yöntem sağlamıyor. Biraz araştırdıktan sonra, XY koordinatının çizilen bir şeklin içinde olup olmadığını belirleyecek Ray döküm algoritmasına rastladım. Bu, enlem ve boylam anlamına gelecektir. Aşağıda google.maps.polygon.prototype bu algoritmayı kullanacak şekilde genişletilmiştir. Bu kodu google.maps yüklendikten sonra kodun bir noktasına eklemeniz yeterlidir:

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);

    }

};

Burada, işlev parametresinde sağlanan enlem boylamının çokgen içinde olup olmadığını belirlemek için kullanılabilecek 'İçerir' adında bir işlev tanımlayarak google.maps.Polygon işlevlerini genişlettik. Burada Ray döküm algoritmasını kullanıyoruz ve bunu kullanarak bir fonksiyon geliştirdik. Şimdi bu kadar egzersiz yaptıktan sonra, bir noktayı aşağıdaki gibi kontrol edebiliriz:

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
}

Tam kod ve demo için lütfen şu adrese gidin: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html


Evet, ışın döküm yolu bu. Aslında bu algoritmayı kendim bir python betiği ile kullandım. Uygulamamı burada bulabilirsiniz: gramsky.blogspot.com/2012/12/…
ngramsky

Boylam 0 etrafında düzgün çalışması için negatif koordinatlara 360 ekleyen bit kaldırmak zorunda kaldı.
user1431317

4

Açık Katmanlar eklentisine giderdim; daha sonra haritanıza dinamik katmanı ekleyebilir ve dışa aktarabilirsiniz.

* Bunu yapmadan önce, proje CRS'nizi (EPSG) WGS84 olarak ayarladığınızdan ve Proje Özellikleri ayarlarınızda 'anında' CRS dönüşümünün etkinleştirildiğinden emin olun.

Bu yardımcı olur umarım.


0

geodjango olarak üçüncü taraf programı kullanıyorsanız, bir çokgen kümesi içinde olup olmadığına bakabilirsiniz. daha fazla bilgi burada .

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)

umarım sana yardımcı olur ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.