…tralasciando il titolo (un periodo caratterizzato da un eccessivo stress per me), in questo articolo voglio condividere un metodo veloce su come può essere visualizzata direttamente da QGIS un’immagine memorizzata all’interno di database SQLite.
In un database possiamo storicizzare diverse informazioni non solo alfanumeriche anche dati raster come le immagini grafiche, per esempio foto, nei più svariati formati. Comunemente per memorizzare un’immagine grafica o una foto all’interno di una tabella presente nel database si usa come datatype il formato BLOB (Binary Large OBject), in quanto quest’ultimo consente di memorizzare oggetti molto grandi anche parecchi gigabyte. Molti database relazionali supportano questo tipo di dato, tra questi SQLite o SpatiaLite se presente l’estensione spaziale per il trattamento dei dati geografici. In questo ultimo caso, si tratta di un formato di database ampiamente utilizzato per memorizzare dati geospaziali (sia vettoriali che raster) soprattutto nella sua variante come standard OGC materializzato nel formato GeoPackage (*.gpkg). E poi si tratta di un prodotto Made in Italy!
Il formato BLOB è però anche un formato binario, non interpretabile direttamente ma solo attraverso l’ausilio di qualche decoder appropriato. In questo brevissimo articolo vedremo come visualizzare foto e immagini memorizzate in un campo di tipo BLOB direttamente da QGIS, facendo uso delle oramai conosciute e mitiche… Actions!
Nello screencast allegato vengono mostrati tutti i passaggi per impostare correttamente l’azione. Nello script python allegato, da usare per creare l’azione in QGIS, è necessario modificare le righe 5, 6 e 7:
UNIQUE_FIELD = 'unique_field_name' BLOB_FIELD = 'picture_field_name' FIELD_VALUE = '[%unique_field_name%]'
Alla riga 5 sostituire il valore unique_field_name con il nome di un campo univoco (magari la chiave primaria), la riga 6 deve contenere il nome del campo dove sono state memorizzate le foto ed infine alla riga 7 va messo lo stesso valore come alla riga 5 lasciando in questo caso la stringa ‘[% %]’. Nel mio caso le righe con i valori già impostati sono:
UNIQUE_FIELD = 'pkuid' BLOB_FIELD = 'picture' FIELD_VALUE = '[%pkuid%]'
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from qgis.PyQt.QtCore import Qt | |
from qgis.PyQt.QtGui import QLabel, QImage, QPixmap | |
from qgis.utils import iface | |
import sqlite3 | |
UNIQUE_FIELD = "unique_field_name" | |
BLOB_FIELD = "picture_field_name" | |
FIELD_VALUE = '[%unique_field_name%]' | |
vl = iface.activeLayer() | |
pr = vl.dataProvider() | |
db = pr.dataSourceUri().split(' ')[0].replace('dbname=','').replace("'","") | |
conn = sqlite3.connect(db) | |
sql = "SELECT {0} FROM {1} WHERE {2}={3}".format(BLOB_FIELD, vl.name(), | |
UNIQUE_FIELD, FIELD_VALUE) | |
c = conn.cursor() | |
c.execute(sql) | |
rows = c.fetchone() | |
c.close() | |
conn.close() | |
qimg = QImage.fromData(rows[0]) | |
pixmap = QPixmap.fromImage(qimg) | |
label = QLabel() | |
h = label.height() | |
w = label.width() | |
label.setPixmap(pixmap.scaled(w,h,Qt.KeepAspectRatio)) | |
label.show() |
Ciao, sto’ provando a utilizzare quanto descritto sopra con la 3.2 di qgis … ma a quanto sembra c’è un problema con lo script … una domanda, dato che il messaggio di errore che ottengo non è significativo, quale è il modo migliore per fare il debug dello script ?
Grazie
LikeLike
Ciao,
per rendere funzionante lo script sulle versione di QGIS pari o superiori alla versione 3.x è necessario apportare una piccola modifica.
La modifica consiste nel modificare la riga 2 con il seguente codice:
Il messaggio di errore mostrato da QGIS dovrebbe essere sufficiente per il debug.
LikeLiked by 1 person
E’ possibile far comparire l’immagine anzichè dalla azione dal suggerimento ?
LikeLiked by 1 person