Trasformare un intero Paese in voxel: una pipeline di geodati
Come una pipeline voxel ha trasformato i geodati aperti svizzeri in un mondo Minecraft 1:1: tile, livelli di dettaglio e streaming di dati spaziali.

Da qualche parte nel portale open data del governo svizzero c'è una heightmap del versante nord dell'Eiger campionata così finemente che quasi si sente la roccia. Uno sviluppatore ha dato in pasto file come questo a una pipeline voxel e ha rilasciato il risultato come prodotto giocabile: l'intera Svizzera come mondo Minecraft 1:1, dove ogni blocco è un metro e il Cervino è esattamente alto e ripido quanto quello vero. Il download pesa 24 GB compressi, e la regione di prova gratuita copre da sola circa 2.400 km². L'ingegneria sotto il cofano — tiling, livelli di dettaglio, generazione pigra — è una lezione magistrale su come muovere dataset spaziali enormi senza che tutto vada a fuoco.
Il problema: un Paese in voxel non entra in memoria
Facciamo due conti. La Svizzera copre 41.285 km². A un blocco per metro quadro, sono 41,3 miliardi di colonne di superficie prima ancora di scavare un solo buco. Dai a ogni colonna una profondità modesta di 100 blocchi — roccia, terra, fondale lacustre — e arrivi a quattro trilioni di blocchi. Anche con un byte per blocco, parliamo di quattro terabyte di geometria grezza. Eppure il mondo distribuito si comprime in un download da 24 GB, e questo ti dice qualcosa di importante: quasi nulla di quella geometria è memorizzato come geometria. È memorizzato come ricetta.
Anche l'asse verticale fa saltare tutto. Minecraft vanilla limita il mondo a 384 blocchi di altezza di costruzione. La Svizzera va dai 193 m sul livello del mare del Lago Maggiore ai 4.634 m della Punta Dufour: un'escursione di 4.441 m, più di undici volte il limite vanilla, prima ancora di scavare una miniera. Serve quindi Cubic Chunks, una mod che sostituisce l'archiviazione a colonne di Minecraft con cubi 16×16×16 impilati quanto necessario. Questa mod gira in modo stabile solo su Minecraft Java 1.12.2, ed è il motivo per cui un progetto rilasciato oggi fissa una versione del gioco di anni fa.
La memoria è il terzo muro. Costruire blocchi dai dati sorgente la prima volta che un giocatore visita un'area è molto esigente in termini di calcolo: il progetto richiede almeno 16 GB di RAM ed è testato su macchine come un Ryzen 7 7800X3D con 32 GB. Chiunque abbia combattuto con i budget di streaming nei giochi o nel GIS riconoscerà questa struttura. È la stessa logica di triage che applichi quando la tua GPU esaurisce la VRAM: non puoi tenere tutto, quindi diventi molto bravo a decidere cosa tenere adesso.
Primo tentativo fallito: cuocere tutto il mondo in anticipo
L'approccio ovvio è un grande job offline: leggere i geodati, emettere i file di regione di Minecraft — il formato Anvil memorizza il mondo in regioni da 512×512 blocchi — comprimere il risultato e distribuirlo. La Danimarca fece qualcosa di simile nel 2014, quando l'agenzia danese per i geodati rilasciò l'intero Paese come mappa di Minecraft. Fu una dimostrazione di open data memorabile e provò che una mappa grande quanto un Paese era possibile. Allora perché non farlo così?
Perché la pre-cottura ha costi strutturali che crescono con l'ambizione. Ogni blocco di ogni regione va generato, scritto e compresso prima che qualcuno giochi, e questo trasforma ogni aggiornamento dei dati in una ricostruzione completa più una nuova distribuzione di decine di gigabyte. Ogni giocatore scarica montagne di terreno che non visiterà mai, e la maggior parte dei 41.000 km² non sarà visitata da nessuno. Peggio ancora, un mondo pre-generato si congela allo snapshot dei dati nel momento in cui lo pubblichi. È un artefatto write-once. Non può migliorare senza rigenerare e ridistribuire tutto, e i tuoi utenti riscaricano il pianeta.
Secondo tentativo fallito: un'unica heightmap a una sola risoluzione
La seconda tentazione è la normalizzazione: convertire ogni input in un unico raster globale a una sola risoluzione, così la pipeline ha esattamente un percorso di codice. Dentro la Svizzera c'è swissALTI3D, un modello del terreno ad alta risoluzione. Oltre il confine c'è il DEM Copernicus GLO-30, un punto di quota ogni 30 metri. Ricampiona tutto a 30 m per uniformità e il versante nord dell'Eiger diventa un mucchio di sabbia a gradini. Ricampiona tutto alla risoluzione più fine disponibile e storage ed elaborazione esplodono, mentre le regioni di confine non contengono comunque dati reali: hai appena sovracampionato la tua ignoranza.
L'eterogeneità colpisce la semantica tanto quanto l'altitudine. swissBUILDINGS3D copre la Svizzera, quindi il generatore può innalzare edifici voxel semplificati su impronte reali, ma solo dentro il Paese. Attraversi il confine vicino a Ginevra e non esiste alcuno strato di edifici, quindi la pipeline applica l'unica soluzione sensata: pianta alberi dove dovrebbero esserci case. L'acqua ha una sorgente dedicata (swissBATHY3D per i fondali lacustri), così come ghiacciai, foreste e vigneti. Non esiste un unico file di input. Nei geodati, non esiste mai.
La lezione vale ben oltre Minecraft: la risoluzione è un metadato per tile, non una costante globale. Una pipeline che assume input uniformi finirà per sprecare fedeltà o inventarla, e la fedeltà inventata è peggio di una grossolanità onesta, perché da dentro nessuno riesce a distinguerle.

