Evitare le funzionalità di etichettatura se sovrapposte da un altro livello in QGIS?


16

Con QGIS 2.12.2, come posso impostare l'etichettatura dei livelli per evitare di posizionare le etichette dove già esistono funzionalità di un altro livello?

Ad esempio, se ho un livello polilinea flusso / fiume che contiene "linee di mezzeria" del lago e posiziono un livello poligonale "lago" sopra di esso nell'ordine di disegno, non voglio che il livello fiume inserisca un'etichetta all'interno del lago . Invece, preferirei che il fiume fosse etichettato al di fuori del lago (se necessario). In questo modo, posso posizionare le etichette dal livello dei laghi e non mi imbatto in collisioni di etichette.

Ecco un esempio in cui (ho intenzionalmente messo le linee in cima per scopi visivi) quello che spero di ottenere non sono le etichette della linea centrale del fiume mostrate all'interno del poligono del lago: Le linee sono etichettate all'interno del poligono


4
Come vengono archiviati e forniti i tuoi dati? Lavorando con PostGIS, sarei tentato di definire i miei fiumi in vista, in cui le parti dei fiumi che intersecano i laghi vengono tagliate completamente. Una buona etichettatura automatizzata è un problema difficile, meno la geometria.
alphabetasoup,

Questi erano shapefile, ma la tua idea di passare a PostGIS e gestire al volo i problemi relativi ai dati è davvero valida. Ti suggerirei di spostare il tuo commento su una risposta, dal momento che potrei fare una valida argomentazione sul fatto che si tratta di una buona risoluzione.
RyanKDalton,

Risposte:


9

L'etichettatura automatizzata è un problema davvero difficile, ma la geometria delle caratteristiche non è poi così male.

Anche se riesci a far funzionare il posizionamento in modo adeguato per la maggior parte del tempo, ci sono probabilmente delle eccezioni. Alcuni di questi noterai e potresti essere in grado di affrontare. Altri non ti accorgerai quando crei una grande mappa o un set di tessere perché non puoi scorrere ogni pollice della tua mappa su una varietà di scale. Quasi sempre avrai l'impulso di spostare manualmente alcune etichette posizionate automaticamente, da una prospettiva cartografica.

Come ho suggerito nel mio commento, renderei il problema più semplice per il motore di etichettatura. In questo caso, lo farei definendo i miei fiumi come una vista tabella *, con le geometrie dei fiumi ritagliate per rispettare i confini del lago. In questo modo, non ci sono elementi fluviali all'interno dei laghi da etichettare e nessuna collisione di etichette.

* Presumo l'uso di un RDBMS qui, come PostgreSQL / PostGIS, per comodità e la possibilità di aggiornare solo la fonte autorevole di dati e fare in modo che la vista si risolva da sola senza il tuo intervento. Ma puoi anche fare un po 'di lavoro in anticipo con file statici per tagliare ed eliminare funzionalità, ma non lo consiglio se hai mai intenzione di rivisitare una mappa.

Esempio:

A partire da due shapefile (che potrebbero essere tabelle di database) di fiumi e laghi, con i fiumi che si intersecano con i laghi e causando problemi di etichettatura che sono difficili da risolvere in modo completo e sicuro:

inserisci qui la descrizione dell'immagine

Portali in Postgres se ne hai bisogno con shp2pgsql :

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

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

Quindi definire una vista con 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;

Aggiungi la vista al tuo layout:

inserisci qui la descrizione dell'immagine

Sebbene il problema nel mio esempio sia stato deliberatamente fabbricato, gli stili nei due strati del fiume (originale e vista) sono gli stessi e sono posizionati in cima al lago nell'ordine di disegno. Quando aggiorni le geometrie dei laghi o dei fiumi, non dovrai fare molto di più che aggiornare il rendering.

inserisci qui la descrizione dell'immagine


2
Anche se non stavo lavorando direttamente con un livello DB, questa soluzione per me aveva più senso, in quanto non richiedeva la modifica della geometria delle origini dati iniziali (oltre a caricarle nel DB). Questo è un ottimo esempio di pensiero fuori dagli schemi di shapefile e limitazioni dell'applicazione e di trovare una soluzione creativa al problema combinando sia la logica dell'applicazione che quella del DB.
RyanKDalton,

13

In QGIS> = 2.12 è possibile impostare il livello poligonale "lago" come ostacolo etichetta. Questo viene fatto attraverso le proprietà del livello del livello "lago", nella sezione "Etichette". Cambia la casella combinata in alto da " Nessuna etichetta " a " Scoraggia altre etichette dal coprire le funzioni in questo livello ".


