Image for post
Image for post

Le mappe catastali dell’Agenzia delle Entrate diventano finalmente utilizzabili

E ha senso finalmente dedicargli un mini tutorial

Alla fine del 2017 le mappe del catasto italiano venivano messe online dall'Agenzia delle Entrate, purtroppo con una licenza che le rendeva pressoché inutilizzabili: nessun uso commerciale e nessuna opera derivata, ovvero la licenza CC BY-NC-ND 4.0.

Ai tempi scrissi una frase ironica, ma non campata in aria:

Posso essenzialmente stamparmi qualche cartina, e appenderla nel bagno di casa. Già in un bagno pubblico vado fuori licenza.

È un’ottima notizia!

La vecchia licenza per me era un blocco, anche creativo. Che senso aveva ad esempio fare un tutorial su come estrarre — a partire da una lista di coppie di coordinate — i numeri delle particelle corrispondenti?
La nuova licenza, mi “titilla il velopendulo” (cit.), mi rende libero ed ecco una piccola guida d’esempio.

Come estrarre le particelle catastali a partire da un elenco di coppie di coordinate

I dati catastali sono pubblicati al momento soltanto in WMS, un servizio pensato per la "rappresentazione" del dato: di base produce immagini.
L'URL del WMS del catasto è https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php.
Tutte le caratteriste (sistemi di coordinate, elenco e nomi dei layer, ecc.) del servizio sono disponibili facendo una richiesta GetCapabilities.

Nel WMS può essere reso disponibile il metodo GetFeatureInfo, che consente di estrarre gli attributi di un layer in una determinata posizione: al click su un pixel dell'immagine - al click su un punto - vengono restituite le informazioni sull'oggetto "toccato".

Per questi dati il metodo è reso disponibile ed è un modo per portare a termine l’obiettivo di questo tutorial.

Il layer delle particelle è interrogabile, difatti nelle capabilities si può leggere queryable="1" (quando non lo è, è 0):

<Layer queryable="1" opaque="0" cascaded="0">
<Name>CP.CadastralParcel</Name>
<Title>Particelle</Title>
<Abstract>Il layer contiene le particelle catastali.Costituisce distinta particella catastale ogni porzione continua di terreno che sia della medesima qualità e classe o abbia la stessa destinazione d’uso, che sia situata in un medesimo comune ed appartenga allo stesso possessore.Le particelle, i fabbricati, le strade e le acque, in questo servizio presentati su layer separati, coprono l’intero territorio nazionale, ad eccezione dei territori nei quali il catasto è gestito, per delega dello Stato, dalle Province Autonome di Trento e di Bolzano. Nel layer Particelle sono rappresentati anche i bordi dei fabbricati eventualmente presenti all’interno delle particelle.</Abstract>
<LatLonBoundingBox minx="2" miny="33" maxx="19" maxy="48"/>
<BoundingBox SRS="EPSG:6706" minx="2" miny="33" maxx="19" maxy="48"/>
<MetadataURL type="ISO19115:2003">
<Format>application/vnd.ogc.csw.capabilities.response_xml</Format>
<OnlineResource xlink:type="simple" xlink:href="https://csw.cartografia.agenziaentrate.gov.it/age-inspire/srv/ita/csw?SERVICE=CSW&amp;VERSION=2.0.2&amp;REQUEST=GetRecordById&amp;ID=age:D_0000_ITALIA&amp;ElementSetName=full&amp;outputSchema=csw:IsoRecord"
xmlns:xlink="http://www.w3.org/1999/xlink"/>
</MetadataURL>
<Style>
<Name>default</Name>
<Title>default</Title>
<LegendURL width="89" height="20">
<Format>image/png</Format>
<OnlineResource xlink:type="simple" xlink:href="https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php?language=ita&amp;version=1.1.1&amp;service=WMS&amp;request=GetLegendGraphic&amp;layer=CP.CadastralParcel&amp;format=image/png&amp;STYLE=default"
xmlns:xlink="http://www.w3.org/1999/xlink"/>
</LegendURL>
</Style>
<ScaleHint min="0.00997805696859274" max="2.49451424214819"/>
</Layer>

Una richiesta GetFeatureInfo per questo servizio ha questo schema di URL (gli a capo sono per renderlo leggibile):

