Un amico, conosciuto al primo QGIS Summer Camp di Padova (luglio 2019), mi chiede su telegram:
In effetti l’attributo Descrizione delle carte geologiche è abbastanza lungo e se lo utilizzassimo nel compositore di stampe di QGIS, la lettura non sarebbe confortevole e la relativa legenda andrebbe oltre i margine del foglio.
In questi casi la soluzione è una sola, non esistono altre vie all’interno di QGIS, infatti ho aperto questa issue.
Nel compositore di stampe di QGIS (siamo nella 3.12), inserendo una legenda, nelle proprietà dell’oggetto abbiamo queste opzioni:

solo con il Testo a capo con
è possibile creare una legenda con descrizione multilinea.
Ho provato ad usare la funzione wordwrap
che è molto utile in questi casi, per esempio nelle etichette:
wordwrap( "DESCRIZIONE" ,50)
come si vede dalle etichette, crea una multilinea andando a capo ogni 50 caratteri (lasciando le parole intere). Questo comportamento non è implementato nella legenda del compositore.
Per ovviare a questo problema, come detto sopra, esiste una sola via ed è quella di introdurre un carattere speciale all’interno della descrizione e poi usarlo per andare a capo.
Come inserire caratteri all’interno di un testo
Per poter creare un testo multiline nella legenda del compositore di stampe di QGIS occorre inserire, per esempio ogni 50 caratteri, un carattere speciale da utilizzare, successivamente, per andare a capo e creare il multilinea.
Ma come inserire un carattere speciale ogni 50?
In QGIS e con il calcolatore di campi non è affatto semplice ed immediato (almeno con le funzioni del core), (qui un esempio per un testo non troppo lungo), la soluzione proposta è facendo uso della riga di comando (grazie mille a Andrea Borruso):
mlr --csv --quote-all --ors '\r\n' cut -f DESCRIZIONE test.txt | fold -sw 50 | mlr --csv --ors '\r\n' --quote-all cat -n | perl -pe 's/\r\n/~/g;s/\n/*/g;s/~/\r\n/g' >testww.txt
questo script va lanciato dalla shell di linux (bash) dove text.txt
è il file che contiene un campo DESCRIZIONE
popolato con il testo a cui aggiungere il carattere *
ogni 50 caratteri senza troncare parole, l’output è un nuovo file testww.txt
(occorre installare Miller).
Altra soluzione, rimanendo all’interno di QGIS, è tramite pyQGIS: ho chiesto ad una amico (Giulio Fattori grazie mille) e in meno di 20 minuti ha creato questa funzione personalizzata da usare all’interno del calcolatore di campi:
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def split_kesimo(n, k_esimo, car, feature, parent):
"""
Inserisce un * ogni kesimo spazio.
<h2>Example usage:</h2>
<ul>
split_kesimo(n, k_esimo, car)
<li>n testo da suddividere</li>
<li>kesimo numero dei caratteri suddivisione</li>
<li>car carattere che si vuole inserire </li>
split_kesimo ('il mio cane non esce la sera', 12,'*') ->
'il mio cane*non esce la*sera'
</ul>
"""
k_esimo = k_esimo + 1
b = c = d = ''
for i in range(0, len(n),k_esimo):
b = n[i : i + k_esimo]
if len(b) >= k_esimo:
c = b[0 : b.rindex(' ')]+ car
c = c + b[b.rindex(' ') + 1:k_esimo]
else:
c = b
d = d + c
return d
esempio:
NOTE FINALI: Il tema di questo post è molto sentito soprattutto dai geologi che invito a sollecitare questa issue o meglio ancora a supportarla finanziariamente.
EDIT: dietro suggerimento di Fabio Greg (grazie mille), ecco altra funzione personalizzata che fa la stessa cosa ma usa il modulo textwrap
from qgis.gui import *
from textwrap import wrap
@qgsfunction(args='auto', group='Custom')
def wrap_k_esimo(my_str, k_esimo, car, feature, parent):
"""
Inserisce un * ogni kesimo spazio.
<h2>Example usage:</h2>
<ul>
wrap_k_esimo(my_str, k_esimo, car)
<li>my_str testo da suddividere</li>
<li>kesimo numero dei caratteri suddivisione</li>
<li>car carattere che si vuole inserire </li>
split_kesimo ('il mio cane non esce la sera', 12,'*') ->
'il mio cane*non esce la*sera'
</ul>
"""
return car.join(wrap(my_str, k_esimo))
EDIT:
A partire da QGIS 3.14 è possibile modificare la legenda all’interno del compositore di stampe usando la seguente espressione: wordwrap(@symbol_label ,20)
:


Riferimenti
- QGIS : https://qgis.org/it/site/
- HfcQGIS : http://hfcqgis.opendatasicilia.it/it/latest/
- Miller : https://johnkerl.org/miller/doc/reference.html
Ringraziamenti
- Andrea Borruso by default
- Giulio Fattori per lo script Python
Grazie Salvatore, chiaro e preciso come sempre.
"Mi piace"Piace a 1 persona
Grazie a te per aver lasciato un commento. 🙂
"Mi piace""Mi piace"
Visto solo ora con un anno e più di ritardo. MI chiedevo se nel frattempo, nelle recenti versioni di QGIS, c’è per caso stata qualche novità nelle funzioni applicative riguardante anche la risoluzione della problematica in questione. Ne sai qualcosa?
"Mi piace""Mi piace"
Visto solo ora con un anno e più di ritardo. MI chiedevo se nel frattempo, nelle recenti versioni di QGIS, c’è per caso stata qualche novità applicativa nelle funzioni riguardante anche la risoluzione della problematica in questione. Ne sai qualcosa?
"Mi piace""Mi piace"
Ciao,
a partire da QGIS 3.14 è possibile usare l’espressione wordwrap(@symbol_label ,20) all’interno della legenda dentro il compositore di stampe, vedi qui:
https://github.com/qgis/QGIS/issues/35597#issuecomment-974813626
"Mi piace""Mi piace"