Menghindari fitur pelabelan jika tumpang tindih dengan lapisan lain di QGIS?

16

Dengan QGIS 2.12.2, bagaimana saya bisa mengatur pelabelan lapisan untuk menghindari menempatkan label di mana fitur dari lapisan lain sudah ada?

Misalnya, jika saya memiliki layer polyline stream / sungai yang berisi "centerlines" danau, dan saya menempatkan layer poligon "danau" di atasnya dalam urutan gambar, saya tidak ingin layer sungai untuk menempatkan label di dalam danau . Sebaliknya, saya lebih suka memiliki sungai berlabel di luar danau (sesuai kebutuhan). Dengan begitu, saya dapat menempatkan label dari lapisan danau dan saya tidak mengalami tabrakan label.

Berikut ini adalah contoh, di mana (saya sengaja meletakkan garis di atas untuk tujuan visual) yang saya harapkan untuk dicapai adalah tidak ada label garis tengah sungai yang ditampilkan di dalam poligon danau: Garis diberi label di dalam poligon

RyanKDalton
sumber
4
Bagaimana data Anda disimpan dan disajikan? Bekerja dengan PostGIS, saya akan tergoda untuk mendefinisikan sungai-sungai saya dengan sebuah pemandangan, di mana bagian-bagian sungai yang berpotongan dengan danau dipotong seluruhnya. Pelabelan otomatis yang baik adalah masalah yang sulit, geometri kurang begitu.
alphabetasoup
Ini adalah shapefile, tetapi ide Anda untuk pindah ke PostGIS dan mengelola masalah data dengan cepat sangat bagus. Saya sarankan Anda memindahkan komentar Anda ke Jawaban, karena saya bisa membuat argumen yang cukup valid bahwa ini adalah resolusi yang baik.
RyanKDalton

Jawaban:

9

Pelabelan otomatis adalah masalah yang sangat sulit, tetapi geometri fitur tidak terlalu buruk.

Bahkan jika Anda bisa mendapatkan penempatan untuk bekerja secara memadai sebagian besar waktu, ada kemungkinan ada pengecualian. Beberapa di antaranya akan Anda perhatikan dan mungkin bisa diatasi. Orang lain yang tidak akan Anda perhatikan ketika membuat peta besar atau tileset karena Anda tidak bisa menuangkan setiap inci peta Anda di berbagai skala. Hampir selalu Anda akan memiliki keinginan untuk memindahkan beberapa label yang ditempatkan secara otomatis secara manual, dari perspektif kartografi.

Seperti yang saya sarankan dalam komentar saya, saya akan membuat masalah lebih mudah untuk mesin pelabelan. Dalam hal ini, saya akan melakukan ini dengan mendefinisikan sungai saya sebagai tampilan tabel *, dengan geometri sungai terpotong untuk menghormati batas danau. Dengan begitu, tidak ada fitur sungai di dalam danau untuk diberi label, dan tidak ada tabrakan label.

* Saya berasumsi penggunaan RDBMS di sini, seperti PostgreSQL / PostGIS, untuk kenyamanan dan kemampuan untuk hanya memperbarui sumber data Anda yang berwibawa dan memiliki tampilan bekerja sendiri tanpa campur tangan Anda. Tetapi Anda juga dapat melakukan beberapa pekerjaan di muka dengan file statis untuk klip dan menghapus fitur, tetapi saya tidak merekomendasikan ini jika Anda pernah berencana untuk mengunjungi kembali peta.

Contoh:

Dimulai dengan dua shapefile (bisa berupa tabel basis data) sungai dan danau, dengan sungai memotong danau dan menyebabkan masalah pelabelan yang sulit diselesaikan sepenuhnya dan dengan percaya diri:

masukkan deskripsi gambar di sini

Bawa ini ke Postgres jika Anda perlu dengan shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Kemudian tentukan tampilan dengan ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Tambahkan tampilan ke tata letak Anda:

masukkan deskripsi gambar di sini

Meskipun masalah dalam contoh saya sengaja dibuat, gaya di dua lapisan sungai (asli dan tampilan) adalah sama, dan mereka ditempatkan di atas danau dalam urutan gambar. Saat Anda memperbarui geometri danau atau sungai, Anda tidak perlu melakukan lebih dari sekadar menyegarkan rendering.

masukkan deskripsi gambar di sini

alphabetasoup
sumber
2
Meskipun saya tidak bekerja dengan lapisan DB secara langsung, solusi ini paling masuk akal bagi saya, karena tidak memerlukan pengeditan geometri sumber data awal (selain memuatnya ke dalam DB). Ini adalah contoh pemikiran di luar kotak shapefile dan batasan aplikasi, dan menemukan solusi kreatif untuk masalah dengan menggabungkan aplikasi dan logika DB.
RyanKDalton
13

Dalam QGIS> = 2.12 Anda dapat mengatur lapisan poligon "danau" sebagai penghalang label. Ini dilakukan melalui properti layer dari layer "lake", di bawah bagian 'Labels'. Ubah kotak kombo di bagian atas dari " Tanpa label " menjadi " Mencegah label lain dari fitur penutup di lapisan ini ".