https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php?
REQUEST=GetFeatureInfo&
SERVICE=WMS&
SRS=EPSG:3045&
STYLES=&
VERSION=1.1&
FORMAT=image/png&
BBOX=355714.5,4222470.1,355716.5,4222472.1&
HEIGHT=9&
WIDTH=9&
LAYERS=CP.CadastralParcel&
QUERY_LAYERS=CP.CadastralParcel&
INFO_FORMAT=text/html&
X=5&
Y=5

Per la descrizione di dettaglio di ogni parametro, suggerisco di leggere questa pagina.
Qualche nota qui utile all'obiettivo del tutorial.

SRS è per impostare il sistema di coordinate, che è da scegliere tra quelli previsti dal servizio. Qui verrà utilizzato il 3045 (ETRS89 / UTM zone 33N (N-E)).

BBOX (bounding box) è per definire l'area di cui si vuole generare l'immagine su cui fare la query. Perché il metodo WMS, vale la pena ribadirlo, espone una rappresentazione in pixel dei dati, su cui può essere possibile fare un interrogazione per singolo pixel. Le coordinate vanno inserite in questo ordine: minimo x, minimo y, massimo x, massimo y.

HEIGHT e WIDTH per definire le dimensioni in pixel dell'immagine su cui fare la query.

LAYERS e QUERY_LAYERS per selezionare il layer da interrogare, che qui è CP.CadastralParcel.

INFO_FORMAT, per impostare il formato di output della risposta alla query.

E infine X e Y. Sono le coordinate in pixel, e lo 0 è in alto a sinistra. Se ho quindi un immagine in pixel di 9 x 9, il pixel centrale sarà quello di coordinate 5,5.

Se apro nel browser la query di sopra avrò le informazioni utili sulla particella che ricade sotto il pixel di mio interesse:

Image for post
Image for post

Con i parametri che ho inserito, ho generato da un’area di un metro di lato un’immagine di 9 x 9 pixel, su cui è stata eseguita l’interrogazione sul pixel di coordinate 5,5. Quindi sto lavorando a una risoluzione di circa 10 centimetri.

L’output è in HTML ed è qualcosa come:

<table class="wmstable" border="0">
<tbody>
<tr><th class="wmstable" colspan=7>Strato CP.CadastralParcel 'Particelle'</th></tr>
<tr><th class="wmstable" scope="col">InspireId localId</th><td>IT.AGE.PLA.G273_003400.1298</td></tr>
<tr><th class="wmstable" scope="col">InspireId_namespace</th><td>IT.AGE.PLA.</td></tr>
<tr><th class="wmstable" scope="col">Label</th><td>1298</td></tr>
<tr><th class="wmstable" scope="col">NationalCadastralReference</th><td>G273_003400.1298</td></tr>
</tbody>
</table>

Per estrarre quindi da una lista di coordinate, per ciascuna coppia, i dati della particella sottostante, basterà scrivere uno script (in qualsiasi linguaggio) che faccia questo:

  • per ogni riga di un file di input legga la coppia di coordinate;
  • per ogni coppia costruisca il bounding box (per il parametroBBOX) che lo "circonda", ad esempio sottraendo e sommando 1 metro;
  • per ogni bounding box faccia l’interrogazione sul punto centrale;
  • per ogni output HTML estragga l’informazione utile (che nel caso di sopra è IT.AGE.PLA.G273_003400.1298).

A partire da una lista così fatta (colonne separate da tabulazione, è un TSV):

355461.5	4222490.7
356257.6 4222742.7
356259.7 4222236.7

Si può usare ad esempio uno script bash, che sfrutti curl per fare le richieste HTTP e grep per estrarre dall'HTML di output i dati di interesse. Qualcosa come:

#!/bin/bashrm ./outputCatasto.txtwhile IFS=$'\t' read -r X Y; do
minX=$(bc <<< "$X - 1")
minY=$(bc <<< "$Y - 1")
maxX=$(bc <<< "$X + 1")
maxY=$(bc <<< "$Y + 1")
curl -sKL "https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php?REQUEST=GetFeatureInfo&SERVICE=WMS&SRS=EPSG:3045&STYLES=&VERSION=1.1&FORMAT=image/png&BBOX=$minX,$minY,$maxX,$maxY&HEIGHT=9&WIDTH=9&LAYERS=CP.CadastralParcel&QUERY_LAYERS=CP.CadastralParcel&INFO_FORMAT=text/html&X=5&Y=5" | grep -oE 'IT.+[0-9]' >>./outputCatasto.txt
done <./input.tsv

Restituirebbe:

IT.AGE.PLA.G273_0033A0.673
IT.AGE.PLA.G273_003500.3077
IT.AGE.PLA.G273_003500.2419

