A inizio 2025 l'agenzia delle entrate ha reso disponibili i dati catastali su fogli e particelle in formato vettoriale. Sono consultabili come servizio WFS e scaricabili in formato GML.
👉 È una buona notizia, ma c'è un grosso limite: non è possibile interrogare i dati per attributo, ma solo per geometria.
E anche le ricerche geometriche/geografiche sono limitate.
Abbiamo quindi contattato l'Agenzia delle Entrate e purtroppo ci hanno comunicato che:
sono abilitate solo le richieste in GET per GetCapabilities, DescribeFeatureType, GetFeature con il boundig box senza ulteriori filtri.
Ci sembrava utile trovare un'alternativa - anche soltanto parziale - e abbiamo realizzato un motore di query, che dato un codice catastale comunale, un numero foglio e un numero particella, restituisce le coordinate di un punto della particella.
Questa coppia di coordinate è quello che basta ad avere restituito dal WFS dell'agenzia delle entrate il poligono della particella, perché è interrogabile per geometria.
Questa coppia di coordinate, come risposta a una query per attributo è il piccolo servizio che abbiamo reso disponibile.
Il servizio è reso disponibile interrogando dei file parquet disponibili in HTTP. Infatti - come ha scritto Andrea Borruso - se si ha a disposizione un URL di un file parquet
è un po' come avere delle API.
Con un client come duckdb (via cli
o via linguaggio di scripting) è possibile infatti lanciare delle query SQL
in modo diretto a un URL di un file parquet
.
La prima query da fare è quella che, dato un codice catastale comunale, restituisce il nome del file parquet da interrogare per le particelle della regione in cui ricade il comune.
Ad esempio per il comune con codice "M011" (Villarosa) si può lanciare la seguente query:
duckdb -c "SELECT *
FROM 'https://raw.githubusercontent.com/ondata/dati_catastali/main/S_0000_ITALIA/anagrafica/index.parquet'
WHERE comune LIKE 'M011';"
In output si avrà (tra le altre cose) il nome del file da interrogare, che in questo caso è 19_Sicilia.parquet
:
comune = M011
file = 19_Sicilia.parquet
CODISTAT = 086020
DENOMINAZIONE_IT = VILLAROSA
Non resta che interrogare per comune, foglio e particella il file 19_Sicilia.parquet
.
Per avere ad esempio la coppia di coordinate della particella 2
del foglio 0002
del comune con codice catastale M011
, è possibile lanciare:
duckdb -c "
SELECT *
FROM 'https://raw.githubusercontent.com/ondata/dati_catastali/main/S_0000_ITALIA/anagrafica/19_Sicilia.parquet'
WHERE comune LIKE 'M011'
AND foglio LIKE '0002'
AND particella LIKE '2';
"
In output restituisce (si può provare qui):
INSPIREID_LOCALID = IT.AGE.PLA.M011_000200.2
comune = M011
foglio = 0002
particella = 2
x = 14181642
y = 37639896
Le coordinate x
e y
sono archiviate come numeri interi, per ottimizzare le dimensioni dei file parquet
. Ma in realtà sono longitudine e latitudine espresse in gradi decimali, con 6 cifre decimali, moltiplicate per 1.000.000
. Ad esempio:
- Coordinate memorizzate:
x=14181642
,y=37639896
- Coordinate reali:
lon=14.181642
,lat=37.639896
Se si riportano le coordinate in gradi decimali e si costruisce un piccolo bounding box attorno a esse, si può interrogare il WFS dell'agenzia delle entrate per avere il poligono della particella.
Una query WFS di esempio ha questa struttura:
https://wfs.cartografia.agenziaentrate.gov.it/inspire/wfs/owfs01.php?language=ita&SERVICE=WFS&VERSION=2.0.0&TYPENAMES=CP:CadastralParcel&SRSNAME=urn:ogc:def:crs:EPSG::6706&BBOX=37.9999995,12.9999995,38.0000005,13.0000005&REQUEST=GetFeature&COUNT=100
Se si lancia si hanno restituiti in XML (il formato di default) i dati delle particelle comprese nel bounding box definito dalle coordinate 37.9999995,12.9999995,38.0000005,13.0000005
.
<wfs:FeatureCollection
xmlns:CP="http://mapserver.gis.umn.edu/mapserver"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mapserver.gis.umn.edu/mapserver
https://wfs.cartografia.agenziaentrate.gov.it/inspire/wfs/owfs01.php?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=CP:CadastralParcel&OUTPUTFORMAT=application%2Fgml%2Bxml%3B%20version%3D3.2
http://www.opengis.net/wfs/2.0
http://schemas.opengis.net/wfs/2.0/wfs.xsd
http://www.opengis.net/gml/3.2
http://schemas.opengis.net/gml/3.2.1/gml.xsd"
timeStamp="2025-02-23T20:26:50"
numberMatched="1"
numberReturned="1">
<wfs:boundedBy>
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::6706">
<gml:lowerCorner>37.999249 12.999534</gml:lowerCorner>
<gml:upperCorner>38.000361 13.000943</gml:upperCorner>
</gml:Envelope>
</wfs:boundedBy>
<wfs:member>
<CP:CadastralParcel gml:id="CadastralParcel.IT.AGE.PLA.A176_003100.329">
<gml:boundedBy>
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::6706">
<gml:lowerCorner>37.999249 12.999534</gml:lowerCorner>
<gml:upperCorner>38.000361 13.000943</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<CP:msGeometry>
<gml:Polygon gml:id="CadastralParcel.IT.AGE.PLA.A176_003100.329.1" srsName="urn:ogc:def:crs:EPSG::6706">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="2">
38.00030250 12.99962227 38.00022463 12.99953415 37.99924858 13.00089595 37.99928465 13.00094337 38.00036148 12.99969166 38.00030250 12.99962227
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</CP:msGeometry>
<CP:INSPIREID_LOCALID>IT.AGE.PLA.A176_003100.329</CP:INSPIREID_LOCALID>
<CP:INSPIREID_NAMESPACE>IT.AGE.PLA.</CP:INSPIREID_NAMESPACE>
<CP:LABEL>329</CP:LABEL>
<CP:NATIONALCADASTRALREFERENCE>A176_003100.329</CP:NATIONALCADASTRALREFERENCE>
<CP:ADMINISTRATIVEUNIT>A176</CP:ADMINISTRATIVEUNIT>
</CP:CadastralParcel>
</wfs:member>
</wfs:FeatureCollection>
Queste coordinate sono state ottenute estraendole con la funzione ST_PointOnSurface
, su tutte le particelle catastali. La funzione ST_PointOnSurface
restituisce un punto che è garantito essere all'interno della geometria.
Come file di input per generare questa coppia di coordinate abbiamo usato i file in formato gpkg
(uno per ogni regione), generati da Salvatore Fiandaca a partire dai file GML
messi a disposizione dall'Agenzia delle Entrate.
Per estrarre queste coordinate è stato utilizzato duckdb con l'estensione spatial
.
Questi dati sono disponibili con la licenza CC BY 4.0, quindi sono liberamente utilizzabili, a patto di citare la fonte.
Se li usi puoi scrivere "Dati resi disponibili da OnData" e linkare a questo spazio (https://github.com/ondata/dati_catastali).
La prima persona a usarli è stata Salvatore Fiandaca, che è anche stato colui che ci ha ispirato la creazione di questa banca dati (grazie Salvatore).
Ha realizzato uno strumento per QGIS, di cui potete leggere qui, che consente di scaricare le particelle catastali proprio tramite una ricerca per attributo.
Una funzione personalizzata per il field calc di QGIS per recuperare le geometrie delle particelle catastali.
E l'autore è sempre Salvatore Fiandaca.