Cosa funziona davvero: una pipeline a tile che genera in modo pigro
Il progetto svizzero funziona perché capovolge l'istinto di cuocere tutto. Non scarichi un mondo finito; scarichi un pacchetto di mondo — geodati preelaborati più un generatore personalizzato — e il gioco costruisce i blocchi la prima volta che visiti davvero un luogo. Una prima visita a una nuova area richiede qualche minuto di elaborazione; dopodiché diventa chunk in cache come qualsiasi altro mondo di Minecraft. Il calcolo si paga per visita invece che in anticipo, e non generi mai terreno che nessuno calpesterà. Il tile è l'unità di tutto: archiviazione, cache, generazione e gestione degli errori.
Il tiling è ancorato a LV95, il sistema di coordinate ufficiale di rilevamento della Svizzera. Ogni tile registra quali dataset lo coprono e con quale risoluzione, e convertire le coordinate di rilevamento in coordinate di blocco è una semplice trasformazione affine. Il progetto pubblica persino la formula, così puoi prendere le coordinate dal visualizzatore cartografico nazionale e teletrasportarti nel punto corrispondente in gioco:
def lv95_to_block(east: float, north: float, height: float) -> tuple[int, int, int]:
"""Convert Swiss LV95 survey coordinates to Minecraft block coordinates."""
x = int(east - 2_480_000) # strip the LV95 easting offset
z = int(1_300_000 - north) # Minecraft's z axis grows southward
y = int(height) # one block = one meter above sea level
return x, y, z
# The summit of the Jungfrau, 4,158 m:
print(lv95_to_block(2_640_188, 1_154_072, 4158))
# -> (160188, 4158, 145928)
# x and z match the in-game teleport command exactly; the game just
# drops you a few meters higher so you land on the summit, not in it.
Sopra la griglia a tile, la generazione è uno stack di layer valutato colonna per colonna. L'altezza di base viene da swissALTI3D. La copertura superficiale — acqua, foreste, strade, linee ferroviarie, dighe, barriere antivalanga — viene da swissTLM3D. I fondali lacustri vengono da swissBATHY3D, le altezze degli alberi da swissSURFACE3D, i contorni dei ghiacciai dagli inventari GLAMOS che risalgono al 1850, e lo spessore del ghiaccio da un dataset del ETH di Zurigo, così il ghiacciaio dell'Aletsch è davvero ghiaccio scolpito e non una texture bianca stesa sulla roccia. Prati, detriti e vigneti provengono dalla mappa federale degli habitat; persino gli alberi stradali di Zurigo vengono dal catasto arboreo della città. In tutto una quindicina di dataset aperti, tutti liberamente utilizzabili — swisstopo ha aperto i suoi dati, anche per uso commerciale, nel 2021.
Un mondo voxel non è un'immagine del terreno. È una cache di milioni di piccole decisioni che la tua pipeline ha preso, una per metro quadro, e la qualità del mondo è esattamente la qualità di quelle decisioni.
Il livello di dettaglio è un problema di dati, non un trucco di rendering
La distanza di rendering predefinita di Minecraft mostra qualche centinaio di metri. Gli screenshot del progetto mostrano il ghiacciaio dell'Aletsch che si curva per chilometri — quella vista lontana ("Fernsicht") è una rappresentazione separata a fedeltà ridotta che il gioco costruisce una sola volta al primo avvio. È il classico livello di dettaglio, ma la decisione importante è dove vive il LOD: viene calcolato dai dati sorgente in fase di ingestione, non approssimato dal renderer al volo.
Se hai costruito piramidi di tile cartografici, conosci il calcolo. Ogni livello di zoom dimezza la risoluzione su entrambi gli assi, quindi una piramide completa costa 1 + 1/4 + 1/16 + … ≈ 4/3 del livello base — un sovraccarico di archiviazione del 33% per un comportamento fluido a ogni scala. Il LOD del terreno voxel è la stessa piramide messa in piedi: il terreno lontano è il livello di zoom grossolano, quello vicino è il fine, e l'arte vera sta nello scegliere uno schema di chiavi che ti permetta di recuperare rapidamente la cella giusta. Ci siamo imbattuti negli stessi problemi in i compromessi tra geohash e indici spaziali veri e propri: la scelta della chiave decide il costo di ogni ricerca a valle.
La mia decisione preferita sul LOD qui non è affatto visiva. Il download gratuito è una fetta di 2.400 km² — la regione UNESCO Jungfrau-Aletsch: Eiger, Mönch, Jungfrau e il ghiacciaio più grande delle Alpi — che esegue esattamente la stessa pipeline del Paese intero a pagamento. È un rilascio canary trasformato in funzionalità di prodotto. Pesa 1,1 GB invece di 24, non richiede registrazione, e se gira sulla tua macchina, girerà anche la mappa completa. Se distribuisci prodotti con grandi quantità di dati, copia questa idea senza esitazione: il tuo livello gratuito dovrebbe essere una porzione rappresentativa del tuo terreno più difficile, non una demo castrata del tuo caso più semplice.

