Immobili Comunali al 2024 – Palermo

Quanti immobili possiede il Comune di Palermo?

 
Possiede circa 11.418 immobili. Lo dice un PDF di 336 pagine, aggiornato al 31 dicembre 2024, scaricabile dalla sezione Amministrazione Trasparente.
 
Ogni pagina è una tabella con otto colonne: categoria, tipo, subtipo, indirizzo, numero civico, foglio, particella, subalterno. Dati sufficienti per georeferenziare quasi tutto, a differenza dei dati sui beni confiscati alle criminalità, che sono quasi impossibili da usare.
 
Con un po’ di tempo libero e qualche token di troppo, l’idea era semplice: proviamo a metterli sulla mappa.
 
L’estrazione in CSV ha subito creato problemi: Tabula restituiva un file imperfetto per via dei limiti del PDF. Ho caricato il risultato su Claude che, dopo 23 minuti abbondanti di pensare e ripensare, ipotesi smontate e rimontate (cit.), ha tirato fuori un dataset pulito.
 
Da lì: join con i dati catastali via PyQGIS e plugin QGIS-MCP, con fallback su indirizzo e civico quando le chiavi catastali mancavano. I dati ISTAT hanno completato il quadro aggiungendo quartieri e circoscrizioni.
Output finale: un GeoPackage da cui è nata la webapp.
 
Il risultato: il 97% degli 11.418 immobili ha una geometria. 7.562 georeferenziati tramite chiave catastale, 3.000 tramite civico, 513 per prossimità.
I 343 rimasti senza coordinata sono l’unica parte che non ha trovato soluzione.
 
Sulla mappa si possono esplorare gli immobili con filtri per circoscrizione, quartiere, categoria e tipologia, analizzare la distribuzione del patrimonio, consultare la tabella completa con download JSON e leggere le note tecniche sul processo.
 
In fondo, la mappa è solo il pretesto, un gioco: l’obiettivo era verificare se i dati ANNCSU e le chiavi catastali fossero sufficienti per georeferenziare un CSV privo di geometrie. Il 97% di copertura dice di sì. Si può fareeee! 😊
Il resto, come sempre, richiede occhi umani.

Mappa interattiva del patrimonio immobiliare del Comune di Palermo al 2024: 11.418 immobili georeferenziati su particelle catastali, con filtri per circoscrizione, quartiere, categoria e tipologia.

Note tecniche

Georeferenziazione delle Proprietà Comunali di Palermo


1. Acquisizione dei dati: PDF → CSV

Il documento originale è un PDF di 336 pagine contenente l’elenco degli immobili di proprietà del Comune di Palermo aggiornato al 31 dicembre 2024. Ogni pagina contiene una tabella con 8 colonne: CATEGORIATIPOSUBTIPOINDIRIZZONUMERO CIVICOFOGLIOP.LLASUB. L’estrazione in formato CSV ha richiesto la risoluzione di diversi problemi tecnici, affrontati con lo script pdf_to_csv.py.

1.1 Nessuna tabella rilevata automaticamente

Il primo tentativo con pdfplumber e extract_tables() ha restituito zero tabelle in tutte le 336 pagine. Il PDF non usa linee di griglia visibili: le colonne sono definite unicamente dalla posizione orizzontale del testo. Soluzione adottata: analisi diretta delle coordinate dei singoli caratteri.

1.2 Colonne troppo ravvicinate

Le posizioni x dei caratteri mostrano gap molto ridotti tra alcune colonne:

SUBTIPO → INDIRIZZO24 pt
INDIRIZZO → NUMERO CIVICO22–24 pt
P.LLA → SUB14 pt
NUMERO CIVICO lungo → FOGLIO~11 pt

Con soglia iniziale a 25 pt, SUBTIPO, INDIRIZZO e NUMERO CIVICO venivano fusi in un unico campo (es. ALLOGGIO (E.R.P.)VIA BERGAMINI CARLO AMM.24). Soluzione: soglia abbassata a 8 pt con controllo esplicito sui confini di colonna.

1.3 Caratteri fisicamente sovrapposti

In alcune righe, caratteri di colonne diverse occupano la stessa posizione x. Esempio: la riga PZZA ORLANDO VITTORIO EMANUELE — le ultime lettere (L a x=600.9, E a x=605.4) si sovrappongono al numero civico 3 (x=600.0). Un estrattore che ordina per posizione x produrrebbe EMANUE3LE.

