QGIS e la legenda lunga delle carte geologiche

Un amico, conosciuto al primo QGIS Summer Camp di Padova (luglio 2019), mi chiede su telegram:

Chat privata 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.

Compositore di stampe di QGIS

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:

field calc

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

Ringraziamenti


File CSV per test

5 pensieri su “QGIS e la legenda lunga delle carte geologiche

  1. 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"

  2. 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"

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.