Menentukan apakah dua poligon tumpang tindih di Google Maps?


12

Saya bekerja dengan peta google dan poligon, tetapi saya harus memvalidasi bahwa poligon tidak saling tumpang tindih.

Saya memiliki fungsi yang mengembalikan BENAR ketika suatu titik (lat, lng) ada di dalam poligon, tetapi itu tidak cukup untuk menentukan apakah setiap titik poligon ada di dalam poligon lain.

Ada saran?


1
Butuh waktu sekitar 10 detik untuk menemukan github.com/tparkin/Google-Maps-Point-in-Polygon . Apakah kamu mencoba sesuatu?
John Powell

4
Dia menulis "Saya memiliki fungsi yang mengembalikan BENAR ketika suatu titik (lat, lng) ada di dalam poligon". Saya pikir ini adalah uji coba yang baik tetapi tidak menjawab jika seluruh poligon ada di dalam yang lain.
user30184

1
Saya akan menambahkan perpustakaan Javascript Topology Suite ke proyek Anda dan mengambil keuntungan dari operator spasial untuk perbandingan semacam ini. Saya memberikan jawaban pada pertanyaan serupa yang menunjukkan bagaimana memasukkan perpustakaan jsts dalam proyek dan melakukan pembubaran / penyatuan pada dua geometri poligon . Anda mungkin menemukan itu membantu. Jika saya memiliki kesempatan, saya akan melihat apakah saya dapat menemukan atau membuat contoh yang menguji perpotongan dua geometri - poligon, garis, atau titik tidak akan menjadi masalah, mereka berpotongan atau tidak. :)
elrobis

Jawaban:


8

Contoh JSFiddle

Saya telah membuat JSFiddle yang menunjukkan solusi untuk masalah Anda menggunakan pustaka JavaScript Topology Suite (JSTS) (JSTS).

Penjelasan

Ada dua langkah untuk pendekatan ini. Langkah pertama mengubah geometri Google Anda menjadi ekspresi geometri WellKnownText (WKT) , yang merupakan format yang didukung secara luas. Langkah kedua menggunakan JSTS untuk melakukan geometry.intersects()perbandingan JSTS dari dua geometri WKT.

Untuk benar-benar memahami ini, Anda harus memiliki pemahaman dasar tentang WKT. Karena geometri poligon di Google Map Anda bukan format yang didukung secara luas, saya segera mengonversinya menjadi geometri WKT sehingga kami dapat bekerja dengannya dalam JSTS.

Untuk melakukan ini dengan mudah, saya menggunakan perpustakaan Wicket . Tentu saja Anda selalu dapat melakukan home-roll metode Google-Polygon-to-WKT Anda sendiri, atau Anda dipersilakan untuk menggunakan metode yang saya tulis sekali waktu , atau Anda dapat menggunakan beberapa solusi lain yang mungkin Anda temukan. Secara pribadi, hari ini saya hanya menggunakan Wicket, yang seperti yang Anda lihat, adalah jahat-sederhana:

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

Berikutnya adalah daging dan kentang - menggunakan JSTS untuk mengambil dua geometri WKT dan menguji apakah mereka berpotongan atau tidak. Sekali lagi, dengan mengandalkan perpustakaan, tidak banyak yang bisa dilakukan:

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

Bagaimana saya menautkan perpustakaan di Fiddle

Biola yang ditautkan di atas, dan solusi yang saya contohkan memerlukan penambahan dua perpustakaan pihak ke-3 untuk proyek Anda - JSTS, dan Wicket. Mendapatkan kode dari Githubs masing-masing dan memasukkannya ke dalam proyek Anda adalah latihan yang berbeda. Tetapi untuk biola, saya menautkan ke perpustakaan-perpustakaan itu dengan mereferensikannya dalam contoh JSTS yang ada yang saya temukan diposting oleh Christopher Manning , serta halaman demo Wicket sendiri . Pada dasarnya saya membuka halaman, memilih "Lihat Sumber", dan memetik referensi yang relevan ke dua perpustakaan. Ini adalah titik akhir perpustakaan persis yang saya gunakan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.