Soluzione: rilevamento del salto “backward” nel PDF stream. Nell’ordine interno del file, tutti i caratteri di EMANUELE appaiono prima del 3. Quando si incontra il 3 a x=600 dopo la E finale a x=605.4, il salto all’indietro — impossibile nel testo lineare — segnala l’inizio di un nuovo campo:

INDIRIZZO      = PZZA ORLANDO VITTORIO EMANUELE
NUMERO_CIVICO  = 3

1.4 Casi particolari nel dato grezzo

  • Fogli alfanumerici: alcuni valori FOGLIO non sono numerici puri (044C44A47/G128/) — codici catastali del centro storico di Palermo, non errori di estrazione.
  • Indirizzi assenti: 714 righe senza INDIRIZZO, relative a terreni identificati solo da foglio e particella catastale.
  • Numeri civici multipli: 33 righe con NUMERO CIVICO superiore a 7 caratteri (164 - 2708-8A-8B-1076-78-80) — intervalli legittimi riferiti a immobili su più civici consecutivi.

Output: file ELENCO_IMMOBILI_COMUNALI_2024.csv · 11.418 righe · encoding UTF-8 con BOM (compatibile Excel) · separatore virgola.


2. Obiettivo

Il Comune di Palermo dispone di un elenco degli immobili di proprietà comunale (ELENCO_IMMOBILI_COMUNALI_2024) in formato tabulare, privo di coordinate geografiche. L’obiettivo dell’elaborazione è stato quello di associare a ciascun record una geometria poligonale (particella catastale), rendendo il dataset cartografabile e analizzabile spazialmente.

Il processo ha dovuto risolvere due problemi distinti:

  1. Eterogeneità delle chiavi di ricerca: parte dei record dispone di riferimenti catastali (foglio e particella), parte solo di indirizzo postale, parte di entrambi o di nessuno.
  2. Qualità dei dati testuali: gli indirizzi presenti nel CSV presentano abbreviazioni non standard, varianti toponomastiche storiche, errori di battitura e nomi di strade nel frattempo rinominati.

3. Dataset utilizzati

ELENCO_IMMOBILI_COMUNALI_2024Tabella CSV (no geom)11.418Comune di Palermo
ParticellePoligoni catastaliEPSG:6706135.101Agenzia delle Entrate
Civici - ANNCSUPunti indirizzoEPSG:4326165.027ANNCSU / Comune
ISTAT - UPLPoligoni UPLEPSG:432656ISTAT

Il layer ELENCO_IMMOBILI_COMUNALI_2024 contiene i campi:
CATEGORIA · TIPO · SUBTIPO · INDIRIZZO · NUMERO_CIVICO · FOGLIO · PLLA · SUB


4. Architettura del processo

Il processo è implementato interamente in PyQGIS (Python 3, QGIS 3.x) ed eseguito tramite il plugin QGIS-MCP. La pipeline si articola in quattro fasi:

ELENCO_IMMOBILI_COMUNALI_2024 (11.418 record)
          │
          ├─ [1] JOIN CATASTALE ──────────────► Particelle (foglio+plla)
          │         │ match: 7.562
          │         │ no match ↓
          ├─ [2] JOIN INDIRIZZO ──────────────► Civici ANNCSU → Particelle
          │         │ polygon: 3.000
          │         │ nearest: 513
          │         │ no match ↓
          ├─ [3] NO MATCH (343)
          │
          └─ [4] SPATIAL JOIN UPL ────────────► UPL + Quartiere + Circoscrizione

5. Fase 1 — Join catastale

Logica

Per ogni record del CSV che presenta valori nei campi FOGLIO e PLLA, viene costruita una chiave di ricerca (foglio, particella) normalizzata (rimozione degli zeri iniziali) e confrontata con il dizionario delle particelle catastali.

chiave_elenco  = (FOGLIO.lstrip('0'), PLLA.lstrip('0'))
chiave_catasto = (Foglio.lstrip('0'), particella.lstrip('0'))

Quando più particelle condividono la stessa chiave (es. frazionamenti), le geometrie vengono unite con combine().

Risultato

 7.562 record georeferenziati (66,2%) — metodo più preciso, corrispondenza diretta con il Catasto.


6. Fase 2 — Join per indirizzo