ndawson
sumber
1
Terima kasih. Saya mencari sesuatu seperti itu, dan belum memperhatikan opsi drop-down sebelumnya. Namun, saya akan mengatakan ini hanya cukup berhasil. 1) Ini hanya label "semacam-dari-" berkecil hati dari lapisan Sungai (mereka masih muncul di dalam danau, tetapi kurang begitu), dan 2) sekarang saya tidak memiliki label nama Danau saya :( Saya juga telah mencoba mengatur label River> Hambatan "Mencegah label dari fitur penutup" (tidak berhasil) dan mengatur bobot Rendah & Tinggi (tidak berhasil), dan mengatur Penempatan> Prioritas = Rendah & Tinggi (tidak berhasil)
RyanKDalton
Ah, mungkin saya salah paham. Jika Anda memiliki label pada lapisan danau maka pastikan kotak centang "jauhkan label dari fitur penutup" di bawah tab rendering dicentang. Anda mungkin perlu bermain dengan slider "weight" dan opsi lain dalam grup ini untuk mendapatkan hasil yang diinginkan.
ndawson
1
Tidak, Anda benar-benar berada di jalur yang benar. Saya bermain-main dengan beban (bobot tinggi di poligon danau + "meminimalkan penempatan label pada fitur interior, bobot rendah di sungai) dan semakin dekat, tetapi tidak pernah benar-benar sampai pada titik di mana label sungai tidak berada di danau. Masalahnya tampaknya terkait dengan garis-garis yang ada di dalam dan di luar poligon
RyanKDalton
4
mengapa Anda tidak menghapus (atau membagi) garis-garis itu ketika datang ke pelabelan? Mereka tidak berguna untuk peta Anda.
radouxju
4

Saya menemukan pelabelan secara umum cukup sulit, setidaknya untuk menghasilkan label yang menyenangkan hati pembuat peta saya. Sementara fitur pelabelan otomatis berfungsi dengan baik 80% dari waktu, ada kasus-kasus seperti masalah pelabelan sungai / danau Anda di mana ia tidak menghasilkan pelabelan yang bagus. Pelabelan otomatis sering dikaitkan dengan geometri fitur, misalnya berapa banyak bagian dalam satu garis sehingga pada awalnya semua bagian diberi label. Tentu saja QGIS memiliki cara untuk mencegah pelabelan berulang, yang juga tergantung pada skala tampilan peta saat ini.

Yah, tip saya bukan solusi cepat. Saya sering membuat layer khusus hanya untuk pelabelan, sehingga label saya lebih mudah dikontrol. Dan seringkali fitur geometri untuk representasi kartografi dapat bertabrakan dengan geometri yang baik untuk pelabelan. Jadi saya akan mengusulkan untuk membuat layer baru di mana aliran tidak melintasi danau, sehingga Anda dapat menghindari masalah sama sekali. Memiliki lapisan pelabelan ekstra juga dapat membantu untuk mencegah masalah di mana arah pelabelan tidak dalam yang dimaksudkan karena itu terkait dengan bagaimana geometri itu dibuat.

Yah, saya khawatir tip saya bukan yang Anda harapkan, tapi saya harap alternatif saya mendekati saya, entah bagaimana, membantu Anda.

jujur
sumber
Anda membuat poin yang valid bahwa saya bisa membuat dataset baru (yang akan mudah dilakukan dalam kasus ini ... hapus saja fitur garis di bawah poligon), menggandakan dataset tidak terdengar terlalu menarik atau mudah dikelola, kecuali jika Anda menggunakan metode berbasis database seperti @Richard Law disebutkan.
RyanKDalton
Saya mengerti maksud Anda dan saya mengerti keraguan Anda untuk membuat dataset serupa dua kali. Dalam pengalaman saya, lapisan label seringkali lebih berbeda dari lapisan data asli. Misalnya, untuk tetap menggunakan contoh sungai Anda, Anda mungkin ingin mengubah geometri sungai lebih jauh untuk bergabung atau memisahkan bagian-bagian fitur untuk membuat label yang lebih bagus yang diulang lebih teratur. Setidaknya ini yang sering terjadi bagi saya ketika berhadapan dengan jalan OSM misalnya yang terkadang cukup terorganisir secara sewenang-wenang.
Frank
3

ada plugin yang disebut " Mask " yang dapat digunakan untuk menyaring label berdasarkan poligon.

Namun, seperti yang disebutkan dalam komentar saya sebelumnya, akan jauh lebih mudah jika Anda dapat membagi garis di persimpangan dengan danau (lihat metode yang berbeda di sini ). Kemudian Anda dapat menentukan label berukuran nol untuk segmen yang ada di dalam danau ("Lapisan"> "Pelabelan"> "Pengaturan Data Defined"> "Ukuran" lalu pilih kolom tempat Anda menyimpan ukuran label). Pemisahan menjaga sebagian besar properti jaringan sungai Anda dan dapat dibalik dengan larut, sehingga Anda dapat terus bekerja dengan satu lapisan (simpan total panjang dalam tabel atribut tertentu jika diperlukan).

radouxju
sumber
Terima kasih, plugin ini terdengar menjanjikan, jadi saya akan mencobanya.
RyanKDalton