Membuat titik spasi secara teratur di dalam poligon berdasarkan nilai atribut menggunakan QGIS?

11

Saya memiliki lapisan poligon dengan nilai atribut terlampir yang mewakili jumlah individu di dalam poligon. Saya menggunakan QGIS 3.0.

Saya perlu memvisualisasikan penghitungan sebagai kotak titik di dalam poligon (yaitu 1 poin = 100 katak, diwarnai oleh specie). Titik-titik tidak perlu menempati seluruh poligon, dan lebih disukai digambar di sekitar centroid dengan jarak yang telah ditentukan (yaitu 300 m), sehingga titik-titik tersebut dapat mewakili kisi-kisi yang rapi pada resolusi tertentu.

Solusi saat ini yang saya temukan adalah menggunakan "Poin reguler", dengan parameter jumlah, untuk membuat kisi dalam batas yang digambar pada peta, lalu hapus poin tambahan yang dibuat oleh algoritma (algoritme membulatkan ke kisi dan Anda mungkin mendapatkan 20 poin, bukan 17 di memasukkan). Ini menghasilkan hasil yang diinginkan, tetapi membutuhkan gambar luas area untuk titik reguler untuk setiap poligon, serta input atribut manual dan pembersihan poin yang dibuat. Selain itu, karena saya menjalankan "Poin Reguler" dengan jumlah yang ditentukan, alih-alih spasi, setiap poligon mendapat titik spasi yang berbeda.

Singkatnya: Poin reguler (ditentukan # poin, batas yang ditarik) untuk setiap poligon (batch)> Hapus poin ekstra> tetapkan nilai atribut ke # poin

Alternatif (menghindari jarak yang tidak teratur, tetapi membutuhkan lebih banyak manipulasi):

Poin reguler (jarak yang didefinisikan yaitu 300m) di seluruh lapisan> Klip ke batas poligon> Hapus poin ekstra di setiap poligon sampai Anda mendapatkan # poin yang diinginkan> tetapkan nilai atribut ke poin.

Masalah utama dengan solusi saya adalah pemrosesan poligon demi poligon, yang membuatnya sulit untuk memperbarui data dan bekerja dengan jumlah poligon yang lebih besar.

Pertanyaan analog ditanyakan sebagai Membuat spasi # poin yang didefinisikan secara teratur dalam poligon di QGIS , tetapi spesifiknya berbeda.

Tangkapan layar hasil yang diinginkan:

Tabel atributL:

Ruslan
sumber
1
Apakah gambar dalam pertanyaan Anda mewakili apa yang Anda harapkan sebagai hasilnya? Dari mana datangnya titik berwarna? Bisakah Anda menambahkan tabel atribut layer? Terutama atribut poligon yang mencakup Edmonton dan Sherwood Park, untuk pemahaman warna dan hitungan yang lebih baik.
Kadir Şahbaz
1. Ini hanya data yang disamarkan yang tidak ada hubungannya dengan poligon sebenarnya, tapi ya saya mengharapkan hasil seperti itu, tetapi dengan titik-titik di sekitar pusat poligon. 2. Hitungan berasal dari kolom tabel atribut, karena ada tiga kolom / jenis poin yang saya agregat menjadi satu kolom untuk pertama mendapatkan jumlah poin yang tepat per poligon dan kemudian menetapkan atribut / warna menggunakan ekspresi. edit: menambahkan tabel excel ke pertanyaan, tidak mewakili nilai-nilai, tetapi mewakili struktur data saya.
Ruslan

Jawaban:

5

QGIS 3 hadir dengan metode perpindahan baru di cluster renderer yang disebut kisi. Sepertinya ini yang Anda butuhkan. Cukup buat jumlah titik yang diinginkan di pusat massa poligon Anda.

masukkan deskripsi gambar di sini

Saya tidak mengetahui metode untuk menghasilkan poin hanya dengan alat gui, tetapi skrip python yang relatif sederhana harus melakukan itu.

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

Jika Anda ingin menjadi gila, bungkus dengan algoritma pemrosesan kustom.

Matthias Kuhn
sumber
Terima kasih Matthias, itu tampaknya lebih baik daripada solusi lain. Bisakah Anda menyarankan cara untuk membuat # poin yang diinginkan dengan cepat berdasarkan tabel atribut untuk mencapai ini?
Ruslan
Saya tidak mengetahui metode yang mudah selain menulis skrip python kecil. Kode ini sama sekali belum diuji, jadi mungkin ada beberapa kesalahan ketik;)
Matthias Kuhn
Terima kasih lagi. Saya mungkin harus melakukan visualisasi yang sama untuk banyak layer / luasan dll jadi saya akan mencoba untuk membangun setidaknya model pemrosesan untuk ini.
Ruslan
5

Mungkin cara lain yang menginspirasi oleh jawaban Sarath SRK:

  1. Centroid dari poligon
  2. Buffer menggunakan ekspresi dengan kuadrat dan beradaptasi dengan skala Anda: yaitu (1000 * (sqrt ("Frogs" + "Cats" + "Diplodocs") / 2)) + 1 dan Segmen = 1, Gaya topi akhir = Kotak
  3. Titik Grid baru dengan spasi yang koheren dengan skala buffer.
  4. Hapus titik yang tidak berpotongan dengan lapisan penyangga (pilih berdasarkan lokasi)
  5. gabungkan atribut berdasarkan lokasi (Atribut buffer atau poligon asli)

