Persentase poligon dalam satu bentuk dalam poligon yang lain

13

Saya seorang pemula, minta maaf jika ini jelas / sudah ditanyakan dan dijawab tetapi saya tidak dapat menemukan apa pun.

Saya memiliki dua shapefile: 1. lapisan batas administratif untuk sebuah daerah di Inggris yang dikenal sebagai batas LSOA yang memiliki 500 zona kecil di dalamnya 2. zona banjir.

Idealnya saya ingin mengetahui zona LSOA kecil mana yang ≥50% dalam zona banjir dan berakhir dengan ya / tidak atau 1/0 untuk masing-masing dari 500 zona LSOA.

Tetapi saya tidak tahu bagaimana melakukan ini. Saya pikir saya bisa Bergabung dengan dua shapefile, tetapi tidak ada atribut yang sama di antara mereka. Lalu saya pikir saya bisa menggunakan fungsi Join Attribute by Location, yang berfungsi dan menunjukkan kepada saya LSOA mana yang ada di zona banjir, tapi itu hampir semuanya (lihat gambar 2).

Saya pikir ini adalah masalah SQL tapi saya tidak tahu. Saya baru mengenal QGIS dan tidak pernah menggunakan PostgreSQL.

Bantuan apa pun akan sangat dihargai. Saya dapat memberikan info apa pun yang Anda butuhkan orang-orang baik untuk membantu saya.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

KJGarbutt
sumber

Jawaban:

11