Per i record senza riferimento catastale (o con catastale non trovato), si utilizza il layer Civici - ANNCSU come ponte: dato un indirizzo testuale e un numero civico, si individua il punto del civico, e da quel punto si risale alla particella catastale.

6.1 Pipeline di normalizzazione degli indirizzi

La normalizzazione è il passaggio critico: le stesse strade compaiono con grafie diverse nel CSV e nel layer Civici. È stata implementata la funzione norm_addr() con le seguenti trasformazioni in sequenza:

a) Pulizia base

  • Conversione in maiuscolo
  • Rimozione contenuto tra parentesi: VICOLO RITIRO SUOR VINCENZA (1) → VICOLO RITIRO SUOR VINCENZA
  • Normalizzazione spazi e rimozione punti terminali non significativi

b) Gestione elisioni italiane

Le contrazioni italiane (DELL'SANT'SULL'NELL'DALL'ALL'COLL'GL') vengono compattate, evitando però di eliminare spazi nei cognomi siciliani con apostrofo finale (CALABRO' GIOVANNIURZI' MARIO).

c) Espansione abbreviazioni

V. / (inizio stringa)VIA
VLO / V.LOVICOLO
CLECORTILE
PZZA / P.ZZA / P.ZAPIAZZA
P.LEPIAZZALE
P.TTA / PTTAPIAZZETTA
GRADINGRADINATA
STR.VICSTRADA VICINALE
PALPALAZZO
SS.XLSANTISSIMI QUARANTA
AMMAMMIRAGLIO
MONSMONSIGNORE
GENGENERALE
MAGGMAGGIORE
CARDCARDINALE
S. + consonanteSAN ...
S. + vocaleSANT'...
I/II/III/IV/V (romani)PRIMO/SECONDO/TERZO/QUARTO/QUINTO

d) Ordinamento token (token sorting)

Per gestire l’inversione nome/cognome nei dedicatari di strade:

"VIA GIUSEPPE CIRINCIONE"  →  norm: "VIA CIRINCIONE GIUSEPPE"
"VIA CIRINCIONE GIUSEPPE"  →  norm: "VIA CIRINCIONE GIUSEPPE"  ✓ match

Il primo token (tipo di via) è mantenuto fisso; i token successivi vengono ordinati alfabeticamente, escludendo le stop word (DELLADELLODEGLIDELLEDELDEI).

e) Gestione SAN / SANTA

Per le abbreviazioni S. seguite da consonante, vengono generate due candidature: una con SAN e una con SANTA, per coprire ambiguità come S. ROSALIA (santa) vs S. ROCCO (san).

6.2 Dizionario alias toponomastici

Per strade con denominazione errata nel CSV o rinominate nel tempo, è stato aggiunto un dizionario di alias applicato dopo la normalizzazione:

VIA LA GUMINA FRATELLIVIA FRATELLI LAGUMINACognome composto scritto separato
VIA DELL'ERMELLINOVIALE NICOLÒ AZOTIStrada rinominata
VIALE XXVII MAGGIOVIALE VENTISETTE MAGGIONumero romano → lettera

6.3 Ricerca del numero civico

La funzione parse_civico() estrae i numeri civici da stringhe non standardizzate:

  • 7/D-7/E → [7]
  • 02/03/2026 (data per errore nel campo) → [2, 3] (match sul primo valido)
  • SNCS.N.C.0 → [None] (nessun numero, prende primo civico disponibile sulla strada)

6.4 Da punto civico a particella

Una volta individuato il punto del civico, la ricerca della particella avviene in due passi:

  1. Polygon-in-point: interroga il QgsSpatialIndex delle particelle e verifica quale poligono contiene il punto. Le particelle stradali (campo particella contenente la stringa STRADA) sono escluse dall’indice.
  2. Nearest neighbor (fallback): se nessun poligono contiene il punto (es. civico sul bordo), si recuperano le 10 particelle più vicine e si seleziona quella a distanza minima reale.

La trasformazione di coordinate Civici (EPSG:4326) → Particelle (EPSG:6706) viene applicata prima della ricerca.

Risultato

Civico → poligono contenente3.000
Civico → particella più vicina513
Totale fase 23.513

7. Fase 3 — Record non georeferenziati (no match)

 Totale: 343 record (3,0%)

Foglio/plla nel CSV ma particella non trovata in catasto181
Senza foglio né indirizzo nel CSV83
Indirizzo presente ma strada non in Civici ANNCSU40
Foglio+indirizzo entrambi presenti ma nessuno risolto39