1
Grazie. Stavo cercando qualcosa del genere e non avevo notato prima quell'opzione a discesa. Tuttavia, direi che questo ha avuto solo moderatamente successo. 1) È solo "una specie di" tipo di etichette scoraggiate dal livello del fiume (appaiono ancora all'interno del lago, ma meno), e 2) ora non ho le mie etichette con il nome del lago :( Ho anche provato a impostare le etichette del fiume> Ostacoli "Scoraggia le etichette dal coprire le caratteristiche" (nessun successo) e impostare i pesi Basso e Alto (nessun successo), e impostare Posizionamento> Priorità = Basso e Alto (nessun successo).
RyanKDalton

Ah, forse ho frainteso. Se sul livello del lago sono presenti etichette, assicurarsi che la casella di controllo "scoraggia le etichette dalle funzioni di copertura" sotto la scheda di rendering sia selezionata. Potrebbe essere necessario giocare con il cursore "peso" e altre opzioni in questo gruppo per ottenere i risultati desiderati.
ndawson,

1
No, eri decisamente sulla strada giusta. Ho giocato con i pesi (peso elevato sui poligoni del lago + "minimizzare il posizionamento delle etichette sugli interni delle caratteristiche, peso ridotto sui fiumi) e mi sono avvicinato, ma non sono mai arrivato al punto in cui le etichette del fiume non erano sul lago. Il problema sembra essere associato a linee all'interno e all'esterno del poligono
RyanKDalton

4
perché non rimuovi (o dividi) quelle righe quando si tratta di etichettare? Non sono comunque utili per la tua mappa.
Radouxju,

4

Trovo l'etichettatura in generale piuttosto difficile, almeno per generare etichette che soddisfino i sensi del mio cartografo. Mentre la funzione di etichettatura automatica funziona bene l'80% delle volte, ci sono casi come il tuo problema di etichettatura fiume / lago in cui non genera una buona etichettatura. L'etichettatura automatica è spesso legata alla geometria dell'elemento, ad es. Quante parti sono allineate in modo che all'inizio tutte le parti vengano etichettate. Naturalmente QGIS ha i mezzi per prevenire l'etichettatura ripetuta, che dipende anche dalla scala della vista della mappa corrente.

Bene, comunque, il mio consiglio non è una soluzione rapida. Creo spesso un livello specializzato solo per l'etichettatura, in modo che le mie etichette siano più facilmente controllabili. E spesso la geometria delle caratteristiche per la rappresentazione cartografica può scontrarsi con una buona geometria per l'etichettatura. Quindi proporrei di creare un nuovo livello in cui i flussi non attraversino i laghi, in modo da poter eludere del tutto il problema. Avere uno strato di etichettatura aggiuntivo può anche aiutare a prevenire problemi in cui la direzione di etichettatura non è quella prevista perché è legata al modo in cui è stata creata la geometria.

Beh, temo che il mio consiglio non sia quello che ti aspettavi, ma spero che il mio approccio alternativo mi aiuti in qualche modo.


Fai notare che potrei creare un nuovo set di dati (che sarebbe facile fare in questo caso ... basta cancellare le caratteristiche della linea sotto i poligoni), raddoppiare il set di dati non sembra troppo attraente o gestibile, a meno che tu non usi un metodo basato su database come @Richard Law menzionato.
RyanKDalton,

Vedo il tuo punto e capisco la tua esitazione a creare un set di dati simile due volte. Nella mia esperienza, il livello dell'etichetta è spesso più diverso rispetto al livello dati originale. Ad esempio, per seguire l'esempio del tuo fiume, potresti voler modificare ulteriormente la geometria del fiume per unire o dividere parti di feature al fine di creare un'etichetta più bella che si ripete più regolarmente. Almeno questo è spesso il caso per me quando si tratta, ad esempio, di strade OSM che a volte sono organizzate in modo abbastanza arbitrario.
Frank,

3

c'è un plugin chiamato " Maschera " che può essere usato per filtrare le etichette in base ai poligoni.

Come accennato nel mio commento precedente, tuttavia, sarebbe molto più semplice se potessi dividere le tue linee all'intersezione con i laghi (vedi diversi metodi qui ). Quindi puoi definire un'etichetta di dimensioni zero per i segmenti che si trovano all'interno dei laghi ("Livello"> "Etichettatura"> "Impostazioni definite dai dati"> "Dimensioni", quindi seleziona la colonna in cui memorizzare le dimensioni dell'etichetta). La divisione mantiene la maggior parte delle proprietà della rete fluviale ed è reversibile con dissolvenza, quindi puoi continuare a lavorare con un singolo livello (se necessario, memorizzare la lunghezza totale in una tabella di attributi specifica).


Grazie, il plugin sembra promettente, quindi ci proverò.
RyanKDalton,
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.