Estrarre le label dalle categorizzazioni

Il passaggio dal mondo CAD al mondo GIS, in generale dal DWG allo shp (shapefile), porta con se innumerevoli problemi, tra questi quello della categorizzazione di feature.

Spesso nel mondo CAD vengono utilizzate dei codici numerici per definire delle feature e in un altro file esterno (che viene sempre smarrito), per esempio un file testuale, vengono scritte le decodifiche, sotto un esempio:

In questi casi, la decodifica viene scritta manualmente nella Legenda e non c’è modo di recuperarla facilmente:

In questo blog post parlerò di come è nata l’idea di creare una funzione personalizzata, per il field calc di QGIS, per semplificare l’estrazione di queste decodifiche.

È un caso reale, alcuni Enti locali generano molti file shp, passando dal CAD al GIS, e la decodifica della legenda è presente solo nel file qml (il file di vestizione).

Un modo per recuperare le decodifiche è aprendo il file qml (è un file testuale tipo xml), ed estrarre manualmente i dati che ci servono, sotto un esempio:

per poi creare un file CSV con due campi, come sotto:

infine, creare una JOIN tabellare in QGIS.

I dati presenti nel file qml non sono direttamente accessibili da QGIS, ovvero, non esiste una funzione che permetta di accedere, in modo semplice, ai dati delle tematizzazione come: colore, simbolo e label, occorre necessariamente scrivere dei piccoli script in pyQGIS. Quindi contatto un caro amico (Giulio Fattori, che ringrazio per la disponibilità) che in brevissimo tempo crea una funzione personalizzata che permette di estrarre le decodifiche.

La funzione personalizzata va inserita tra le funzioni CUSTON del Calcolatore di campi.

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface
@qgsfunction(args='auto', group='Custom')
def get_catg_label(value_in, feature, parent):
"""
Restituisce il testo della legenda dell'elemento categorizzato:
<br>
<p><b>il campo in input e' quello utilizzato per la categorizzazione</b>
<br>
<h2>Example usage:</h2>
<ul>
<li>get_catg_label("Area") -> 'Parcheggio'</li>
</ul>
"""
layer = iface.activeLayer()
renderer = layer.renderer()
if layer.renderer().type() == "categorizedSymbol":
for cat in renderer.categories():
#print('val ', type(cat.value()), type(value_in))
if str(value_in) == str(cat.value()):
#print('res ',cat.value(), value_in)
cat_label_out = cat.label()
break
else:
cat_label_out = ''
return cat_label_out

ecco come usarla:

  1. selezionare il layer da decodificare;
  2. avviare il calcolatore di campi;
  3. scrivere la funzione get_catg_label e come argomento il nome del campo con cui è stato categorizzato il layer;
  4. OK.

Come aggiungere una funzione personalizzata

Per aggiungere una funzione personalizzata, seguire i seguenti passi:

  1. copiare l’intero script;
  2. all’interno dell’interfaccia del field calc, cliccare nella sezione Editor delle Funzioni;
  3. cliccare sul simbolo più in verde(si trova in basso a sinistra), digitare un nome e incollare lo script precedentemente copiato nell’area centrale;
  4. salvare e ritornare nella sezione Espressioni

oppure, incollare il file *.py all’interno della cartella expressions nel profilo corrente: C:\Users\nomeUser\AppData\Roaming\QGIS\QGIS3\profiles\default\python\expressions


NOTE FINALI: La conoscenza di pyQGIS permette di risolvere problemi apparentemente irrisolvibili.


RIFERIMENTI

RINGRAZIAMENTI

DATI E PROGETTO ESEMPIO


I MIEI CANALI – ISCRIVITI


Se il blog post Ti è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!

SE IL POST/BLOG TI È STATO UTILE CONTRIBUISCI A MANTENERLO AGGIORNATO PAYPAL


3 pensieri su “Estrarre le label dalle categorizzazioni

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

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