Posizione dell'etichetta definita dai dati per più di una scala in un livello


9

Sto cercando una soluzione di etichettatura migliore per i miei progetti. Sembra essere difficile - ma forse sono solo cieco?

I miei progetti: realizzo libri stampati per escursioni in bici. La scala principale è 1: 75k e ci sono una scala di città di 10k e una scala panoramica di 200k. Poiché mi piace avere una qualità "cartografica" dei posizionamenti delle etichette, tocco ogni singola etichetta e la sposto nella posizione migliore. Devo farlo per ogni singola scala, quindi le mie colonne di etichettatura per 3 scale appaiono così ('scala 1' sta per 10k 'scala 2' per 75k e 'scala 3' per 200k):

inserisci qui la descrizione dell'immagine

Ma prima di provare a spiegare in dettaglio, ho creato questo semplice esempio di progetto in cui è possibile visualizzare e testare la mia (vecchia) soluzione di etichettatura per 3 scale: http://www.map-site.de/tmp/LabelingExample.zip

Bene, funziona ma:

  • Hai bisogno di etichettare le colonne per ogni scala
  • Hai bisogno di un livello per ogni scala

Sto cercando una soluzione molto migliore senza livelli duplicati e tonnellate di colonne. Conto sulle tue menti creative!

EDIT: ho aggiunto queste due mappe molto dense come esempi:

inserisci qui la descrizione dell'immagine

Esiste un'unica posizione possibile per "St. Paulus Dom" e non è un quadrante: inserisci qui la descrizione dell'immagine

Ogni etichetta deve essere spostata manualmente. Alcune etichette non sono in un quadrante.


Le etichette devono soddisfare alcuni criteri specifici? Non capisco cosa intendi con "migliore posizione".
mgri,

1
Con "migliore posizione" intendo una posizione secondo le affermazioni cartografiche. È più soggettivo.
MAP

2
Ho scoperto che il tuo esempio usa un font, 'Noto Sans', che non ho, e immagino che lo sarà anche per gli altri. Puoi scaricare il font qui google.com/get/noto Dopo aver installato i font devi riavviare QGIS.
TJ Rockefeller,

Grazie per aver aggiunto quel link: è il carattere standard della mia installazione di Mint.
MAPPA

Risposte:


6

Devo dire che ciò che stai richiedendo è un po 'complicato perché vuoi che l'etichettatura sia visibile chiaramente su piccola scala e su larga scala (migliore adattamento). Quindi, l'idea qui è come posizionare il punto che può essere visibile su scale diverse.

Dopo diversi test, ho scoperto che invece di creare più colonne per ciascun intervallo di scala e inserire le coordinate per xey in punti fissi, è possibile creare solo una colonna per le posizioni prioritarie per ciascun punto per la posizione migliore, come puoi vedere di seguito (I seguito le posizioni nel tuo file):

inserisci qui la descrizione dell'immagine

Quindi, vai a Layer propoerties -> Labels -> Placement -> Offset from pointo Around point, entrambi sono OK, ma ho scelto Offset from point.

  1. In QuadrantSeleziona Data defined override -> Edite inserisci la seguente formula:

    inserisci qui la descrizione dell'immagine

    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
    

    Qui "Priority"è la posizione dei punti definita nel nome del campoPriority

  2. Devi usare l'offset per spostare i punti per una migliore visibilità e ho usato la seguente formula:

    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
    

Ecco l'output a diverse scale:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Per vedere cosa rappresenta ciascun numero [0-8] in quale posizione, dai un'occhiata alla seguente immagine:

inserisci qui la descrizione dell'immagine

È possibile controllare la posizione delle etichette aggiungendo il valore corrispondente a ciascuna posizione. Ma sfortunatamente, non è possibile farlo con l'approccio "fai clic e sposta". Devi farlo nella tabella degli attributi.

Aggiornare:

In base alla tua esigenza che 9 posizioni di quadrante non siano sufficienti, ho scoperto che se selezioni Cartographyinvece di Offset from pointe selezioni la priorità, come nell'immagine seguente, avrai 12 posizioni prioritarie invece di 9. Devi creare un campo di Texttipo, quindi inserisci solo l'abbreviazione desiderata per la posizione migliore "TL", "TSL", "T" ... ecc. Inoltre, è possibile inserire una distanza per evitare che l'etichetta copra il punto.

inserisci qui la descrizione dell'immagine


Questo è un approccio che non ho provato fino ad ora. Riesci a trovare un modo per posizionare l'etichetta nel quadrante con "clic e sposta"?
MAPPA

Sfortunatamente, non è possibile farlo con l'approccio "fai clic e sposta". Devi farlo nella tabella degli attributi. Ma l'aggiunta di 1 colonna è migliore di 6 colonne per ogni livello di scala x, y. Ho aggiornato la mia risposta.
ahmadhanb,

1
Negli ultimi giorni ho anche cercato di dare una soluzione, ma ho rinunciato perché pensavo che il problema fosse troppo soggettivo per offrire una soluzione più generale. Invece, la soluzione di @ahmadhanb sembra abbastanza creativa per farlo (non l'ho provata , però). +1 per me.
mgri,

Sono d'accordo con te. La soggettività qui è alta. È principalmente un'opinione personale su come giudicare le posizioni delle etichette se sono adatte o meno.
ahmadhanb,

1
Non utilizzare lo strumento di identificazione per modificare le posizioni prioritarie, è meglio utilizzare lo strumento di selezione. Apri la tabella degli attributi e scegli solo di mostrare i punti selezionati. Inizia la sessione di modifica, aggiorna la posizione e salva le modifiche. La posizione prioritaria verrà aggiornata direttamente, se hai già aggiunto l'espressione nella sostituzione definita Dati.
ahmadhanb

2

Puoi sbarazzarti dei livelli multipli usando le espressioni.

Da quello che ho potuto vedere nel tuo esempio, la principale differenza tra i livelli sono le Data defined Coordinate X Ydefinizioni che puntano ai diversi valori di scala x, y.

Puoi farlo in un singolo livello selezionando i menu a discesa accanto a X e Y e selezionando Modifica ... che farà apparire un generatore di stringhe di espressioni.

Per X puoi usare qualcosa di simile

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

E per Y puoi usare qualcosa del genere

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

Questo dovrebbe usare i valori scale1 x, y se la scala della mappa è minore o uguale a 1: 10.000 e la scala 2 x, y se la scala della mappa è inferiore o uguale a 1: 75.000 e la scala 3 x, y per qualsiasi cosa al di sopra .

Se devi posizionarti manualmente per ogni scala non vedo come allontanarti dalle colonne scala # -x e scala # -y per ogni livello che hai definito.


Ho un alto destino di etichette con peso diverso. Devo posizionarli manualmente poiché nessun automatismo è in grado di farlo in un modo "reale" cartografico. E le mappe verranno stampate e aggiornate ogni anno, quindi l'etichettatura deve essere in qualche modo statica. it.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP

@MAP OK, quindi sai che devi posizionare manualmente gli oggetti, vuoi solo meno livelli e colonne.
TJ Rockefeller,

Questo aiuta a visualizzare le etichette di 3 scale con un solo livello. Ma QGIS non è in grado di "riscrivere" le coordinate tramite l'espressione. Quindi, se uso l'espressione di scala come hai menzionato, non posso più spostare le etichette.
MAPPA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.