ho la necessità di associare, data-driven, un’immagine memorizzata in un gpgk come blob ad un tematismo puntuale
ho provato in var modi ma non mi riesce di farlo
ho un’espressione personalizzata che mi trasforma i blob in immagine ma funziona per le cornici html ma non per il tematismo:
from qgis.core import *
from qgis.gui import *
@qgsfunction(args=‘auto’, group=‘Custom’, handlesnull=True)
def blobjpg_to_html(blob,style,feature,parent):
“”"
Restituisce il blob (che deve essere in jpeg) convertito in HTML img data url per visualizzarlo
in un Widget HTML o in un suggerimento mappa.
E’ obbligatorio il secondo parametro style.
Il parametro style puo’ assumere il valore ‘’ per nessuno stile (dimensioni originali)
o puo’ essere una stringa CSS di stile per img HTML tag,
Se stile e’ ‘Null’ viene applicato di default ‘style="max-width:100%; max-height:100%;’.
Sintassi
blobjpg_to_html(
blob,style)
Argomenti
blob - campo contenente i dati blob style - campo contenente stringa CSS
Esempi
blobjpg_to_html("photo", '') -> tag img con immagine a risoluzione originale
blobjpg_to_html("photo", Null) -> tag img con dimensioni massime
blobjpg_to_html("photo", 'width="250" height="250"') -> tag img dimensionato
Ringraziamenti
Tratto da [https://gis.stackexchange.com/questions/350541/display-photo-stored-as-blob-in-gpkg](https://gis.stackexchange.com/questions/350541/display-photo-stored-as-blob-in-gpkg)
Ciao Giulio,
non ho ben capito in quali modi hai provato e come vuoi implementare ciò che vuoi fare e che relazione c’è con la funzione di cui hai riportato il testo.
Comunque la simbologia Raster Image Marker accetta in input un’immagine codificata in base64 come testo base64: seguito dalla codifica base64 dell’immagine.
La funzione predefinita to_base64(value) trasforma il valore binario contenuto nel parametro value nella corrispondente rappresentazione di stringa codificata in base64 https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#to-base64
A presto.
Andrea
···
Il 22/02/2022 08:51, Giulio Fattori ha scritto:
Buongiorno,
ho la necessità di associare, data-driven, un’immagine memorizzata in un gpgk come blob ad un tematismo puntuale
Ciao Andrea,
ho bisogno di utilizzare l'immagine memorizzata come blob nel gpgk come Raster Image Marker, in analogia a quanto già ottengo passando il percorso al file dell'immagine che ho in una cartella.
Ho provato come mi suggerisci ma sbaglio in qualcosa, potresti darmi un esempio?
La funzione che ho citato permette di inserire l'mmagine memorizzata come blob in una cornice html nel composer, ma non funziona, anche modificata, per inserire l'immagine nel Raster Image Marker.
Grazie
A presto
Il 22/02/2022 13:11, Andrea Giudiceandrea ha scritto:
Ciao Giulio,
non ho ben capito in quali modi hai provato e come vuoi implementare ciò che vuoi fare e che relazione c'è con la funzione di cui hai riportato il testo.
Comunque la simbologia Raster Image Marker accetta in input un'immagine codificata in base64 come testo base64: seguito dalla codifica base64 dell'immagine.
La funzione predefinita to_base64(value) trasforma il valore binario contenuto nel parametro value nella corrispondente rappresentazione di stringa codificata in base64 https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#to-base64
A presto.
Andrea
Il 22/02/2022 08:51, Giulio Fattori ha scritto:
Buongiorno,
ho la necessità di associare, data-driven, un'immagine memorizzata in un gpgk come blob ad un tematismo puntuale
Ciao Andrea,
ho bisogno di utilizzare l'immagine memorizzata come blob nel gpgk come Raster Image Marker, in analogia a quanto già ottengo passando il percorso al file dell'immagine che ho in una cartella.
Ho provato come mi suggerisci ma sbaglio in qualcosa, potresti darmi un esempio?
Ciao Giulio,
puoi indicare come esattamente hai provato?
Potresti magari rendere disponibile un layer GeoPackage con almeno una feature generica che contenga anche l'immagine in un campo blob?
Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l'hai impostato con il valore del campo "image_link".
Ma avevi scritto che volevi usare il campo che contiene il BLOB dell'immagine, e questo campo è "Image_PNG".
Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con 'base64:' seguito dalla codifica base64 dell'immagine.
Per ottenere la codifica base64 dell'immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().
Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:
'base64:' || to_base64( "Image_PNG" )
'base64:' + to_base64( "Image_PNG" )
concat( 'base64:', to_base64( "Image_PNG" ) )
A presto.
Andrea
Il 23/02/2022 16:28, Giulio Fattori ha scritto:
Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?
“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman
Questo documento, allegati inclusi, contiene informazioni di proprietà di FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario in relazione alle finalità per le quali è stato ricevuto. E’ vietata qualsiasi forma di riproduzione o divulgazione senza l’esplicito consenso di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di informare tempestivamente il mittente e distruggere la copia in proprio possesso.
Ciao Salvatore,
in effetti mi pare che questa funzionalità non sia documentata.
Per Raster image marker è stata introdotta [1] similarmente a quella per SVG marker [2].
Nel manuale utente [3] la funzionalità era stata inserita (“The image can be a file on the disk, a remote URL or an embedded file encoded as a base64 string”), ma poi eliminata forse per errore (“The image can be a file on the disk, a remote URL or embedded in the style database”).
L’ho segnalato in modo che venga reintrodotta [4] (e magari spiegata meglio).
La stringa ‘base64:’ iniziale è necessaria per indicare che ciò che segue è una stringa base64 che codifica un’immagine, come ‘http:’ o ‘https:’ per indicare che si tratta di un URL.
Ho visto ora che c’è anche una risposta su stackexchange [5] che lo spiega.
Il 23/02/2022 19:00, Andrea Giudiceandrea ha scritto:
Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l'hai impostato con il valore del campo "image_link".
Ma avevi scritto che volevi usare il campo che contiene il BLOB dell'immagine, e questo campo è "Image_PNG".
Buongiorno,
grazie infinite, ci stavo diventando matto da giorni e non ho trovato alcuna documentazione esaustiva
Giulio
Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con 'base64:' seguito dalla codifica base64 dell'immagine.
Per ottenere la codifica base64 dell'immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().
Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:
'base64:' || to_base64( "Image_PNG" )
'base64:' + to_base64( "Image_PNG" )
concat( 'base64:', to_base64( "Image_PNG" ) )
A presto.
Andrea
Il 23/02/2022 16:28, Giulio Fattori ha scritto:
Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?
che funziona perfettamente con il link all’immagine ma non con il blob
come dovrei modificarla ?
Grazie e a presto
Giulio
···
Il 23/02/2022 19:00, Andrea Giudiceandrea ha scritto:
Ciao Giulio,
ho visto che il parametro di Data defined override per la simbologia Raster Image Marker l’hai impostato con il valore del campo “image_link”.
Ma avevi scritto che volevi usare il campo che contiene il BLOB dell’immagine, e questo campo è “Image_PNG”.
Come ti accennavo, Raster Image Marker può aggettare come Data defined override una stringa che inizia con ‘base64:’ seguito dalla codifica base64 dell’immagine.
Per ottenere la codifica base64 dell’immagine contenuta in un BLOB si può usare la funzione predefinita to_base64().
Quindi, se non ho capito male, dovresti poter usare, per esempio, una delle seguenti espressioni:
‘base64:’ || to_base64( “Image_PNG” )
‘base64:’ + to_base64( “Image_PNG” )
concat( ‘base64:’, to_base64( “Image_PNG” ) )
A presto.
Andrea
Il 23/02/2022 16:28, Giulio Fattori ha scritto:
Buonasera,
ecco in allegato un esempio.
quel che mi domando, e che vorrei ottenere, è: perchè non riesco ad usare il blob memorizzato nel gpgk per tematizzare il punto?
Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).
Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.
Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob:
Il 24/02/2022 11:29, Andrea Giudiceandrea ha scritto:
Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).
Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.
Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob:
Il 24/02/2022 11:29, Andrea Giudiceandrea ha scritto:
Ciao Giulio,
il tuo campo “Image_PNG” è di tipo QByteArray (come puoi vedere da Layer properties → Fields).
Per ottenere le dimensioni dell’immagine devi prima creare da esso un oggetto QImage (la cui classe hai già importato nel tuo script senza usarla), similarmente a come hai fatto creando un oggetto QImageReader.
Quindi, se l’oggetto QByteArray è memorizzato nella variabile blob: