Le ortofoto Open Data di Regione Toscana
... qualche considerazione in ordine sparso ...

Regione Toscana ha recentemente rilasciato un corposo blocco di ortofoto in modalità Open Data sotto licenza CC-BY 4.0
Tutti i materiali Open Data di tipo geografico rilasciati da Regione Toscana sono liberamente scaricabili in download dal sito web GeoScopio - cartoteca.
Per molti versi queste ortofoto rappresentano un tipo di materiale decisamente innovativo che saremo destinati ad incontrare sempre più frequenemente nel prossimo futuro.
Dato che alcune caratteristiche sono abbastanza inattese e non ancora ben conosciute da parte di molti, un approfondimento specifico è sicuramente opportuno.

Caratteristiche generali:

Foglio campione:

Tutti gli esempi a seguire sono basati sul foglio 02I14 - Isola del Giglio - Località Arenella
(se non avete già capito tra breve capirete perché ho scelto proprio questo foglio in particolare).


Esempi a colori naturali (RGB):

panoramica-rgb dettaglio-rgb
fig.1 Panoramica complessiva del foglio 02I14 fig.2 Dettaglio a piena risoluzione

Questo tipo di rappresentazione corrisponde alla normale visualizzazione che ci attendiamo da qualunque fotografia digitale a colori.
Si prega comunque di notare il livello di dettaglio fine che è possibile mettere in evidenza grazie alla risoluzione spaziale eccezionalmente elevata di 20 cm / pixel


Esempi a falsi colori: come utilizzare la banda NIR

arenella-rgb arenella-nirgb
fig.3 Dettaglio a piena risoluzione: colori naturali RGB fig.4 Falsi colori: NIR + Green + Blue

  • l'immagine a sinistra corrisponde ancora una volta alla normale rappresentazione a colori naturali:
    ciascun pixel deriva dalla composizione di tre bande spettrali, che sono nell'ordine: Red + Green + Blue
  • l'immagine a destra invece pare a prima vista del tutto innaturale dato che si tratta di un'immagine a falsi colori:
    tuttavia se si comparano accuratamente le due immagini diventa assolutamente ovvio che rappresentano esattamente la medesima scena.
    • La seconda immagine differisce sostanzialmente dall'altra in quanto presenta una gamma cromatica profondamente rimaneggiata;
      anche in questo caso ciascun pixel deriva dalla composizione di tre bande spettrali, che però ora sono nell'ordine: NIR + Green + Blue
    • In sostanza, per la seconda immagine abbiamo impiegato la banda NIR come rimpiazzo della banda Red;
      questo corrisponde esattamente alla resa cromatica offerta dalle tradizionali pellicole agli infrarossi.
  • Il principale vantaggio offerto dall'immagine agli infrarossi consiste nel fatto che il contrasto è profondamente diverso:
    in molti casi questo può contribuire in modo significativo a migliorare la corretta fotointerpretazione.


arenella-nirrg arenella-rnirg
fig.5 Falsi colori: NIR + Red + Green fig. 6 Falsi colori: Red + NIR + Green

  • Dato che si tratta di immagini digitali, possiamo facilmente ipotizzare qualsiasi combinazione arbitraria tra bande;
    tuttavia l'esperienza insegna che solo alcune combinazioni sono effettivamente utili per la fotointerpetazione.
  • L'immagine di sinistra è stata ottenuta utilizzando le seguenti bande spettrali: NIR + Red + Green
  • L'immagine di destra contiene invece le seguenti bande spettrali: Red + NIR + Green
  • Come è facile constatare ciascuna tra le immagini a falsi colori presenta un particolare bilanciamento cromatico;
    spesso il contrasto più elevato riesce a rendere assai più evidenti e facilmente identificabili molti dettagli naturali, quali:
    1. vegetazione, alberi, coltivazioni
    2. affioramenti rocciosi
    3. acqua e corpi idrici

Qualche richiamo elementare di ottica, astronomia e biochimica:

  • La luce solare ha un colore dominante spiccatamente giallo.
    Tuttavia l'occhio umano ha sviluppato un meraviglioso meccanismo naturale di bilanciamento del bianco, per cui riceviamo l'impressione (fallace ed illusoria) che la luce solare sia perfettamente bianca.
  • La luce solare è comunque molto ricca anche di componenti ultraviolette ed infrarosse, ma l'occhio umano è completamente cieco a queste lunghezze d'onda.
  • L'atmosfera opera un forte filtraggio selettivo:
    alcune bande spettrali vengono totalmente bloccate, altre vengono piu' o meno fortemente attenuate.
  • Il colore percepito dall'occhio umano dipende in ultima analisi dalla composizione spettrale della luce che viene riflessa e diffusa da un determinato oggetto:
    • un oggetto che presenti un forte assorbimento della luce su tutta la gamma cromatica ci apparirà nero o comunque di una tonalità molto scura.
    • un oggetto capace di riflettere tutte le lunghezze d'onda incidenti con la medesima efficienza ci apparirà bianco o comunque di una tonalità grigia più o meno chiara.
    • un oggetto con un forte picco di assorbimento delle componenti blu ci apparirà giallo (sintesi sottrattiva)
    • simmetricamente un oggetto con un forte assorbimento selettivo delle componenti gialle ci apparirà di colore blu