Streaming di tile spaziali nel browser
La stessa disciplina emerge nella pagina web senza pretese del progetto. La sua mappa di panoramica ti permette di trascinare un cursore per confrontare il mondo voxel con la vera fotografia aerea — e le immagini non arrivano affatto dai server del progetto. Il tuo browser scarica i tile SWISSIMAGE direttamente dal servizio di swisstopo, e solo quando sposti il cursore. Pigro, diretto dall'origine, amico della cache: il traffico pesante è servito da un'infrastruttura pubblica che esiste proprio per questo, e la bolletta di hosting del progetto resta vicina allo zero.
L'indirizzamento dei tile sul web è un problema risolto, e vale la pena conoscerlo a fondo se mai ti occupi di geospaziale:
import math
def latlon_to_tile(lat: float, lon: float, zoom: int) -> tuple[int, int]:
"""Standard slippy-map (XYZ) tile addressing used by OSM and most WMTS fronts."""
n = 2 ** zoom
x = int((lon + 180.0) / 360.0 * n)
lat_rad = math.radians(lat)
y = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
return x, y
# At zoom 15, any point on Earth lands in one of 1,073,741,824 tiles.
# Fetch the few that intersect the viewport. Skip the other billion.
Due dettagli contano più della formula. Primo, la richiesta viene differita finché l'intenzione dell'utente non è inequivocabile — il cursore si sposta davvero — il che è sia un'ottimizzazione della banda sia una questione di correttezza verso un servizio pubblico gratuito finanziato con denaro pubblico. Secondo, la provenienza viaggia insieme ai tile: la pagina cita SWISSIMAGE, swissBOUNDARIES3D e swissNAMES3D proprio sulla mappa. Quando il tuo prodotto è un'opera derivata da open data, l'attribuzione nel punto di visualizzazione non è decorazione. È la licenza che funziona come previsto.
Cosa rubare dalla pipeline svizzera
Prima le obiezioni, perché i professionisti ne hanno sollevate di valide. Gli sforzi fatti a mano come Build the Earth mettono al lavoro migliaia di volontari per modellare edifici reali, e nessuna pipeline automatica raggiunge quel livello di fedeltà — un'impronta voxelizzata di swissBUILDINGS3D è un'approssimazione grezza, e se ciò che ti interessa è l'architettura, un export solo del terreno è probabilmente l'artefatto più pulito. Giusto. Ma copertura e fedeltà sono in diretto compromesso: l'automazione ti dà 41.285 km² oggi, il lavoro manuale ti dà un bellissimo centro storico prima o poi. La mia posizione: per un prodotto basato sui dati, la generazione automatica con provenienza pubblicata vince, e i landmark costruiti a mano e curati possono essere sovrapposti dove contano.
E la provenienza è la parte che tutti saltano. Il progetto pubblica una lista di difetti noti: lacune vicino ai confini dove arriva solo la griglia Copernicus a 30 m, zone irregolari o piatte, ponti e strade sbagliati o mancanti, controlli di qualità fatti a campione e non metro per metro. Quella lista fa un lavoro concreto: trasforma le segnalazioni di bug del tipo "il mondo qui è sbagliato" in documentazione del tipo "sì, il dataset finisce lì". Ogni prodotto di dati derivati dovrebbe pubblicare la propria matrice di provenienza e la propria lista di errori noti. Quelli che non lo fanno non sono più accurati; sono solo meno onesti.
- Suddividi tutto in tile. Il tile è la tua unità di archiviazione, cache, generazione e gestione degli errori. I monoliti non degradano con grazia.
- Non sottocampionare mai in ingestione. Mantieni la risoluzione nativa per ogni sorgente e ricampiona al momento del rendering.
- Genera in modo pigro. Quando il mondo è più grande del tempo di gioco di chiunque, il calcolo per visita batte la pre-cottura.
- Costruisci la piramide LOD in ingestione. Metti in conto il sovraccarico del ~33% e compra una scalatura fluida a ogni distanza.
- Rilascia una fetta canary. Un pezzo gratuito e rappresentativo dei tuoi dati più difficili batte qualsiasi scheda tecnica.
- Pubblica provenienza e difetti noti. Fanno parte del prodotto, non sono una scusa per il prodotto.
L'intero Paese costa 15 CHF con tutte le versioni future incluse — e solo per i residenti svizzeri, per motivi legali, un vincolo curiosamente affascinante per un bene puramente digitale. Ma il vero prodotto non è la mappa. È la dimostrazione che una singola persona con dati pubblici, una pipeline a tile e una documentazione onesta può rilasciare più di quanto faccia l'infrastruttura geospaziale di gran parte dei team. Il tuo dataset probabilmente non misura 41.285 km². Anche le tue scuse sono più piccole.