Namun, Anda akan memiliki sesuatu seperti ini masukkan deskripsi gambar di sini

  1. Gunakan à pemodel grafis untuk membuat bidang baru dengan perintah "@row_number" masukkan deskripsi gambar di sini

  2. Jalankan model dengan iterasi pada lapisan buffer masukkan deskripsi gambar di sini

  3. Gabungkan semua layer baru

  4. Hapus semua titik dengan bidang ID_pt lebih besar dari jumlah bidang Anda ("Katak" + "Kucing" + "Diplodocs")

  5. Kategorikan dengan aturan (mis
    • "ID_pt" <= "Katak"
    • "ID_pt"> "Frogs" dan "ID_pt" <= ("Cats" + "Frogs")
    • "ID_pt"> ("Cats" + "Frogs") dan "ID_pt" <= ("Cats" + "Frogs" + "Diplodocs") masukkan deskripsi gambar di sini
Christophe
sumber
Terima kasih untuk ini! Saya tidak akan punya waktu untuk mencoba ini hari ini, tetapi sepertinya solusi yang bisa diterapkan mengingat Anda mendapatkan output yang diinginkan.
Ruslan
1

Anda dapat menggunakan generator geometri untuk ini.

  1. Tambahkan 3 sublayers pada simbol, satu untuk setiap warna / atribut.
  2. Buat ekspresi yang menghasilkan multipoligon untuk setiap sublapisan.
  3. Sekarang bagian yang sulit, hasilkan bagian persegi untuk multipolygon berdasarkan atribut. Saya kira ini akan membutuhkan fungsi ekspresi python kustom.
  4. Opsional, gunakan variabel rendering untuk skala peta untuk menentukan penskalaan poligon dan spasi.
Matthias Kuhn
sumber
Maaf, saya terlalu sibuk sekarang untuk jawaban yang lengkap, tetapi akan menjadi tantangan yang sangat menarik untuk mencoba memasak sesuatu dari resep ini di sini. Mungkin seseorang dapat memberi kami solusi yang bagus berdasarkan ini.
Matthias Kuhn
1

Salah satu solusinya bisa dengan membuat layer titik dengan titik di pusat massa setiap poligon. Jadi sebagai contoh Anda dapatkan di titik tengah Edmonton 25 titik superposed: 5 dengan atribut katak, 20 poin dengan kucing dan 0 dengan diplodocs.

Kemudian menggunakan renderer perpindahan titik dengan metode Penempatan yang ditetapkan sebagai kisi, Anda harus bisa mendapatkan efeknya.

Kesulitannya adalah membuat layer titik ....

JR
sumber
0

Alternatif yang sangat sederhana mungkin menggunakan diagram Pie yang tersedia di properti layer? Atribut dan ukuran dapat ditentukan oleh ekspresi.

masukkan deskripsi gambar di sini

Christophe
sumber
2
Yah saya tahu tentang cara alternatif untuk memetakan data. Inti pertanyaannya adalah membuat alur kerja visualisasi itu mungkin. Diagram pai tidak benar-benar berfungsi karena ketika Anda melihat kisi-kisi Anda mendapatkan pengertian yang sangat baik pada jumlah individu. Mencoba memperkirakan jumlah individu yang tepat untuk setiap poligon dari diagram lingkaran hampir mustahil.
Ruslan
0

Anda bisa menghasilkan titik pada lintasan spiral mulai dari poligon centroid. Posting Stack Overflow berikut memiliki kode python untuk membuat poin yang sama tapi saya tidak bisa mengujinya saat ini karena kurangnya waktu luang saya.

Techie_Gus
sumber
Tampaknya cukup dekat, tetapi seperti yang disebutkan dalam pertanyaan saya tidak cukup mahir untuk kode ini / mengubah kode yang disarankan di sana.
Ruslan
Semoga seseorang dengan pengetahuan dan waktu yang cukup akan
berbaur
0

Dalam kasus anda,

  1. Buat titik-titik dengan jarak teratur menggunakan jarak yang diberikan untuk seluruh AOI
  2. Buat titik centroid untuk semua poligon (input).
  3. Buat buffer untuk titik-titik centroid itu menggunakan buffer jarak tetap dengan nilai segmen '1'. Ini akan membuat buffer persegi alih-alih lingkaran (Gunakan alat putar di Qgis jika Anda ingin memutar buffer poligon).
  4. Buat pilihan titik jatuh di dalam buffer poligon menggunakan vektor -> Alat penelitian -> Pilih berdasarkan lokasi (titik dalam aturan poligon).
  5. Ganti pilihan dan hapus titik di luar poligon penyangga. Jadi sekarang Anda mendapat titik spasi secara teratur di sekitar centroid poligon.
  6. Berikan atribut Mayoritas untuk seluruh poin dan sisa poin perlu diklasifikasikan secara manual. Gunakan alat QuickMultiAttributeEdit untuk memperbarui atribut dengan mudah.
Sarath SRK
sumber
Terima kasih, ini tampaknya mengurangi langkah pemrosesan, tetapi ini tidak menyelesaikan masalah dengan kebutuhan untuk memilih secara manual (buffer di dalam poligon akan identik dalam ukuran = jumlah poin yang sama per poligon), hapus dan atribut poin yang dibuat untuk masing-masing poligon, yang merupakan masalah utama dengan ini dan alur kerja saya.
Ruslan