solar spectrum
chlorophyll ab
  • La clorofilla è una delle molecole organiche più abbondanti sulla superficie terrestre, ed ha caratteristiche fortemente fotoattive.
    Praticamente l'intero pianeta è ricoperto da un velo continuo di clorofilla, ad eccezione delle zone aride o desertiche, degli specchi d'acqua e delle aree fortemente antropizzate.
    • Le reazioni biochimiche della sintesi clorofilliana assorbono efficacemente le componenti rosso-gialle e quelle blu della luce solare.
    • Viceversa tutte le componenti verdi vengono prevalentemente riflesse; ed è proprio per questo motivo che la vegetazione ci appare di colore verde
    • La clorofilla inoltre è in grado di riflettere le componenti dell'infrarosso vicino (NIR) con un'efficienza quasi perfetta.
    • Praticamente nessun'altra sostanza tra quelle più comunemente presenti in natura presenta un profilo spettrale analogo a quello della clorofilla; livelli molto elevati di luminosità nella banda NIR molto spesso sono dovuti proprio all'attività della clorofilla.
    • Ecco finalmente spiegato perché la banda NIR ha un ruolo così importante ai fini del telerilevamento e della fotointerpretazione; perché è strettamente correlata all'attività metabolica della clorofilla, e quindi è un potente strumento di analisi ambientale (estensione e stato di salute della vegetazione) e di monitoraggio delle attività agricole.

L'indice NDVI (Normalized Difference Vegetation Index):

             NIR - Red
    NDVI = -------------
             NIR + Red
				
arenella-ndvi arenella-rgb
fig.7 Falsi colori: NDVI Immagine a colori naturali RGB

panoramic-ndvi panoramica-rgb
fig.8 Panoramica complessiva: falsi colori NDVI Panoramica complessiva: colori naturali RGB



Software utilizzato:

Creazione ed alimentazione della datasource Rasterlite2:

Per prima cosa andiamo a creare il database SQLite destinato a contenere l'immagine campione inizializzando una Raster Coverage opportunamente configurata:
[sandro@localhost giglio]$ rl2tool CREATE -db giglio.sqlite -cov giglio \
         -smp UINT8 -pxl MULTIBAND -bds 4 -cpr LZMA -srid 3003 -res 0.2 \
         -red 0 -green 1 -blue 2 -nir 3 -ndvi 1 -nd 255,255,255,255

rl2tool: request is CREATE
===========================================================
              DB path: giglio.sqlite
             Coverage: giglio
          Sample Type: UINT8
           Pixel Type: MULTIBAND
      Number of Bands: 4
        NO-DATA pixel: 255,255,255,255
       Red band index: 0
     Green band index: 1
      Blue band index: 2
       NIR band index: 3
            Auto NDVI: Enabled
          Compression: LZMA DeltaFilter (7-zip, lossless)
   Tile size (pixels): 512 x 512
                 Srid: 3003
Pixel base resolution: X=0.2 Y=0.2
======= Coverage Policies =======
Strict Resolution check: Disabled
 Mixed Resolutions mode: Disabled
  Section's Input Paths: Disabled
 Section's MD5 Checksum: Enabled
  Section's XML Summary: Enabled
===========================================================

     SQLite version: 3.8.8
 SpatiaLite version: 4.2.1-rc2
RasterLite2 version: 1.0.0-rc1

Raster Coverage "giglio" successfully created

Operation CREATE successfully completed
[sandro@localhost giglio]$ 
			

A questo punto possiamo caricare il foglio campione all'interno della Raster Coverage;
le piramidi multirisoluzione verrano create contestualmente:

[sandro@localhost giglio]$ rl2tool IMPORT -db giglio.sqlite -cov giglio \
        -srid 3003 -wf -src 02I14_2013_i4.tif -pyr -mt 8

rl2tool; request is IMPORT
===========================================================
              DB path: giglio.sqlite
    Input Source path: 02I14_2013_i4.tif
             Coverage: giglio
Using the WorldFile
          Forced SRID: 3003
Immediately building Pyramid Levels
===========================================================

     SQLite version: 3.8.8
 SpatiaLite version: 4.2.1-rc2
