Il comune più luminoso d'Italia non è Milano (e non è Roma): cosa abbiamo trovato esponendo VIIRS particella per particella

Abbiamo appena esposto sull'API Zornade un blocco `nightlights` per tutte le 85 milioni di particelle catastali italiane: radianza notturna dal satellite NASA Black Marble VNP46A4, disaggregata dasymetrically sui footprint degli edifici. Risultato: Frattamaggiore batte Milano per radianza media, Roma scivola al ventottesimo posto, e il 27% del paese non ha edifici OSM (quindi il dato è meno fine di quanto sembri).

Team Zornade
13 min di lettura
Immagine di copertina per: Il comune più luminoso d'Italia non è Milano (e non è Roma): cosa abbiamo trovato esponendo VIIRS particella per particella

Il comune più luminoso d'Italia non è Milano (e non è Roma)

VIIRS è la fotocamera notturna di NASA Black Marble. Vede l'Italia ogni notte da quando è in orbita Suomi NPP (2012), restituisce un singolo numero per ciascun pixel da ~463 m, e quel numero (nW/cm²/sr, radianza al sensore corretta da atmosfera, BRDF lunare, stray-light) è il proxy quantitativo più usato in letteratura per attività economica, urbanizzazione e consumo energetico.

Per Zornade questo dato serviva agganciato alle particelle catastali, non ai pixel. Sotto il pixel da ~463 m possono esserci 200 particelle: alcune sono palazzine residenziali da 1500 m², altre sono porzioni dell'Agro Romano da 10 ettari. Mediare uniformemente il pixel sulla particella avrebbe prodotto numeri inutilizzabili. Abbiamo quindi disaggregato con un metodo dasymetric basato sul footprint OSM degli edifici (la metodologia in dettaglio nelle quattro classi del campo estimation_method).

La pipeline è in produzione e dal 14 maggio 2026 la sezione nightlights è esposta dalla API v2: un GET /parcels/{id}?sections=nightlights restituisce dieci campi per ogni particella italiana. Mentre la riempivamo abbiamo guardato i numeri aggregati per comune. Alcuni risultati erano attesi (Milano in cima alla luce totale), altri molto meno.

Il dataset in tre numeri

  • VNP46A4 Collection 2, anno 2023 - composito annuale a 15 arc-secondi (~463 m) prodotto da NASA Black Marble Science Team (GSFC). Collection 1 è stata terminata ad agosto 2025: i numeri attuali sono Collection 2. Open data, riuso anche commerciale.
  • 85.187.061 particelle catastali italiane classificate. Le sezioni libro tavolare (Bolzano e Trento) sono incluse ma trattate separatamente per via dei codici cadastali atipici.
  • 5 classi con soglie standard nella letteratura VIIRS (Elvidge et al.): dark < 0,5 - dim 0,5–3 - medium 3–10 - bright 10–30 - very_bright ≥ 30 nW/cm²/sr.

A livello nazionale, la distribuzione conferma quello che ci si aspetta da un paese pieno di Appennino e isole vuote:

Classi di radianza notturna · distribuzione nazionale

classe particelle quota
dark 57.611.159 67,63 %
dim 14.680.541 17,23 %
medium 6.659.702 7,82 %
bright 3.806.037 4,47 %
very_bright 2.429.622 2,85 %

Due terzi del territorio sono buio (sotto soglia 0,5). Il dato suona drastico solo se uno pensa che "particella = casa". Per fortuna no: la stragrande maggioranza delle particelle italiane è agricola, boschiva o stradale, non residenziale. Il 2,85 % very_bright (2,4 milioni di particelle ≥ 30 nW/cm²/sr) è una stima ragionevole della saturazione luminosa effettiva del paese.

Il ranking della radianza media comunale

Per ogni comune calcoliamo ntl_mean_comune come zonal stats (mean) del raster VIIRS sul confine ISTAT. È una misura di densità di luce, non di luce totale: divide ogni pW emesso dal comune per la sua area. Top 15 (radianza media, almeno 3000 particelle nel comune):

Top 15 comuni italiani per radianza notturna media · VNP46A4 2023