Ini adalah tugas yang relatif sederhana menggunakan alat geoproses yang disertakan dalam QGIS.

  1. Hitung area zona LSOA Anda.

    • Buka tabel atribut layer LSOA.
    • Aktifkan mode pengeditan.
    • Buka kalkulator bidang.
    • Buat bidang baru jenis "Angka desimal (nyata)" dengan ekspresi "$ area".
    • Nonaktifkan mode pengeditan (menyimpan hasil edit).
  2. Gabungkan layer zona banjir menjadi fitur multi-bagian tunggal.

    • Vector > Geometry Tools > Singleparts to Multipart.
    • Pilih "--- Gabungkan semua ---" untuk bidang ID Unik.
  3. Berpotongan lapisan zona LSOA dengan lapisan zona banjir multi bagian.

    • Vector > Geoprocessing Tools > Intersect.
    • Lapisan input adalah zona LSOA, lapisan berpotongan adalah zona banjir.
  4. Lapisan yang dihasilkan akan menjadi bagian dari zona LSOA (dengan atribut dari lapisan zona LSOA) yang tumpang tindih dengan lapisan zona banjir. Untuk menghitung proporsi setiap zona LSOA dalam zona banjir:

    • Hitung area fitur yang berpotongan (seperti pada langkah # 1), lalu
    • Tambahkan bidang lain, bagi area asli (total) dengan area berpotongan. Hasilnya adalah desimal antara 0 dan 1. Kalikan dengan 100 untuk memberikan persentase.
  5. Bergabung dengan layer LSOA asli ke layer berpotongan, menggunakan ID unik yang dibagikan oleh kedua layer.

  6. Mengekspor lapisan yang bergabung sebagai shapefile baru.

  7. Hapus atribut yang digandakan.

Dan lagi!

Tanpa langkah # 2, fitur individual akan dibuat untuk setiap fitur zona banjir berbeda untuk setiap fitur LSOA. Ini mungkin bukan yang Anda inginkan jika Anda hanya tertarik pada cakupan total untuk setiap zona LSOA. Jika Anda ingin membedakan antara flovial fluida / pasang surut / pluvial (dan data zona banjir mendukungnya), Anda dapat mengonversi singlepart s ke multipart yang menentukan bidang "TYPE" sebagai bidang ID Unik.

Snorfalorpagus
sumber
Terima kasih untuk bantuannya! Sangat dihargai. Namun, saya mengalami beberapa masalah. Saya sudah mengikuti langkah-langkahnya. Langkah 3, Intersect, membutuhkan waktu 10 jam untuk menyelesaikan dan ketika selesai semua yang saya dapatkan adalah shapefile kosong: i.imgur.com/QIM6Gtg.png Apakah ada sesuatu yang saya lewatkan? Saya mencoba untuk menyelesaikan proses dan melakukan langkah 4 tetapi tidak ada data untuk menghitung area intersect.
KJGarbutt
Saya punya masalah melakukan persimpangan dengan lapisan banjir sebelumnya. Fiturnya besar dan rumit. Cara saya mengatasinya di masa lalu adalah dengan membaginya menjadi fitur yang lebih kecil, sehingga indeks spasial dapat melakukan lebih banyak pekerjaan. Untuk melakukan ini, buat kisi-kisi vektor dengan tingkat yang sama dengan layer banjir ( Vector > Research Tools > Vector Grid... Output grid as polygons), kemudian potong kisi dengan layer banjir. Kemudian gunakan output, bukan layer banjir di langkah 3. Saya menduga alasan mengapa layer itu kosong adalah karena crash.
Snorfalorpagus
Terima kasih lagi. Satu-satunya masalah sekarang adalah bahwa QGIS lumpuh setiap kali saya mencoba membuat kotak vektor. Saya sudah mengikuti saran dari sini tetapi crash setiap waktu. Saya telah mengubah parameter beberapa kali dan mencoba hanya menggunakan shapefile zona banjir, daripada membuka seluruh file proyek saya dan gagal setiap kali. Ada ide? ! Tangkapan layar di sini .
KJGarbutt
Parameter X dan Y yang Anda tentukan terlalu kecil. Cobalah sesuatu seperti 1000 x 1000. Anda bahkan dapat melakukan ini beberapa kali, yaitu, lakukan 5000 x 5000 terlebih dahulu, gunakan output untuk membuat 500 x 500. Lihat jawaban terkait di sini: gis.stackexchange.com/a/66319/12420
Snorfalorpagus
Saya hampir memecahkannya dengan bantuan Anda! Namun, ketika saya pergi untuk bergabung dengan lapisan LSOA asli dengan lapisan berpotongan, saya kehilangan banyak data. Saya pikir itu karena beberapa kotak vektor kotak dibuat jatuh dalam area LSOA yang sama dan memiliki kode LSOA yang sama seperti masing-masing. Jadi, saya berakhir dengan angka 2+ persentase untuk setiap area LSOA ketika saya bergabung dan sepertinya saya hanya mendapatkan satu dari mereka. Apakah ada cara untuk menjumlahkan setiap persentase untuk setiap kotak vektor dengan LSOA yang sama?
KJGarbutt
6

Anda dapat menggunakan fungsi spasial dan beberapa fungsi SQL spasial.

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1
Cyrille
sumber
3

Ini sepertinya sesuatu yang bisa dilakukan jauh lebih mudah daripada jawaban yang diajukan. Saya akan menggunakan skrip python sederhana secara pribadi:

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

ini hanya mengevaluasi poligon banjir yang bersinggungan dengan kotak pembatas dari setiap lapisan pembatas sehingga harus cukup cepat untuk dijalankan, maka itu hanya memperbarui satu bidang pada lapisan yang ada (alih-alih operasi yang kompleks untuk membuat seluruh lapisan baru dan menyalin nilai-nilai lama kemudian menghapus)

Jesse McMillan
sumber
2

Saya memiliki masalah yang sama dengan KJ mengikuti instruksi Snorfalorpagus menggunakan metode "Intersect" pada Langkah 3. Butuh beberapa saat untuk menghitung dan apa yang tersisa dengan saya kosong.

Saya mencoba mengikuti langkah-langkah yang sama kecuali menggunakan metode "Klip" di QGIS dan bukannya Intersect - jadi, dalam contoh Anda, apa yang tersisa adalah bagian-bagian dari area yang TIDAK tercakup oleh zona banjir. Ini tampaknya berhasil karena beberapa alasan dan saya bisa menggunakan perhitungan bidang "Area" dari langkah sebelumnya, ditambah perhitungan "Area" baru pada bagian yang tersisa dari setiap poligon, untuk mengetahui% dari setiap area yang TIDAK BUKAN. ditutupi oleh lapisan Polygon lainnya.

Secara teknis itu kebalikan dari apa yang Anda minta. Tapi dari sana hanya mengurangi satu nilai dari 1 untuk mendapatkan apa yang dicakup oleh zona banjir.

wartawan yg membuka korupsi
sumber