Bagaimana teluk dan selat dapat ditentukan dalam peta yang dibuat secara prosedural?

40

Saya punya peta yang dibuat secara prosedural menggunakan sel Voronoi, dengan permukaan laut yang ditentukan dan peta ketinggian yang bisa dipercaya.

Arus

Sejauh ini, saya telah berhasil memberi label fitur geografis tertentu: tanah, laut, danau, sungai, muara, pertemuan, gunung, dan bioma. Bioma termasuk tundra, hutan boreal, padang rumput, dan hutan sedang. Ada juga beberapa bioma lain di sana tetapi untuk tujuan saya mereka tidak penting saat ini.

Saya ingin memberi label bay, dan selat berikutnya, tetapi saya bingung bagaimana cara melakukannya dengan benar. Sebuah teluk adalah badan air pantai yang tersembunyi yang langsung terhubung ke laut.

Selat adalah jalur air sempit yang terbentuk secara alami yang menghubungkan dua bagian lautan. Pada dasarnya, di mana dua bidang tanah hampir menyentuh dan ada lautan di kedua sisi. Disebut juga "saluran".

Untuk menentukan fitur, saya dapat mengulangi semua fitur berdasarkan tipe seperti ini:

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));
Olin Kirkland
sumber
8
Saya merekomendasikan classifier baysian.
Akumulasi
1
@Akumulasi Apakah ini permainan kata-kata "bay" atau ini saran yang serius? Jika yang terakhir, Anda harus menulis jawaban yang tepat tentang ini.
Philipp
Saya seperti 99% yakin dia membuat lelucon.
Olin Kirkland

Jawaban:

29

Cara Dragons Abound mengidentifikasi teluk adalah berjalan di sepanjang garis pantai dan menemukan dua titik di garis pantai di mana jarak garis lurus di antara titik-titik itu kurang dari jarak di sepanjang garis pantai di antara titik-titik tersebut. Ini adalah sinuositas garis pantai antara dua tempat. Dengan memilih batas sinuositas dan batas jarak garis lurus antara titik-titik Anda dapat mengidentifikasi teluk dalam yang sempit, teluk dangkal lebar, dll.

Dalam gambar ini, titik-titik merah dan ungu menunjukkan dua titik kandidat dan garis hijau adalah garis pantai di antara titik-titik tersebut. Sinuositas adalah rasio dari dua panjang tersebut:

Contoh Teluk

Atau, Anda dapat memilih dua titik di pantai dan membuat poligon dengan menghubungkan dua titik dan garis pantai antara dua titik (yaitu, hubungkan garis hijau di atas dari titik merah ke titik ungu). Ukur luas poligon ini. Sebuah teluk akan memiliki area yang lebih besar daripada non-teluk.

Dalam pengalaman saya, kombinasi dari kedua langkah ini adalah yang terbaik untuk mengidentifikasi dengan tepat apa yang orang lihat sebagai teluk.

Perhatikan bahwa ini juga akan mendeteksi poin. Untuk menemukan hanya teluk, Anda perlu memeriksa bahwa "bagian dalam" teluk mengandung air dan bukan tanah. Cara cepat dan mudah untuk melakukan ini adalah dengan memeriksa titik tengah garis antara dua titik untuk melihat apakah itu air. (Ini bisa dibodohi tetapi umumnya cukup.)

Masalah terkait adalah untuk mengidentifikasi "mulut" teluk - yaitu, pilihan terbaik untuk dua titik yang menandai pembukaan ke teluk. Biasanya Anda akan memiliki banyak kandidat untuk "mulut". Pada contoh peta di atas, Anda bisa menempatkan mulut teluk itu lebih jauh atau lebih jauh. Secara umum itu mungkin tidak terlalu penting, tetapi satu heuristik yang bekerja cukup baik adalah untuk meminimalkan jarak garis lurus di mulut.

Saya belum melakukan selat, tetapi intuisi saya adalah untuk memeriksa titik di sepanjang garis pantai untuk menemukan titik terdekat di garis pantai lainnya; jika itu di bawah batas yang ditentukan itu adalah selat.

Dr. Pain
sumber
3
Aku seharusnya tahu Naga Abound akan memiliki jawaban yang aku butuhkan.
Olin Kirkland
48

Inilah ide kasar menggunakan transformasi pemrosesan gambar untuk mengisolasi fitur-fitur yang menarik:

  1. Oleskan isian banjir dari sel lautan untuk membuat topeng dari semua sel lautan. Bergantung pada bagaimana sungai Anda diatur, Anda mungkin membutuhkan kriteria ketinggian atau izin tambahan untuk menjaga topeng laut agar tidak mengalir ke daratan. ;)

    Topeng Laut

  2. Oleskan perataan lokal ke tepi topeng ini, menjaga agar keterhubungan / topologi tetap sama, tetapi menghaluskan fitur garis pantai kecil yang berisik yang dapat mengganggu. Ini memungkinkan kita fokus pada teluk besar di atas lubang kecil. Anda dapat menggunakan lebar filter / jumlah iterasi Anda untuk mengontrol skala fitur yang Anda pertahankan dengan halus.

    Di sini saya menerapkan filter median beberapa kali. Automata seluler adalah cara populer lainnya untuk mengikis bentuk halus dari input yang bising.

    Garis Pantai yang dihaluskan

  3. Ubah topeng menjadi bidang jarak, di mana setiap sel menyimpan jaraknya dari garis pantai yang dihaluskan.

    Bidang Jarak

