Periksa apakah titik lat / panjang dalam satu set poligon menggunakan peta google

9

Saya tahu cara melakukan hal di atas menggunakan Esri (tugas Kueri pada shapefile), tetapi dapatkah ini juga dilakukan menggunakan Google Maps? Apakah saya harus meminta setiap poligon atau apakah ada satu metode untuk meminta satu set poligon?

ngramsky
sumber

Jawaban:

9

Google maps API belum menyediakan metode untuk memeriksa titik dalam poligon. Setelah meneliti sedikit, saya menemukan algoritma Ray-casting yang akan menentukan apakah koordinat XY berada di dalam bentuk yang diplot. Ini akan menerjemahkan ke garis lintang dan bujur. Berikut ini memperluas google.maps.polygon.prototype untuk menggunakan algoritma ini. Cukup sertakan kode ini pada satu titik dalam kode setelah google.maps memuat:

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

    }

};

Di sini kami telah memperluas fungsionalitas google.maps.Polygon dengan mendefinisikan fungsi dengan nama 'Berisi' yang dapat digunakan untuk menentukan apakah garis bujur yang disediakan dalam parameter fungsi berada dalam poligon atau tidak. Di sini kita menggunakan algoritma Ray-casting dan mengembangkan fungsi menggunakan hal yang sama. Setelah melakukan banyak latihan sekarang, kita dapat memeriksa titik sebagai berikut:

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
}

Untuk kode dan demo lengkap silakan kunjungi: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html

techabhi
sumber
Ya, ray casting adalah cara yang harus dilakukan. Saya sebenarnya memanfaatkan algoritma itu sendiri melalui skrip python. Implementasi saya dapat ditemukan di sini: gramky.blogspot.com/2012/12/…
ngramsky
Saya harus menghapus bit yang menambahkan 360 ke koordinat negatif agar ini berfungsi dengan baik di sekitar bujur 0.
user1431317
4

Saya akan membuka plugin Open Layers; ambil, dan Anda bahkan dapat menambahkan lapisan dinamis apa pun ke peta Anda dan ekspor.

* Sebelum melakukannya, pastikan Anda memiliki CRS proyek Anda (EPSG) diatur ke WGS84, dan bahwa transformasi CRS 'on the fly' diaktifkan di bawah pengaturan Properti Proyek Anda.

Semoga ini membantu.

Bryce Touchstone
sumber
0

jika Anda menggunakan program pihak ketiga sebagai geodjango, Anda dapat memeriksa poin Anda apakah dalam satu set poligon atau tidak. info lebih lanjut ada di sini .

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)

Saya harap ini membantu Anda ...

Aragon
sumber
0

Saya tahu ini agak terlambat tetapi mungkin membantu jika SomeOne tidak mencoba perpustakaan Android-Map-Utils. Saya telah memposting metode khusus Pertanyaan ini hanya untuk Android. Ini dia:

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

Sagar Shah
sumber