comune provincia regione mean nW/cm²/sr % bright+vb
Frattamaggiore Napoli Campania 74,21 18,9 %
Arzano Napoli Campania 66,49 36,1 %
Melito di Napoli Napoli Campania 64,75 34,8 %
Grumo Nevano Napoli Campania 64,33 18,8 %
Cardito Napoli Campania 59,40 27,5 %
Volla Napoli Campania 57,26 24,7 %
Casoria Napoli Campania 56,76 35,8 %
Pero Milano Lombardia 56,26 29,6 %
San Giorgio a Cremano Napoli Campania 55,32 30,9 %
Casandrino Napoli Campania 55,29 27,0 %
Milano Milano Lombardia 54,98 41,7 %
Napoli Napoli Campania 52,58 36,8 %
Grugliasco Torino Piemonte 51,85 16,4 %
Frattaminore Napoli Campania 51,73 6,5 %
Mugnano di Napoli Napoli Campania 51,04 38,2 %

Tre cose saltano fuori subito.

(1) La cintura napoletana stacca tutto il resto. Frattamaggiore (Belfiore D789, 6174 particelle, ~5,3 km², circa 30.000 abitanti) registra 74,21 nW/cm²/sr - il 35 % più di Milano. Arzano, Melito, Casoria, Casandrino, San Giorgio a Cremano: ognuno di questi piccoli comuni "satellite" di Napoli batte la radianza media del capoluogo. Non è un errore di calibrazione: è quello che il satellite vede. Sono comuni piccoli e completamente saturati di edificato continuo. Frattamaggiore ha una densità abitativa intorno ai 5800 ab/km², senza periferie agricole a diluire il pixel.

(2) Milano è solo undicesima. 54,98 nW/cm²/sr. Coerente con la sua densità urbana effettiva (parchi, periferie, scali ferroviari diluiscono il dato), ma sotto Pero (56,26) - un comune di 11.000 abitanti che ospita Centro Direzionale fieristico, autostrada e svincoli del Rho-Pero illuminati.

(3) Roma non è in tabella. Lo vediamo subito sotto, perché è il caso più istruttivo.

Il gotcha #1: Roma è frammentata in 2.177 sezioni catastali

Roma non compare nel ranking dei comuni "interi" perché nel catasto Roma non esiste come singolo Belfiore: il gml_id di una particella romana ha forma CadastralParcel.IT.AGE.PLA.H501A0968A0_<foglio>.<particella> - c'è H501 (il codice di Roma) seguito da un codice di sezione urbana. Roma ha 2.177 sezioni catastali distinte. Tutte condividono la stessa ntl_mean_comune di 20,27 nW/cm²/sr, ma sono trattate come entità separate nel ranking semplice (vale lo stesso per Genova, Trieste, Bari, Verona, L'Aquila, e altri).

Aggregando le 2.177 sezioni:

  • Roma, 468.958 particelle, mean 20,27 nW/cm²/sr, 66,6 % dark, 18,2 % very_bright.
  • Sum total radiance: 7.731.700 nW/cm²/sr - più di 1,5 volte quella di Milano (4.642.654).

Roma quindi non è "spenta": emette in assoluto più luce di Milano. Ma su 1.285 km² di superficie comunale (cinque volte Milano), spalmata anche sull'Agro, sulla pineta di Castel Fusano, sul GRA visto di taglio. La radianza media diluita a 20,27 è onesta. Per confronto, Bari, l'altra grande città sezionata, segna 49,82 - densità urbana molto più compatta su 116 km².

Tradotto: la media VIIRS comunale è una misura di densità di urbanizzazione, non di importanza economica. Per "importanza luminosa" si guarda la somma:

comune provincia particelle mean sum (totale luce)
Roma Roma 468.958 20,27 7.731.700
Milano Milano 120.731 54,98 4.642.654
Napoli Napoli 88.149 52,58 3.045.467
Firenze Firenze 104.062 37,41 2.749.981
Palermo Palermo 128.198 28,41 2.720.911
Torino Torino 79.531 50,94 2.421.339
Padova Padova 74.530 32,33 1.669.687
Bologna Bologna 73.508 28,44 1.447.157
Messina Messina 170.766 9,06 1.163.574

Densità vs intensità totale · Roma outlier per estensione, non per densità

Messina ottavo per luce totale con una media bassissima (9,06): tanta superficie, lunga 50 km sullo Stretto, 90 % delle particelle classificate dark. Letta correttamente, è una città stretta-stretta lungo la costa con tanto entroterra montuoso buio.

Composizione classi di luminosità · città metropolitane

Il gotcha #2: il 27 % delle particelle non ha edifici OSM sotto

