Posisi label yang ditentukan data untuk lebih dari satu skala dalam satu lapisan

9

Saya mencari solusi pelabelan yang lebih baik untuk proyek saya. Tampaknya sulit - tetapi mungkin saya hanya buta?

Proyek-proyek saya: Saya membuat buku kenaikan sepeda yang sudah dicetak. Skala utama adalah 1: 75k dan ada skala kota 10k dan skala ikhtisar 200k. Karena saya suka memiliki kualitas penempatan label "kartografi", saya menyentuh setiap label dan memindahkannya ke posisi terbaiknya. Saya harus melakukan ini untuk setiap skala tunggal sehingga kolom pelabelan saya untuk 3 skala terlihat seperti ini ('skala 1' berarti 10k 'skala 2' untuk 75k dan 'skala 3' untuk 200k):

masukkan deskripsi gambar di sini

Tetapi sebelum saya mencoba menjelaskan secara rinci, saya membangun Proyek-Contoh sederhana ini di mana Anda dapat melihat dan menguji solusi pelabelan (lama) saya untuk 3 skala: http://www.map-site.de/tmp/LabelingExample.zip

Yah, itu berfungsi tetapi:

  • Anda perlu memberi label pada kolom untuk setiap skala
  • Anda membutuhkan layer untuk setiap skala

Saya mencari solusi yang lebih baik tanpa duplikat layer dan banyak kolom. Saya mengandalkan pikiran kreatif Anda!

EDIT: Saya menambahkan dua peta yang sangat padat ini sebagai contoh:

masukkan deskripsi gambar di sini

Hanya ada satu posisi yang mungkin untuk "St. Paulus Dom" dan itu bukan kuadran: masukkan deskripsi gambar di sini

Setiap label harus dipindahkan secara manual. Beberapa label tidak ada dalam kuadran.

PETA
sumber
Apakah label perlu memenuhi beberapa kriteria tertentu? Saya tidak mengerti apa yang Anda maksud dengan "posisi terbaik".
mgri
1
Dengan "posisi terbaik" yang saya maksud adalah posisi menurut klaim kartografi. Ini lebih subjektif.
PETA
2
Saya menemukan bahwa contoh Anda menggunakan font, 'Noto Sans', yang tidak saya miliki, dan saya menduga itu akan menjadi kasus bagi orang lain juga. Anda dapat mengunduh font di sini google.com/get/noto Setelah menginstal font, Anda harus memulai ulang QGIS.
TJ Rockefeller
Terima kasih telah menambahkan tautan itu - ini adalah font standar untuk instalasi Mint saya.
PETA

Jawaban:

6

Saya harus mengatakan bahwa apa yang Anda minta agak rumit karena Anda ingin pelabelan terlihat jelas dalam skala kecil maupun skala besar (paling pas). Jadi, idenya di sini adalah bagaimana menempatkan titik yang dapat terlihat pada skala yang berbeda.

Setelah beberapa pengujian, saya menemukan bahwa alih-alih membuat beberapa kolom untuk setiap rentang skala dan meletakkan koordinat untuk x dan y pada titik tetap, Anda dapat membuat hanya satu kolom untuk posisi prioritas untuk setiap titik untuk lokasi terbaik, seperti yang Anda lihat di bawah ini (I ikuti lokasi di file Anda):

masukkan deskripsi gambar di sini

Lalu, Anda pergi ke Layer propoerties -> Labels -> Placement -> Offset from pointatau Around point, keduanya OK, tapi saya memilih Offset from point.

  1. Di QuadrantPilih Data defined override -> Edit, dan masukkan formula berikut:

    masukkan deskripsi gambar di sini

    CASE 
    WHEN  $scale >= 200000 THEN  "priority"  
    WHEN  $scale < 200000 and $scale >= 75000 THEN  "priority"   
    WHEN  $scale < 75000 and $scale >=10000 THEN  5
    WHEN  $scale < 10000 THEN 2 
    END
    

    Di sini, "Priority"adalah lokasi titik yang ditentukan dalam nama bidangPriority

  2. Anda perlu menggunakan offset untuk menggeser poin untuk visibilitas yang lebih baik, dan saya menggunakan rumus berikut:

    CASE
    WHEN  $scale >= 200000 THEN '0.001,0'
    WHEN  $scale < 200000 and $scale >= 75000 THEN '0.001,0'
    WHEN  $scale < 75000 and $scale >=10000 THEN '0.0005,0'
    WHEN  $scale < 10000 THEN '0.0001,0'
    END
    

Berikut adalah output pada skala yang berbeda:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Untuk melihat apa yang direpresentasikan oleh setiap angka [0-8] di lokasi mana, silakan lihat gambar berikut:

masukkan deskripsi gambar di sini

Anda dapat mengontrol posisi label dengan menambahkan nilai yang sesuai dengan masing-masing posisi. Namun sayangnya, Anda tidak dapat melakukannya dengan pendekatan 'klik-dan-pindah'. Anda perlu melakukannya di tabel atribut.

Memperbarui:

Berdasarkan kebutuhan Anda bahwa 9 posisi kuadran tidak cukup, saya menemukan jika Anda memilih Cartographyalih-alih Offset from point, dan memilih prioritas, seperti pada gambar di bawah ini, Anda akan memiliki 12 posisi prioritas alih-alih 9. Anda perlu membuat bidang Textjenis, lalu hanya menempatkan singkatan yang Anda inginkan untuk posisi terbaik 'TL', 'TSL', 'T' ... dll. Anda juga dapat memasukkan jarak untuk menghindari label menutupi titik.

masukkan deskripsi gambar di sini

ahmadhanb
sumber
Itu pendekatan yang saya tidak coba sampai sekarang. Apakah Anda melihat ada cara, untuk menempatkan label di kuadran dengan 'klik-dan-pindah'?
PETA
Sayangnya, Anda tidak dapat melakukannya dengan pendekatan 'klik-dan-pindah'. Anda perlu melakukannya di tabel atribut. Tetapi menambahkan 1 kolom lebih baik dari 6 kolom untuk setiap tingkat skala x, y. Saya memperbarui jawaban saya.
ahmadhanb
1
Pada hari-hari terakhir, saya juga mencoba memberikan solusi tetapi saya menyerah karena saya pikir masalahnya terlalu subyektif untuk menawarkan solusi yang lebih umum. Sebagai gantinya, solusi oleh @ahmadhanb tampaknya cukup kreatif untuk melakukannya (saya tidak mengujinya). +1 untuk saya.
mgri
Saya setuju dengan kamu. Subjektivitas di sini tinggi. Ini terutama merupakan pendapat pribadi tentang bagaimana Anda dapat menilai lokasi label jika cocok atau tidak.
ahmadhanb
1
Jangan menggunakan alat identifikasi untuk mengedit lokasi prioritas, lebih baik menggunakan alat pilih. Buka tabel atribut, dan pilih hanya untuk menunjukkan poin yang dipilih. Mulai sesi pengeditan, dan perbarui lokasi dan simpan hasil edit. Lokasi prioritas akan diperbarui secara langsung, jika Anda telah menambahkan ekspresi dalam Override yang ditentukan data.
ahmadhanb
2

Anda dapat menyingkirkan banyak lapisan dengan menggunakan ekspresi.

Dari apa yang saya lihat dalam contoh Anda, perbedaan utama antara lapisan adalah Data defined Coordinate X Ydefinisi yang menunjuk pada skala x, nilai y yang berbeda.

Anda dapat melakukannya dalam satu lapisan dengan memilih dropdown di sebelah X dan Y dan memilih edit ... yang akan memunculkan pembuat string ekspresi.

Untuk X Anda dapat menggunakan sesuatu seperti

if(@map_scale <=10000, "scale1-x", if(@map_scale <=75000, "scale2-x", "scale3-x"))

Dan untuk Y Anda dapat menggunakan sesuatu seperti

if(@map_scale <=10000,  "scale1-y" , if(@map_scale <=75000, "scale2-y", "scale3-y"))

Ini harus menggunakan nilai scale1 x, y jika skala peta kurang dari atau sama dengan 1: 10.000 dan skala 2 x, y jika skala peta kurang dari atau sama dengan 1: 75.000 dan skala 3 x, y untuk apa pun di atas itu .

Jika Anda harus memposisikan secara manual untuk setiap skala, saya tidak melihat bagaimana Anda dapat melepaskan diri dari skala # -x dan skala # -y kolom untuk setiap level yang telah Anda tetapkan.

TJ Rockefeller
sumber
Saya memiliki takdir label yang tinggi dengan bobot yang berbeda. Saya harus menempatkannya secara manual karena tidak ada otomatisme yang dapat melakukannya dengan cara kartografi yang 'nyata'. Dan peta akan dicetak dan diperbarui setiap tahun sehingga pelabelannya harus agak statis. en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP
@ MAP OK, jadi Anda tahu Anda harus memposisikan item secara manual, Anda hanya ingin lebih sedikit lapisan dan kolom.
TJ Rockefeller
Ini membantu untuk menampilkan label 3 skala hanya dengan satu lapisan. Tetapi QGIS tidak dapat "menulis kembali" koordinat melalui ekspresi. Jadi, jika saya menggunakan ekspresi skala seperti yang Anda sebutkan, saya tidak dapat memindahkan label lagi.
PETA