RasterLite2 version: 1.0.0-rc1

------------------
Importing: 02I14_2013_i4.tif
    Image Size (pixels): 8200 x 6200
                   SRID: 3003
       LowerLeft Corner: X=1656780.30 Y=4691977.24
      UpperRight Corner: X=1658420.30 Y=4693217.24
       Pixel resolution: X=0.2 Y=0.2
>> Image successfully imported in: 0 mins 43 secs
  ----------
    Pyramid levels successfully built for Section 1
>> Total time: 0 mins 52 secs

Operation IMPORT successfully completed
[sandro@localhost giglio]$ 
			
			

Queries SQL utilizzate per generare le immagini campione:

Una delle caratteristiche più innovative di RasterLite2 è quella di consentire
la stilizzazione dinamica delle immagini tramite normali query SQL:
fig.1
SELECT BlobToFile(              -- questa funzione esporta un BLOB sul filesystem
    RL2_GetMapImageFromRaster(  -- questa funzione genera un'immagine dalla Raster Coverage
        'giglio',               -- nome della Raster Coverage
        BuildMbr(               -- questa funzione definisce il Bounding Box 
                 1656780.30, 4691977.24,      -- coordinate del BBOX (in unità mappa)
                 1658420.30, 4693217.24), 
        930,                    -- larghezza dell'immagine (in pixels)
        775,                    -- altezza dell'immagine (in pixels)
        'default',              -- nome dello stile raster da applicare all'immagine
        'image/jpeg'),          -- mime-type dell'immagine da generare
    './panoramica-rgb.jpg'      -- pathname di esportazione dell'immagine
);
			
fig.2
SELECT BlobToFile(
    RL2_GetMapImageFromRaster('giglio', 
        BuildMbr(1658166.3, 4692127.24, 1658290.3, 4692282.24), 
        620, 775, 'default', 'image/jpeg'),
    './dettaglio-rgb.jpg');
			
fig.3
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1657420, 4692470, 1657580, 4692630), 
            800, 800, 'default', 'image/jpeg'),
       './arenella-rgb.jpg');
			
fig.4
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1657420, 4692470, 1657580, 4692630), 
            800, 800, 'nirgb', 'image/jpeg'),
       './arenella-nirgb.jpg');
			
fig.5
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1657420, 4692470, 1657580, 4692630), 
            800, 800, 'nirrg', 'image/jpeg'),
       './arenella-nirrg.jpg');
			
fig.6
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1657420, 4692470, 1657580, 4692630), 
            800, 800, 'rnirg', 'image/jpeg'),
       './arenella-rnirg.jpg');
			
fig.7
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1657420, 4692470, 1657580, 4692630), 
            800, 800, 'ndvi', 'image/jpeg'),
       './arenella-ndvi.jpg');
			
fig.8
SELECT BlobToFile(
       RL2_GetMapImageFromRaster('giglio', 
            BuildMbr(1656780.30, 4691977.24, 1658420.30, 4693217.24), 
            930, 775, 'ndvi', 'image/jpeg'),
       './panoramica-ndvi.jpg');
			

Stili raster utilizzati (standard SLD/SE):

Ed ecco infine tutte le definizioni formali degli stili standard SLD/SE utilizzati
per produrre le immagini campione di cui sopra:
default
	
stile virtuale: identifica implicitamente il modo naturale di rappresentazione.
nel nostro caso specifico: RGB
nirgb
<?xml version="1.0" encoding="UTF-8"?>
<RasterSymbolizer version="1.1.0" 
                  xsi:schemaLocation="http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd" 
                  xmlns="http://www.opengis.net/se" 
                  xmlns:ogc="http://www.opengis.net/ogc" 
                  xmlns:xlink="http://www.w3.org/1999/xlink" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Name>nirgb</Name>
	<Description>
		<Title>RGB-NIR - nirGB</Title>
		<Abstract>a band composed raster style: Near-INfrared, Green and Blue bands (nirGB)</Abstract>
	</Description>
	<ChannelSelection>
		<RedChannel>
			<SourceChannelName>4</SourceChannelName>
		</RedChannel>
		<GreenChannel>
			<SourceChannelName>2</SourceChannelName>
		</GreenChannel>
		<BlueChannel>
			<SourceChannelName>3</SourceChannelName>
		</BlueChannel>
	</ChannelSelection>
</RasterSymbolizer>
				
