Esperimento 2
Isola e Porta Nuova, 1954 → 2024
Lo stesso metodo del Comune, applicato a un quartiere: dieci voli aerei e dieci edizioni DUSAF su un riquadro di 1,9 × 2,3 km. L'area di studio sono due NIL, Isola e Porta Garibaldi - Porta Nuova: il secondo è incluso perché la trasformazione più grande sta lì.
Caricamento dei dati…
Che cosa c'è sul suolo, edizione per edizione
Ettari per tipo d'uso DUSAF nell'area di studio. Il punto vuoto del 1980 è l'edizione a 1:50.000, poco precisa.
Che cosa è diventato cosa
I passaggi più grandi fra tipi d'uso, in ettari: superfici che nel primo anno avevano un uso e nel 2024 un altro.
I due quartieri
Esperimento 1
Comune di Milano, 1954 → 2024
Dove e quando la città è diventata costruita, misurato su dieci edizioni della carta di uso del suolo DUSAF di Regione Lombardia e guardato su dieci voli aerei.
Caricamento dei dati…
Il suolo del Comune, edizione per edizione
Ettari per grande classe DUSAF, dentro i confini comunali. Il punto vuoto del 1980 è l'edizione a 1:50.000: il suo costruito è sovrastimato.
1954 → 1999: dove
I dieci quartieri (NIL) con più nuovo costruito stabile.
Dopo il 1999: cosa
I dieci quartieri con più nuovo costruito, per tipo di uso nel 2024.
I nove Municipi
Quota di superficie costruita nel 1954 e nel 2024, nuovo costruito stabile per periodo e aree costruite tornate verdi.
Metodologia
Fonti, calcoli, verifiche
Come sono stati trovati i dati, come sono stati calcolati i numeri, quali controlli li sostengono e come rifare tutto da zero.
Domanda
Dove si è costruito di più nel Comune di Milano dal primo volo aereo disponibile a oggi, e quando? Le foto aeree mostrano le trasformazioni ma non le misurano; per misurarle serve una carta che classifichi ogni pezzo di suolo, rifatta più volte con criteri confrontabili. In Lombardia è il DUSAF (Destinazione d'Uso dei Suoli Agricoli e Forestali) di Regione Lombardia ed ERSAF.
Una serie ogni cinque anni non esiste: le edizioni sono del 1954, 1980, 1999, 2007, 2009, 2012, 2015, 2018, 2021 e 2024. I periodi seguono le edizioni, e dove serve confrontarli si usa il ritmo in ettari l'anno.
Fonti
Tutte le schede sono state trovate nel RNDT con openrndt e lette per intero (titolo, abstract, lineage, scala, vincoli d'uso). I dati sono stati scaricati dai servizi indicati nelle schede.
Uso del suolo DUSAF (Regione Lombardia)
| Edizione | Scheda RNDT | Scala | Come è stata prodotta (dalla scheda) |
|---|---|---|---|
| 1954 | r_lombar:14934f49-2ada-44b6-a069-0a72e76865b3 | 1:10.000 | Fotointerpretazione del volo GAI 1954, con legenda coerente con DUSAF 1.1–3.0 |
| 1980 | r_lombar:8929a37b-ed6d-4c5a-af26-86b83aea52fc | 1:50.000 | Digitalizzazione di carte tematiche 1:50.000 dal volo TEM1 (1980–82); poligoni non più piccoli di 4 ha |
| 1999 | r_lombar:827294eb-110b-4fb7-8cbc-6776dc8c2953 | 1:10.000 | DUSAF 1.1, da ortofoto IT2000 |
| 2007 | r_lombar:884bcd97-0bc8-4c1a-8e36-ac52ec6bb9a3 | 1:10.000 | DUSAF 2.1 |
| 2009 | r_lombar:8885f244-7dba-43c0-9cc8-708a5b5059a6 | 1:10.000 | DUSAF 3.0 |
| 2012 | r_lombar:3545c5b7-c808-47d5-be66-6a6d3b656009 | 1:10.000 | DUSAF 4.0 |
| 2015 | r_lombar:cbc7ef8a-2012-4463-a197-7ffd04760bbb | 1:10.000 | DUSAF 5.0 |
| 2018 | r_lombar:3850b793-c13f-45ee-8bf8-31c020fdbe0e | 1:10.000 | DUSAF 6.0 |
| 2021 | r_lombar:7cd05e9f-b693-4d7e-a8de-71b40b45f54e | 1:10.000 | DUSAF 7.0 |
| 2024 | r_lombar:b4bf7c32-ebbf-4ea6-a8a4-50c5e77c2e82 | 1:10.000 | DUSAF 8.0, da ortofoto AGEA 2024 a 20 cm; superficie minima 1.600 m² |
Licenza: CC BY 4.0 per tutte le edizioni, dichiarata nel campo «altri vincoli» della scheda (apiso_OtherConstraints_s). openrndt riporta per queste schede license: null, perché legge solo isOpendata.
Ortofoto (Regione Lombardia)
Voli 1954, 1975, 1998, 2003, 2007, 2012, 2015, 2018–19, 2021, 2024, letti dai servizi ArcGIS ImageServer (MapServer per il 1954) indicati nelle schede RNDT. Gli identificativi sono in scripts/03_ortofoto_citta.py. La licenza CC BY 4.0 è stata controllata sulla scheda del 1975.
Confini
Municipi (ds379) e Nuclei d'Identità Locale vigenti, PGT 2030 (ds964), dal portale open data del Comune di Milano. Non sono nel RNDT: sono stati cercati sul portale CKAN del Comune.
Passaggi
- Trovare i dati.
openrndt search --q '"uso e copertura del suolo"' --org "regione lombardia"elenca le edizioni DUSAF;openrndt get <id>dà per ognuna il servizio MapServer e la scheda completa. - Scaricare.
01_scarica_dusaf.pyinterroga ogni MapServer sul riquadro del Comune: prima gli identificativi dei poligoni, poi le geometrie in blocchi da 300, in UTM 32N (EPSG:32632). I nomi dei campi cambiano fra le edizioni (CODICE,COD5,LIV_1…5,LIV1…5, codice in testa aDESCR): lo script li riconduce tutti al codice DUSAF. - Rasterizzare.
02_analisi.pydisegna ogni edizione su una griglia di ( celle) con il codice di secondo livello. I poligoni si disegnano dal più grande al più piccolo e senza buchi: il DUSAF copre il territorio senza sovrapposizioni, quindi i buchi sono riempiti dai poligoni più piccoli disegnati dopo. - Definire il costruito. Classi 11 (zone urbanizzate: tessuto residenziale, cascine) e 12 (insediamenti produttivi, commerciali, servizi, impianti tecnologici, reti stradali e ferroviarie). Restano fuori 13 (cave, discariche, cantieri: suolo in trasformazione, non ancora costruito) e 14 (verde urbano, aree sportive).
- Assegnare l'epoca. Per ogni cella costruita nel 2024: la prima edizione da cui risulta costruita in tutte le successive, con al massimo un'eccezione. La tolleranza assorbe le oscillazioni di classificazione fra edizioni (una cella che passa da 12 a 14 e torna 12). Esempio: costruita nel 1999, 2007, non nel 2009, poi sempre → epoca 1954–1999.
- Aree tornate verdi. Celle costruite in almeno due edizioni confrontabili e nel 2024 verde urbano, agricolo o bosco.
- Ripartire per zona. Municipi e NIL vengono rasterizzati sulla stessa griglia; ogni cella conta 100 m².
- Tipo del nuovo costruito. Per le celle costruite dopo il 1999 si legge il codice DUSAF 2024 completo: residenziale (111x, 112x), produttivo e commerciale (1211x), servizi e impianti (1212x: ospedali, impianti tecnologici, cimiteri, aree militari…), strade (1221), ferrovie (1222).
- Verificare.
04_verifiche.pyrifà i calcoli in modo indipendente e prova regole alternative (sezione Verifiche). - Foto aeree.
03_ortofoto_citta.pychiede a ogni servizio un'immagine dello stesso riquadro a 7,5 m per pixel (in due metà, per i limiti di dimensione dei servizi) e rende trasparente l'esterno del Comune.
Il problema del 1980
L'edizione 1980 è disegnata a 1:50.000 con poligoni di almeno 4 ha, le altre a 1:10.000. Dentro il Comune la differenza si vede nella grana:
Un poligono di 16 ha classificato «tessuto residenziale» ingloba i campi, i cortili e i giardini più piccoli di 4 ha che contiene. Il costruito 1980 risulta quindi sovrastimato: è più alto di quello del 1999, cosa che non succede nella realtà. Per questo i numeri principali confrontano solo le edizioni a 1:10.000 (1954 → 1999 → … → 2024). Nella mappa il 1980 si può attivare come tappa, sapendo che la quota 1954–1980 è un massimo e quella 1980–1999 un minimo.
Verifiche
1. Superficie del Comune
2. Ricalcolo sui poligoni originali
Il costruito di ogni edizione ricalcolato con le geometrie vettoriali (intersezione con il confine comunale, senza raster). I numeri principali usano il vettore, le ripartizioni spaziali il raster.
3. Saldo fra edizioni confrontabili
Celle diventate costruite (guadagni), non più costruite (perdite) e saldo, sulla griglia di . Dopo il 1999 guadagni e perdite sono dello stesso ordine: la città si trasforma, ma il totale cambia poco.
4. Sensibilità alla regola dell'epoca
Ettari di costruito 2024 assegnati a ciascuna edizione con tre regole: quella usata (stabile, tolleranza di un'eccezione), «prima comparsa» (la prima edizione in cui la cella è costruita) e stabile senza il 1980.
5. Classifiche dei quartieri
1954 → 1999 (senza il 1980)
1954 → 1980 (con il 1980, per controllo)
6. Che cosa c'è nel nuovo costruito dopo il 1999
Per i cinque quartieri in cima, il codice DUSAF 2024 delle celle nuove e la classe che avevano nel 1999. Serve a distinguere edificazione vera da cambi di classificazione.
La frase iniziale, verificata
La prima sintesi era: «tra il 1954 e il 1980 sono stati costruiti 2.313 ha (circa 89 ha/anno), concentrati a Gallaratese, Forlanini, Niguarda e Quarto Oggiaro, con un calo netto del ritmo dopo il 1980 (zone più attive: Cascina Merlata, Parco delle Abbazie, Cimiano, Bosco in Città); il Municipio 1 era già edificato per l'88% nel 1954». Controllata parte per parte:
La versione corretta è quella in testa all'Esperimento 1.
Dai poligoni alla mappa: estrarre e rendere i dati
Lo stesso dato si può portare sulla pagina in modi diversi, e la scelta cambia sia la precisione dei numeri sia quello che si vede zoomando. Qui sotto le strade possibili, quella seguita e come cambiarla.
Che cosa arriva dal servizio
I MapServer DUSAF indicati nelle schede RNDT restituiscono poligoni vettoriali: anelli di coordinate in UTM 32N, con il codice di uso del suolo. È la forma più precisa possibile, ma una mappa delle epoche non è un singolo strato: per ogni punto bisogna incrociare dieci edizioni e trovare quella da cui il punto resta costruito.
Tre strade
| Strada | Come funziona | Pro | Contro |
|---|---|---|---|
| Griglia (usata qui) | Ogni edizione viene disegnata su una griglia di celle quadrate; l'incrocio fra edizioni diventa un confronto cella per cella. Il risultato è un'immagine indice (un valore per cella) che la pagina colora nel browser. | Calcolo semplice e veloce, regole flessibili (la tolleranza di un'eccezione è una riga di codice), legenda e tema chiaro/scuro gestiti dal browser. | La precisione dipende dalla dimensione della cella: celle grandi danno bordi a scalini e perdono le strade sottili. |
| Sovrapposizione vettoriale | Intersezioni e differenze fra i poligoni delle dieci edizioni (per esempio con shapely), fino a ottenere un poligono per ogni epoca. | Bordi esatti a qualunque zoom, nessun errore di discretizzazione. | Calcolo molto più pesante su migliaia di poligoni per edizione; la regola di stabilità con tolleranza è complicata da scrivere; file più grandi da disegnare nel browser. |
| Immagini dal servizio | Chiedere al MapServer un'immagine già disegnata di ogni edizione (export o WMS). | Nessun calcolo, resa curata dall'ente. | Solo da vedere: niente epoche, niente numeri. In più i WMS regionali non offrono la proiezione EPSG:3857 delle mappe web. |
La dimensione della cella, misurata
La prima versione usava celle da 10 m per il Comune e da 2 m per Isola. Zoomando si vedevano i blocchi delle celle, resi più evidenti dal fatto che la pagina le disegnava con bordi a scalini (image-rendering: pixelated). Il confronto con le griglie attuali:
| Griglia | Celle | Immagine indice | Scarto dal vettore | Una cella a zoom 6× |
|---|---|---|---|---|
| Comune, 10 m (prima versione) | 1.890 × 1.695 | 143 KB | da −1,5% a +0,5% | 2,4 px |
| Comune, 5 m | 3.780 × 3.390 | 319 KB | — | 1,2 px |
| Isola, 2 m (prima versione) | 935 × 1.165 | — | — | 3,5 px |
| Isola, 1 m | 1.870 × 2.330 | 38 KB | — | 1,8 px |
Ultima colonna: lato a schermo di una cella con lo zoom a 6×, misurato su una finestra di 1.440 × 900 px (mappa del Comune larga 763 px, di Isola 549 px). Indicativamente, da circa 2 px in su i blocchi si notano; su schermi ad alta densità i pixel fisici sono il doppio.
Perché non scendere ancora? Una griglia di 2,5 m sul Comune avrebbe 7.560 × 6.780 celle, cioè 51 milioni di pixel: oltre il limite di circa 16,7 milioni di pixel che Safari su iPhone accetta per un canvas. A 5 m (12,8 milioni) la mappa funziona anche lì. L'analisi a 5 m (02_analisi.py) richiede 51 secondi e 1,1 GB di memoria sul computer usato per questo lavoro.
Come la pagina la disegna
- L'immagine indice è un PNG in scala di grigi: 0 = vuoto, 1…n = periodo, 255 = costruito oggi verde. Il browser la legge e colora ogni cella con i colori del tema in uso, quindi accendere o spegnere un periodo o passare al tema scuro non richiede nuove immagini.
- Il canvas viene ingrandito con interpolazione, non a blocchi: ai bordi i colori sfumano invece di fare scalini.
- Confini dei quartieri ed etichette sono vettoriali (SVG) e il loro spessore viene diviso per il fattore di zoom, così restano sottili e leggibili a qualunque ingrandimento.
Come cambiarla
# risoluzione del Comune: scripts/griglia.py RES = 5 # metri; W e H si ricalcolano da soli # risoluzione di Isola: scripts/05_isola.py RES = 1.0 # poi si rifanno calcoli e verifiche (le foto non si riscaricano) uv run $DEPS python scripts/02_analisi.py uv run $DEPS python scripts/04_verifiche.py uv run $DEPS python scripts/05_isola.py
Per la strada vettoriale il punto di partenza è lo stesso dato scaricato (data/raw/dusaf_<anno>.json): si uniscono i poligoni costruiti di ogni edizione e si calcolano le differenze in ordine di tempo, per esempio «costruito nel 1999 e nel 2024, ma non nel 1954». Senza tolleranza il risultato è vicino alla regola «prima comparsa» della sezione Verifiche, non a quella usata nelle pagine.
Limiti
- Costruito non vuol dire edifici. La classe 12 comprende strade, ferrovie e impianti; il DUSAF misura l'uso del suolo, non la superficie coperta da edifici né i volumi. Una densificazione (case basse sostituite da torri) non cambia la classe e non compare.
- Cambi di classificazione. Parte del «nuovo costruito» è riclassificazione: per esempio a Forze Armate l'ex Piazza d'Armi entra come «aree militari obliterate», ma era già classe 12 nel 1999. La regola di stabilità ne assorbe una parte, non tutta.
- Periodi di lunghezza diversa. 45 anni fra 1954 e 1999, 2–8 anni dopo: si confrontano i ritmi (ha l'anno), non i totali.
- Il 1954 parte da un volo fotointerpretato a posteriori: la legenda è allineata al DUSAF, ma la qualità delle foto in bianco e nero è inferiore.
- Griglia di calcolo. Le edizioni sono convertite in celle di (1 m per Isola): le strade più sottili si perdono in parte. Lo scarto dal vettore è nella sezione Verifiche.
- Confini attuali. Municipi e NIL sono quelli di oggi, applicati a tutte le epoche.
- Ortofoto. Ricampionate a 7,5 m per pixel: adatte a vedere la città intera, non i singoli edifici. Il volo 1975 ha zone non coperte.
Riprodurre
Serve uv e una connessione internet; nessuna installazione di GDAL. Dalla cartella del caso d'uso:
cd casiduso/milano-evoluzione DEPS="--no-project --with shapely,pyproj,numpy,pillow,httpx" # confini dal portale open data del Comune curl -o data/raw/municipi.geojson "https://dati.comune.milano.it/dataset/36ba21c2-8b48-43ce-bbe1-e236a8a49ff6/resource/99ecd085-0b04-4fb2-a66e-9795694d4fc4/download/ds379_municipi_label.geojson" curl -o data/raw/nil.geojson "https://dati.comune.milano.it/dataset/e8e765fc-d882-40b8-95d8-16ff3d39eb7c/resource/9c4e0776-56fc-4f3d-8a90-f4992a3be426/download/ds964_nil_wm.geojson" uv run $DEPS python scripts/01_scarica_dusaf.py # ~2 min, data/raw/dusaf_*.json uv run $DEPS python scripts/02_analisi.py # ~30 s, epoche e statistiche uv run $DEPS python scripts/03_ortofoto_citta.py # ~3 min, site/img/citta_*.webp uv run $DEPS python scripts/04_verifiche.py # ~2 min, data/derived/verifiche.json uv run $DEPS python scripts/05_isola.py # ~3 min, Esperimento 2 (isola.json, isola_*.webp) cd site && python3 -m http.server 8000 # poi http://localhost:8000
Struttura: data/raw/ (dati scaricati), data/derived/ (statistiche e verifiche), scripts/, site/ (questa pagina con immagini e JSON). Il README.md della cartella ripete tutto questo per un agente AI.
Tutti i numeri delle pagine sono letti da stats.json, verifiche.json e isola.json: nessuna cifra è scritta a mano nel testo.
Esperimento 2: Isola e Porta Nuova
Stesso metodo del Comune (05_isola.py), con tre differenze.
- Area di studio. I NIL 11 «Isola» e 9 «Porta Garibaldi - Porta Nuova», più 150 m di margine per il riquadro (UTM 514000–515870 E, 5036080–5038410 N). Il NIL Isola da solo non comprende Porta Nuova, dove avviene la trasformazione più visibile nelle foto.
- Griglia di invece di , e ortofoto a 0,6 m per pixel, chieste a ogni servizio sullo stesso riquadro.
- Cambio d'uso. In un'area già costruita nel 1954 la domanda utile non è quanto si è costruito ma che cosa è diventato cosa. Ogni cella riceve un tipo d'uso dal codice DUSAF completo (residenziale 111x–112x, produttivo 1211x, servizi e impianti 1212x, strade 1221, ferrovie 1222, cantieri 13x, verde urbano 14x, agricolo 2x) e si contano i passaggi fra due anni.
Cautela sul 1954 → 2024. Le edizioni recenti separano dentro gli isolati scuole, servizi e cortili che il 1954 classifica come tessuto residenziale: parte dei passaggi «residenziale → servizi e impianti» è maggiore dettaglio, non cambio reale. Il confronto 1999 → 2024, fra edizioni prodotte con lo stesso metodo, è più affidabile.
Verifica. Costruito nell'area di studio sui poligoni originali e sulla griglia di :
I punti di riferimento vengono da Nominatim (OpenStreetMap), convertiti in UTM e controllati a vista sull'ortofoto 2024. Il volo 1975 ha un'area non coperta a nord-ovest.