Melambangkan garis poligon di mana ia tidak bertepatan dengan fitur lain menggunakan generator geometri di QGIS?


10

Saya ingin melambangkan poligon tanpa mengubahnya menjadi garis. Saya memiliki fitur poligon (ditetaskan dan dibatasi oleh garis merah) yang bertepatan di bagian atas dan bawah garis pantai (garis biru). Saya ingin melambangkan garis poligon hanya di dua sisi dan ingin mengeluarkan warna merah di bagian atas dan bawah.

Gambar

Saya ingin melihat hasil akhirnya seperti ini.

Gambar


Bisakah Anda memberikan beberapa informasi lebih lanjut tentang alur kerja Anda? Misalnya, apakah ini case use satu kali, atau Anda harus menampilkan beberapa poligon dengan cara ini? Jika beberapa poligon, apakah mereka berorientasi berbeda dan apakah proporsinya berbeda atau serupa? Bisakah digitalisasi garis samping secara manual menjadi opsi yang sesuai?
Erik

1
Ini bukan case use satu kali. Saya memiliki beberapa poligon dan mereka akan diperbarui sehingga bentuknya sangat sering berubah. Dan saya tidak ingin mendigitalkannya secara manual atau terselubung poligon menjadi garis.
Raj

Jawaban:


12

Saya sedikit kesulitan dengan Geometry generator@GSienko. Untuk bagian persimpangan, Anda juga dapat menggunakan fungsi bawaan aggregate. Saya juga menggunakan segment_to_linesfungsi yang mengubah poligon menjadi garis.

difference(
    segments_to_lines($geometry),
    aggregate(
        layer:= 'line',
        aggregate:='collect',  
        expression:= $geometry,
        filter:=intersects($geometry, geometry(@parent))
    )
)

atau

difference(
    segments_to_lines($geometry),
    aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
)

masukkan deskripsi gambar di sini

Jika Anda memiliki beberapa poligon "tidak terkait" dengan garis, Anda dapat menambahkan ifkondisi untuk persimpangan. Jika lapisan berpotongan, maka perbedaan diterapkan untuk simbologi, jika tidak seluruh geometri diterapkan.

if(
    intersects(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    difference(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    segments_to_lines($geometry)
)

masukkan deskripsi gambar di sini

sunting : Menggunakan generator baris dengan cara ini memiliki titik lemah - Anda harus menangani simbol legenda, karena membuat garis melalui poligon (bukan sebagai perbatasan). Namun Anda masih dapat menduplikasi layer, mengatur isian sederhana dan menggunakannya untuk legenda.

masukkan deskripsi gambar di sini


1
Solusi yang lebih kompleks, dan saya belajar sedikit lebih banyak lagi :)
GSienko

Saya juga :). Saya tidak perlu menggunakan generator Geometri sebelumnya, tapi itu adalah hal pertama yang saya pikirkan setelah membaca OP. Terjebak sedikit pada ini mencoba untuk menggabungkan persimpangan, dan jawaban Anda juga membantu saya, karena saya benar-benar lupa tentang fungsi Perbedaan :).
Oto Kaláb

Solusi sempurna untuk kasus saya. Saya sangat menghargai semua bantuan Anda :)
Raj

Satunya downside menggunakan generator garis adalah bahwa Anda harus menangani simbol legenda, karena membuat garis melalui poligon (bukan sebagai perbatasan). Namun Anda masih dapat menduplikasi layer, mengatur isian sederhana dan menggunakannya untuk legenda.
Oto Kaláb

4

Coba gunakan plugin refFunction di dalam generator geometri.

Anggapan. 2 lapisan - satu garis sebagai garis, dan poligon sebagai poligon.

Gaya poligon seperti itu:masukkan deskripsi gambar di sini

difference(exterior_ring( $geometry ),geom_from_wkt(geomintersects('line','$geometry')))

geomintersect akan membuat kueri spasial antara lapisan poligon dan lapisan garis, dan mengembalikan geometri dari perpotongan keduanya, dalam kasus kami, dua batas poligon. Langkah selanjutnya adalah membuat perbedaan dengan batas poligon. Saya tidak tahu apakah Anda akan memiliki lubang di dalam atau tidak, maka exterior_ring () hanya akan mengembalikan perbatasan eksterior.

Hasil akhir: masukkan deskripsi gambar di sini

Batasan - geomintersect akan memeriksa persimpangan hanya untuk satu poligon. Saya mengelola batasan itu dengan membuat layer poligon menjadi satu multipoligon besar, misalnya dengan lapisan virtual untuk style border.


3

Bagaimana kalau menambahkan garis putih di bawah garis biru di lapisan lain, yang memiliki lebar sama dengan garis merah? Jika Anda menempatkan garis biru di atas lapisan poligon, garis putih akan mengaburkan garis merah.

Ini tentu saja mengasumsikan bahwa Anda memiliki latar belakang putih seperti pada contoh Anda, dan bahwa Anda baik-baik saja dengan beberapa persilangan juga dikaburkan.

Ini adalah hasil tes cepat saya:

Gambar peta menunjukkan gaya

Pengaturan untuk garis biru:

Simbologi


Dalam kasus saya, ketebalan garis dan warna dapat bervariasi. Saya juga harus menggunakan simbol garis penanda ke poligon di peta di mana ketebalan fitur lain dan ketebalan poligon tidak akan sama.
Raj

2

Penafian: Jawaban ini tidak akan berfungsi jika Anda memiliki banyak poligon

Yang bisa Anda lakukan adalah mencari tahu simpul mana yang membentuk empat sudut poligon yang ingin Anda tarik garisnya, dan kemudian gunakan yang ada di MAKE_LINE () yang berfungsi untuk menggambar garis:

Untuk menemukan node mana yang Anda butuhkan:

  • Pertama tambahkan simbologi generator geometri
  • Setel jenis geometri ke Point / MultiPoint
  • Gunakan ekspresi POINT_N($geometry, 1)untuk menampilkan simpul pertama sebagai titik
  • Terus ubah nilainya sampai Anda tahu jumlah masing-masing dari empat sudut poligon, catat ini karena Anda akan menggunakan pasangan ini untuk menggambar garis

Untuk menggambar garis:

  • Ubah tipe geometri generator geometri menjadi LineString / MultiLineString
  • Gunakan ekspresi MAKE_LINE(POINT_N($geometry, *first point*), POINT_N($geometry, *second point*)
  • Gandakan ini menggunakan pasangan titik lainnya
  • Ini akan menggambar dua garis batas

Selanjutnya Anda hanya menambahkan simbologi mengisi pola garis normal di bawah dua generator geometri


Sayangnya, saya punya banyak poligon.
Raj
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.