gli stili di tipo <ChannelSelection> consentono di definire
liberamente qualsiasi rappresentazione a falsi colori;
basta specificare una qualunque composizione arbitraria di bande.
nirrg
<?xml version="1.0" encoding="UTF-8"?>
<RasterSymbolizer version="1.1.0" 
                  xsi:schemaLocation="http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd" 
                  xmlns="http://www.opengis.net/se" 
                  xmlns:ogc="http://www.opengis.net/ogc" 
                  xmlns:xlink="http://www.w3.org/1999/xlink" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Name>nirrg</Name>
	<Description>
		<Title>RGB-NIR - nirRG</Title>
		<Abstract>a band composed raster style: Near-INfrared, Red and Green bands (nirRG)</Abstract>
	</Description>
	<ChannelSelection>
		<RedChannel>
			<SourceChannelName>4</SourceChannelName>
		</RedChannel>
		<GreenChannel>
			<SourceChannelName>1</SourceChannelName>
		</GreenChannel>
		<BlueChannel>
			<SourceChannelName>2</SourceChannelName>
		</BlueChannel>
	</ChannelSelection>
</RasterSymbolizer>
				
rnirg
<?xml version="1.0" encoding="UTF-8"?>
<RasterSymbolizer version="1.1.0" 
                  xsi:schemaLocation="http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd" 
                  xmlns="http://www.opengis.net/se" 
                  xmlns:ogc="http://www.opengis.net/ogc" 
                  xmlns:xlink="http://www.w3.org/1999/xlink" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Name>rnirg</Name>
	<Description>
		<Title>RGB-NIR - RnirG</Title>
		<Abstract>a band composed raster style: Red, Near-INfrared, and Green bands (RnirG)</Abstract>
	</Description>
	<ChannelSelection>
		<RedChannel>
			<SourceChannelName>1</SourceChannelName>
		</RedChannel>
		<GreenChannel>
			<SourceChannelName>4</SourceChannelName>
		</GreenChannel>
		<BlueChannel>
			<SourceChannelName>2</SourceChannelName>
		</BlueChannel>
	</ChannelSelection>
</RasterSymbolizer>
				
ndvi
<?xml version="1.0" encoding="UTF-8"?>
<RasterSymbolizer version="1.1.0" 
                  xsi:schemaLocation="http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd" 
                  xmlns="http://www.opengis.net/se" 
                  xmlns:ogc="http://www.opengis.net/ogc" 
                  xmlns:xlink="http://www.w3.org/1999/xlink" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Name>ndvi</Name>
	<Description>
		<Title>NDVI Color Map (Normalized Difference Vegetation Index)</Title>
		<Abstract>derived from the original "ndvi" color rule (GRASS GIS)</Abstract>
	</Description>
	<Opacity>1.0</Opacity>
	<ColorMapt;
		<Interpolate fallbackValue="#ffffff">
			<LookupValue>Rasterdata</LookupValue>
			<InterpolationPoint>
				<Data>-1.00000000</Data>
				<Value>#051852</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>-0.30000000</Data>
				<Value>#051852</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>-0.18000000</Data>
				<Value>#ffffff</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.00000000</Data>
				<Value>#ffffff</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.02500000</Data>
				<Value>#cec5b4</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.07500000</Data>
				<Value>#bfa37c</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.12500000</Data>
				<Value>#b3ae60</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.15000000</Data>
				<Value>#a3b550</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.17500000</Data>
				<Value>#90aa3c</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.23300000</Data>
				<Value>#a6c31d</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.26600000</Data>
				<Value>#87b703</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.33300000</Data>
				<Value>#79af01</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.36600000</Data>
				<Value>#65a300</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.43300000</Data>
				<Value>#4e9700</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.46600000</Data>
				<Value>#2b8404</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.55000000</Data>
				<Value>#007200</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.65000000</Data>
				<Value>#005a01</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.75000000</Data>
				<Value>#004900</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.85000000</Data>
				<Value>#003800</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>0.95000000</Data>
				<Value>#001f00</Value>
			</InterpolationPoint>
			<InterpolationPoint>
				<Data>1.00000000</Data>
				<Value>#000000</Value>
			</InterpolationPoint>
		</Interpolate>
	</ColorMap>
</RasterSymbolizer>
				
gli stili di tipo <ColorMap> consentono di definire un tipo completamente
diverso di rappresentazione a falsi colori.
In questo caso viene definita una rampa di colori per intervalli di valori:
  1. ciascun elemento <InterpolationPoint> definisce un limite di intervallo
  2. se il valore del pixel in input coincide esattamente con il valore <Data>
    allora il pixel in output assume direttamente il colore <Value>
  3. se il valore del pixel in input cade all'interno di un intervallo allora il pixel
    in output assume un colore interpolato proporzionalmente tra i due colori
    estremi dell'intevallo.
  4. se non si applica nessuna delle condizioni precedenti allora il pixel in output
    assume il colore specificato da <Interpolate fallbackValue="...">

Copyright: Alessandro Furieri [04/03/2015]
cc-by CC-BY 4.0