Sekarang kita melihat beberapa fitur yang menjanjikan. Dalam bidang jarak yang ditandatangani, kedua teluk dan selat muncul sebagai punggungan yang tajam, dengan jarak jatuh ke samping. Kita dapat menggunakan filter deteksi tepi untuk menghilangkan ridges ini:

Punggungan Disorot

Anda kemudian dapat membedakan antara bay dan selat dengan mengikuti punggungan untuk menentukan konektivitasnya. Sebuah teluk adalah punggungan yang membentang ke arah pantai, semakin dangkal dan dangkal (dalam jarak dari daratan) hingga berakhir di suatu titik. Selat adalah punggungan yang menghubungkan wilayah jarak tinggi ke wilayah jarak jauh lainnya, melewati daerah jarak lebih rendah di sepanjang jalan.

Atau, cara lain adalah dengan menetapkan setiap pulau ID (pencarian komponen yang terhubung), maka saat Anda membuat bidang jarak Anda, sebarkan "ID pulau terdekat" di sepanjang batas jarak. Sebuah teluk atau inlet kemudian merupakan punggungan dalam air yang berdekatan dengan daratan yang sama di kedua sisi, sedangkan saluran adalah punggungan yang memisahkan air yang berdekatan dengan dua daratan yang berbeda.

Anda dapat menetapkan batasan jarak & maksimum minimum & maksimum untuk mengendalikan fitur mana yang akan dilabeli, jika Anda perlu mengecualikan selat yang terlalu sempit / lebar misalnya.

DMGregory
sumber
9
Ini terlihat sangat keren, dan mungkin bisa dipercepat dengan langsung menggunakan struktur sel untuk menerapkan berbagai langkah daripada representasi grafis!
Quentin
7
Pendekatan kedua (menetapkan masing-masing landmass berbeda ID dan membedakan berdasarkan apakah itu adalah daratan yang sama di kedua sisi badan air) sepertinya hal yang paling mudah untuk dilakukan ..
Monty Harder
"Landmass ID" adalah ide yang bagus, karena Anda juga akan membutuhkannya di label peta untuk menghasilkan nama pulau.
MSalters
6

Pada dasarnya, Anda perlu berpikir tentang apa yang Anda maksudkan, tepatnya, dengan teluk atau selat, dan mengapa Anda ingin membedakannya (apakah itu untuk perhitungan AI, atau untuk menandai landmark, atau yang lainnya?). Bermain-mainlah dengan beberapa definisi untuk menemukan definisi yang paling cocok untuk Anda. Kemudian, rumuskan kondisi untuk memeriksa sel Voronoi Anda. Beberapa saran:

Teluk

  • Setiap sel lautan yang hanya terhubung ke satu sel lautan lainnya
  • ATAU: Setiap sel lautan yang terhubung ke lebih banyak daratan daripada sel lautan, dengan semua sel lautan bersebelahan
  • ATAU: Sama seperti di atas, tetapi dengan kriteria berdasarkan panjang perbatasan (mis. Tanah dua kali lebih banyak daripada batas air)

Selat

  • Setiap sel lautan yang terhubung dengan tepat dua sel lautan yang tidak bersebelahan
  • ATAU: Setiap sel lautan yang terhubung ke dua sel tanah yang bukan milik daratan yang sama (Anda perlu mencari tahu sel-sel tanah mana yang terhubung terlebih dahulu, dan menetapkan ID untuk setiap daratan)
  • ATAU: Berbaris di sekitar perbatasan, dan hitung transisi tanah / air dan air / tanah. Anda membutuhkan setidaknya masing-masing dua.
  • Bergantung pada metode Anda dan apa yang ingin Anda lakukan dengan kategori, Anda mungkin ingin menghilangkan selat yang hanya mengarah ke ruang teluk, atau beri label sebagai ruang.
Autolykos
sumber
2
Ketika sebuah selat mengarah ke sebuah teluk, maka keduanya bisa disebut sebagai fjord.
Philipp
1
Jika sel-sel kecil relatif terhadap ukuran teluk / selat, maka Anda mungkin perlu merambatkan ini untuk melihat sel-sel di luar tetangga yang berdekatan.
DMGregory
Ya, penskalaan sedikit menjadi masalah, dan akan memengaruhi cara Anda mendefinisikan berbagai hal dan mendeklarasikan 'sel'. Pertimbangkan peta Kanada, dan bandingkan yang berikut ini: Teluk Hudson, Teluk James, Teluk St Lawrence, dan Teluk Fundy. Bagaimana Anda bisa menerapkan aturan ini dengan andal untuk mendapatkan nama terkait yang diinginkan? - Apakah ada "lurus" antara Newfoundland dan Nova Scotia?
TheLuckless