La disaggregazione dasymetric funziona così: per ogni comune, calcoliamo la radianza media VIIRS sul confine ISTAT, e poi la ridistribuiamo alle particelle proporzionalmente al footprint degli edifici OSM contenuti in ciascuna. Una particella senza edificio riceve zero, una con 200 m² di footprint riceve molto, una con 1000 m² riceve cinque volte tanto. Sotto il pixel da ~463 m, il dato torna a sembrare specifico della singola parcella.

Funziona dove OSM ha edifici mappati. Non sempre.

A livello nazionale:

  • dasymetric: 54.405.189 particelle (73,07 %)
  • uniform: 20.039.326 particelle (26,91 %) - comune senza copertura edificata sufficiente in OSM (<5 % delle particelle), la radianza comunale viene distribuita uniformemente su tutte le particelle.
  • no_ntl: 9.618 particelle (0,01 %) - comuni dove nemmeno il pixel VIIRS è disponibile.

La quota uniform è la metrica più importante della pipeline e non ha un equivalente standard nella letteratura: misura dove il dato VIIRS è meno preciso a scala particellare (la classe ntl_class resta affidabile a scala comunale, ma il singolo numero ntl_parcel per una particella di Petralia Soprana o di Acquaformosa va trattato per quello che è - un valore distribuito uniformemente, non una stima per quella particella). Per regione:

Dove la disaggregazione dasymetric non funziona · % uniform per regione

regione particelle % uniform
Molise 1.684.925 79,2 %
Abruzzo 4.127.710 76,2 %
Campania 5.353.757 60,5 %
Basilicata 1.989.057 54,6 %
Calabria 3.803.683 54,2 %
Lazio 4.289.269 39,4 %
Sicilia 7.346.726 34,8 %
Valle d'Aosta 861.052 32,7 %
Marche 2.238.234 30,9 %
Umbria 1.742.477 30,9 %
Piemonte 8.249.873 19,7 %
Liguria 2.434.112 15,4 %
Lombardia 6.762.957 11,1 %
Emilia-Romagna 4.527.365 8,8 %
Friuli-V.G. 1.677.598 6,3 %
Veneto 4.746.840 0,5 %
Puglia 4.671.774 0,2 %
Toscana, Sardegna ~8 milioni 1,7 % - 1,6 %

Il pattern è chiaro: regioni dove OSM è stato mappato bene (Veneto, Puglia, Toscana, Emilia, Lombardia) hanno copertura dasymetric piena. Regioni montuose e a bassa densità abitativa (Molise, Abruzzo, Basilicata, Calabria) hanno copertura più sottile su OSM e quindi più uniform. Non è un difetto della nostra pipeline: è uno stato del mondo (gli edifici di Pietragalla non li ha mappati nessuno su OSM). Lo dichiariamo esplicitamente via il campo estimation_method in API.

Il gotcha #3: i comuni a 100 % bright+very_bright

Scorrendo la tabella top-25 dei più luminosi, due righe attirano l'attenzione:

  • San Nicola la Strada (Caserta), 4.173 particelle, mean 45,78 nW/cm²/sr, 100,0 % bright+very_bright, 0,0 % dark.
  • Teverola (Caserta), 4.191 particelle, mean 45,24 nW/cm²/sr, 100,0 % bright+very_bright, 0,0 % dark.

Una distribuzione che vede il 100 % di un comune sopra la soglia bright non è plausibile fisicamente: anche nel cuore di Milano c'è almeno una manciata di particelle dim. Queste sono il sintomo di estimation_method = uniform sopra soglia: in un comune dove OSM non ha edifici sufficienti, distribuiamo la radianza media VIIRS uniformemente sulle particelle. Se il ntl_mean_comune è 45, ogni particella riceve un valore intorno a 45, e tutte cadono in bright/very_bright. È l'edge case opposto del Molise: là si fa uniforme di un valore basso e tutto diventa dim/medium; qui si fa uniforme di un valore alto e tutto diventa bright.

Lo abbiamo lasciato così di proposito. L'alternativa sarebbe stata pesare per una variabile fallback (popolazione, area), ma avremmo introdotto un proxy con assunzioni nascoste. Meglio essere espliciti: estimation_method=uniform significa "la classe è la radianza media del comune, la particella singola non ha più informazione granulare di così". Chi consuma l'API può decidere di trattare diversamente i due regimi.

