.mai visto una BLOB image da QGIS?

…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%]'


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()

 

4 thoughts on “.mai visto una BLOB image da QGIS?

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

    Like

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

    from qgis.PyQt.QtWidgets import QLabel
    from qgis.PyQt.QtGui import QImage, QPixmap
    

    Il messaggio di errore mostrato da QGIS dovrebbe essere sufficiente per il debug.

    Liked by 1 person

Leave a comment