In cui ci sono tutti i dati di interesse (come particella e comune, che qui è Palermo, che ha codice G273).

Note conclusive

Mi ripeto: il tipo di licenza scelto non definisce soltanto cosa sia legalmente consentito, ma ha un impatto molto più ampio. Non mi sembra banale ad esempio il fatto che la precedente mi avesse tolto qualsiasi voglia di fare un po’ di didattica su questo servizio esposto dall'Agenzia delle Entrate e sulle richieste GetFeatureInfo dei servizi WMS.

Questa nuova licenza apre scenari creativi e di business, prima inimmaginabili e irrealizzabili. Penso che ne vedremo delle belle, è un’ottima cosa.

Per informazioni di questa natura, bisognerebbe esporre i dati anche con il servizio WFS, che consente di accedere ai dati e non a una loro rappresentazione. Se l’Agenzia è in ascolto, come sembra esserlo, questa è l’occasione per richiedere di farlo.

L’Agenzia delle Entrate dovrebbe pure offrire un accesso programmatico anche al servizio inverso: a partire dai dati di foglio e particella, restituire le coordinate dell’area corrispondente. È un servizio che è già attivo qui, ma è usabile soltanto a schermo e non anche come servizio.

Infine un grazie a Salvatore Fiandaca, che tanto tempo fa aveva provato a stimolarmi a scrivere questo post, ma insieme concordammo come — data la vecchia licenza — fosse inutile.

Altri articoli recenti e correlati a tema

Post Scriptum 1 (c’è un altro servizio attivo di query per coppia di coordinate)

Ho scoperto — qualche giorno dopo la pubblicazione del post — che c’è un altro servizio attivo, che risponde in JSON, che consente di avere i dati catastali a partire da una coppia di coordinate geografiche.

L’URL ha questa struttura (gli a capo per renderlo leggibile):

https://wms.cartografia.agenziaentrate.gov.it/inspire/ajax/ajax.php?
op=getDatiOggetto&
lon=13.62607730254396&
lat=37.327193489720905

E si può provare facendo click qui. In output si avrà:

{
"SIGLA_PROV": "AG",
"COD_COMUNE": "A089",
"DENOM": "AGRIGENTO (AG)",
"SEZIONE": " ",
"FOGLIO": "131",
"ALLEGATO": "null",
"SVILUPPO": "null",
"NUM_PART": "660",
"TIPOLOGIA": "PARTICELLA"
}

Post Scriptum 2 (come usare GDAL per scaricare i dati come GeoTIFF)

In questo vecchio post abbiamo già descritto come fare. A partire da un file XML (qui specifiche per GDAL) in cui è definita la sorgente, come questo di sotto (qui in copia)

<GDAL_WMS>
<Service name="WMS">
<Version>1.1.1</Version>
<ServerUrl>https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php?language=ita&amp;SERVICE=WMS</ServerUrl>
<Layers>CP.CadastralParcel</Layers>
<SRS>EPSG:6706</SRS>
<ImageFormat>image/png</ImageFormat>
<Transparent>FALSE</Transparent>
<BBoxOrder>xyXY</BBoxOrder>
</Service>
<DataWindow>
<UpperLeftX>2</UpperLeftX>
<UpperLeftY>48</UpperLeftY>
<LowerRightX>19</LowerRightX>
<LowerRightY>33</LowerRightY>
<SizeX>1073741824</SizeX>
<SizeY>947419256</SizeY>
</DataWindow>
<BandsCount>3</BandsCount>
<BlockSizeX>1024</BlockSizeX>
<BlockSizeY>1024</BlockSizeY>
<OverviewCount>20</OverviewCount>
</GDAL_WMS>

si lancia il comando gdal_translate con una sintassi come quella sottostante:

gdal_translate -projwin 13.34513 38.12016 13.35073 38.11676 -outsize 2000 1214 particelle.xml out.tif

In output avrò un file GeoTIFF che apparirà come la PNG sottostostante

Image for post
Image for post

Alcune note sul comando:

  • -projwin per impostare il bounding box dell’area di cui voglio l’output;
  • -outsize per impostare le dimensioni in pixel dell’immagine di output (e quindi la risoluzione.

Nota bene: alcuni layer (come quello dell’esempio soprastante) sono renderizzati e quindi esportabili soltanto in un certo intervallo di scala (fare riferimento al GetCapabilities del WMS).

Written by

#data #maps #GIS #baci #condivisione. Orgoglioso di essere presidente di @ondatait

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store