Come si chiama dall'API

Una singola particella, sezione nightlights:

GET /api/v2/parcels/78488343?sections=nightlights
x-api-key: zrn_...

Risposta (particella di Abano Terme, PD, very_bright ai bordi del centro storico):

{
  "available": true,
  "ntl_parcel": 96.30,
  "ntl_density": 23536.73,
  "ntl_class": "very_bright",
  "ntl_share": 0.00057,
  "ntl_mean_comune": 16.12,
  "estimation_method": "dasymetric",
  "ntl_year": 2023,
  "source": "viirs_vnp46a4_c2_2023",
  "updated_at": "2026-04-17T13:38:16Z"
}

I campi sono tutti documentati in /api (blocco "Luminosità notturna VIIRS"). Quattro punti pratici per chi consuma:

  • ntl_density è il campo da usare per confronti cross-particella: normalizza per area. Particelle piccole molto illuminate (un autogrill in autostrada) producono ntl_density enormi anche con ntl_parcel modesto.
  • ntl_class è ordinale, calibrata sulle soglie standard. Per visualizzazioni a 5 colori va presa così com'è.
  • ntl_share è una quantità (0..1) interna alla particella: somma su tutte le particelle del comune = 1,0. Utile per ranking interno-comune (chi sono i 100 più illuminati di Roma) senza ribilanciare per area.
  • estimation_method distingue dasymetric da uniform da no_ntl. Da leggere sempre prima di usare ntl_parcel a scala fine.

Cosa farci

Tre usi che abbiamo già visto chiedere dai primi utenti dopo l'esposizione:

  • OSINT immobiliare: identificare ville o capannoni industriali isolati ma intensamente illuminati in aree altrimenti scure (campagna, lottizzazioni periferiche). ntl_density filtra immediatamente outlier.
  • Sprawl urbano: incrociare ntl_class con land_cover CORINE produce mappature di "urbanizzazione luminosa" che non coincidono con i poligoni amministrativi. È utile per la PA tecnica e per chi studia consumo di suolo.
  • Proxy economico micro-scala: il dato VIIRS è il proxy economico più solido in letteratura per regioni dove i dati ISTAT non scendono a granularità adeguata. Incrociato con il blocco economics (redditi MEF a livello comunale), produce mappe di disparità intra-comunali interessanti - soprattutto per i grandi comuni sezionati come Roma.

Limiti che restano

Niente di nuovo, ma vale ripeterli:

  • Risoluzione nativa 463 m: sotto i 200 m la disaggregazione dasymetric è informativa solo se la particella ha un edificio OSM mappato. Se cerchi luce a scala di singolo balcone, VIIRS è il sensore sbagliato (serve un dato urbano con scanner aerei, fuori budget per coperture nazionali continue).
  • Anno 2023 fisso: VNP46A4 Collection 2 esce in composito annuale, quindi non c'è stagionalità (luce di Natale, ritmi turistici). Per dinamiche infra-annuali si guarda VNP46A1 (daily), che però richiede pipeline diversa.
  • Footprint OSM è una proxy della residenzialità: in aree industriali grandi capannoni "rubano" radianza in pesatura. È coerente con quello che VIIRS vede (un capannone illuminato di notte è una sorgente reale), ma chi cerca solo luminosità residenziale dovrebbe filtrare anche su buildings.residential_count.
  • Le sezioni libro tavolare (Bolzano e Trento) sono incluse nella tabella parcel_nightlights ma usano codici cadastali atipici. Sono nel conteggio delle 85 M, non in molte delle aggregazioni "per comune" che facciamo qui.

VIIRS particella per particella sembrava una cosa che doveva esistere. Adesso esiste. Il prossimo step è VNP46A1 daily per le serie temporali - ma serve a quel punto un budget di storage diverso, e una conversazione sul come distribuirlo come dataset scaricabile e non solo come API. Ne riparliamo.


Il blocco nightlights è esposto dall'API REST gratuita di Zornade per tutte le 85 M particelle catastali italiane. Per richieste sul metodo, sulla classificazione o sui casi limite trovati sul campo: scrivici.

Hai bisogno di un backend personalizzato sopra le nostre API?

Progettiamo e sviluppiamo integrazioni backend su misura: da semplici wrapper fino a piattaforme enterprise complete con dati catastali, GIS e visure.

Richiedi un preventivo gratuito