I 181 record con chiave catastale non trovata sono probabilmente riferiti a particelle soppresse, accorpate o con numerazione non aggiornata nel layer catastale disponibile.

I 40 record con indirizzo non trovato in Civici si riferiscono prevalentemente a strade periferiche, vicinali private o accessi non censiti nel dataset ANNCSU.

Distribuzione per categoria

Edificio126
Terreno95
Area50
Unità non abitativa42
Unità abitativa30

8. Fase 4 — Arricchimento territoriale (UPL)

Per tutte le feature con geometria, è stato eseguito un spatial join per posizione con il layer ISTAT - UPL, trasferendo i campi:

  • UPL — nome dell’Unità di Primo Livello ISTAT
  • Quartiere — quartiere amministrativo
  • circoscrizione — circoscrizione comunale (I–VIII)

Metodo: centroide della particella → poligono UPL che lo contiene. Il layer UPL (EPSG:4326) è stato trasformato in EPSG:6706 prima del confronto.

 11.074 feature arricchite (le 343 no_match rimangono prive di dato territoriale).


9. Risultati complessivi

9.1 Georeferenziazione

Join catastale (foglio+plla)7.56266,2%
Join indirizzo → poligono3.00026,3%
Join indirizzo → nearest5134,5%
Con geometria11.07597,0%
No match3433,0%
Totale11.418100%

9.2 Distribuzione per categoria

Unità abitativa5.775
Unità non abitativa1.969
Terreno1.697
Edificio1.528
Area449

9.3 Distribuzione per tipo (top 10)

Edilizia residenziale pubblica4.584
Edilizia residenziale1.398
Locale1.103
Verde755
Area710
Scuola656
Arredo urbano328
Parcheggio310
Impianto tecnico278
Ufficio271

9.4 Distribuzione territoriale per circoscrizione

I1.605
II1.735
III1.323
IV1.217
V1.776
VI1.307
VII1.179
VIII932

9.5 Top 10 UPL per concentrazione

Borgo Nuovo985
San Giovanni Apostolo706
Ciaculli Croce Verde535
Tribunali o Kalsa501
Palazzo Reale o Albergaria495
Settecannoli470
Tommaso Natale – Sant’Ambrogio – Cardillo445
Bonagia412
S. Rosalia401
Monte di Pietà o Seralcadi399

10. Specifiche tecniche dell’output

Driver: GeoPackage (OGC standard)
Layer: immobili_comunali_georef
Geometria: MultiPolygon
CRS: EPSG:6706 (RDN2008 — Geographic 2D)
Encoding: UTF-8
Feature totali: 11.418
Dimensione file: ~4,4 MB

Schema dei campi

fidIntegerID progressivo
CATEGORIAStringCategoria immobile (abitativa, terreno, edificio…)
TIPOStringTipo d’uso (ERP, scuola, verde, parcheggio…)
SUBTIPOStringSottotipo
INDIRIZZOStringIndirizzo dal CSV sorgente
NUMERO_CIVICOStringNumero civico dal CSV sorgente
FOGLIOStringFoglio catastale
PLLAStringParticella catastale
SUBStringSubalterno
MATCH_TYPEStringMetodo di georeferenziazione usato
UPLStringNome UPL ISTAT
QuartiereStringQuartiere amministrativo
CircoscrizioneStringCircoscrizione (I–VIII)

Valori del campo MATCH_TYPE

foglio_pllaGeoreferenziato tramite chiave catastale
civici_polygonGeoreferenziato tramite civico → particella contenente
civici_nearestGeoreferenziato tramite civico → particella più vicina
no_matchNon georeferenziato

 


Dati elaborati tramite mappatura automatica con PyQGIS e Claude AI. I risultati richiedono verifica da parte di operatori qualificati per garantire l’accuratezza delle informazioni e correggere eventuali errori.
Non è stato possibile applicare il medesimo metodo ai Beni confiscati, in quanto sprovvisti di riferimenti utili validi.
I contenuti presenti in questa webapp, compresi testi ed elementi grafici, hanno carattere puramente informativo e divulgativo.
Non sono presenti dati personali o sensibili. Si precisa che questi materiali non costituiscono documenti ufficiali né hanno alcun valore legale.
Per consultare la documentazione ufficiale e legalmente vincolante, si prega di fare riferimento agli atti definitivi allegati alle relative deliberazioni degli organi competenti.