Artikel mendalam tentang teknologi yang membentuk masa depan.

Mengubah Satu Negara Jadi Voxel: Pipeline Geodata Swiss

Cara pipeline voxel mengubah geodata terbuka Swiss jadi dunia Minecraft 1:1, dengan pelajaran soal tile, level of detail, dan streaming data spasial.

Lembah alpine bergaya voxel dengan gletser berbalok kotak dan puncak gunung kubik bertingkat.
Satu blok, satu meter: seluruh negara dibangun ulang sebagai voxel dari geodata pemerintah yang terbuka.

Di portal data terbuka pemerintah Swiss ada heightmap lereng utara Eiger yang sampelnya begitu rapat sampai batuannya terasa nyata. Seorang developer memasukkan file semacam itu ke pipeline voxel dan merilisnya sebagai produk yang bisa dimainkan: seluruh Swiss sebagai dunia Minecraft 1:1, di mana setiap blok adalah satu meter dan Matterhorn berdiri setinggi dan securam aslinya. Unduhannya 24 GB terkompresi, dan area sampel gratisnya saja mencakup sekitar 2.400 km². Engineering di baliknya — tiling, level of detail, generasi lazy — adalah contoh bagus cara memindahkan dataset spasial raksasa tanpa sistemnya ambruk.

Masalahnya: Negara Berbentuk Voxel Tidak Muat di Memori

Hitung dulu, yuk. Swiss luasnya 41.285 km². Dengan satu blok per meter persegi, itu 41,3 miliar kolom permukaan bahkan sebelum kamu menggali satu lubang pun. Beri tiap kolom kedalaman 100 blok yang wajar — batu, tanah, dasar danau — dan totalnya empat triliun blok. Bahkan dengan satu byte per blok, itu empat terabyte geometri mentah. Padahal dunia yang dirilis hanya 24 GB terkompresi, dan ini menunjukkan sesuatu yang penting: hampir tidak ada geometri itu yang disimpan sebagai geometri. Yang disimpan adalah resepnya.

Sumbu vertikal juga bikin masalah. Minecraft vanilla membatasi tinggi bangunan 384 blok. Swiss membentang dari 193 m di atas permukaan laut di Lago Maggiore sampai 4.634 m di Dufourspitze — rentang 4.441 m, lebih dari sebelas kali batas vanilla, bahkan sebelum ada yang menggali tambang. Jadi dunia ini butuh Cubic Chunks, mod yang mengganti penyimpanan berbasis kolom Minecraft dengan kubus 16×16×16 yang ditumpuk setinggi yang dibutuhkan. Mod itu hanya stabil di Minecraft Java 1.12.2, makanya proyek yang dirilis sekarang masih mengunci versi game dari beberapa tahun lalu.

Memori adalah dinding ketiga. Membangun blok dari data sumber saat pertama kali pemain mengunjungi suatu area itu berat secara komputasi: proyek ini meminta RAM minimal 16 GB dan diuji di mesin seperti Ryzen 7 7800X3D dengan 32 GB. Siapa pun yang pernah bergelut dengan anggaran streaming di game atau GIS pasti mengenali pola ini. Triage yang sama seperti saat GPU kehabisan VRAM — kamu tidak bisa menampung semuanya, jadi kamu jadi sangat ahli memutuskan apa yang ditampung sekarang.

Percobaan Gagal Pertama: Bake Seluruh Dunia di Awal

Pendekatan yang paling jelas adalah satu job offline besar: baca geodata, hasilkan file region Minecraft — format Anvil menyimpan dunia dalam region 512×512 blok — zip hasilnya, lalu rilis. Denmark terkenal pernah melakukan hal serupa pada 2014, ketika Danish Geodata Agency merilis seluruh negaranya sebagai peta Minecraft. Itu demo open data yang monumental dan membuktikan peta seukuran negara itu mungkin. Jadi kenapa tidak pakai cara itu?

Karena pre-baking punya biaya struktural yang naik seiring ambisi. Setiap blok di setiap region harus dibuat, ditulis, dan dikompresi sebelum ada yang main, sehingga setiap pembaruan data berarti rebuild penuh plus rilis ulang puluhan gigabyte. Setiap pemain harus mengunduh gunung-gunung terrain yang tidak akan pernah mereka kunjungi — dan sebagian besar dari 41.000 km² itu tidak akan pernah dikunjungi siapa pun. Yang paling parah, dunia yang di-bake membeku pada snapshot datanya begitu dipublikasikan. Ini artefak tulis-sekali. Ia tidak bisa membaik kecuali kamu meregenerasi dan mendistribusikan ulang semuanya, dan pengguna harus mengunduh ulang seluruh planet.

Percobaan Gagal Kedua: Satu Heightmap dengan Satu Resolusi

Godaan kedua adalah normalisasi: ubah setiap input jadi satu raster global dengan satu resolusi, supaya pipeline cuma punya satu jalur kode. Di dalam Swiss ada swissALTI3D, model terrain resolusi tinggi. Di luar perbatasan ada Copernicus GLO-30 DEM — satu titik elevasi tiap 30 meter. Kalau semuanya di-resample turun ke 30 m demi keseragaman, lereng utara Eiger berubah jadi tumpukan pasir bertangga. Kalau semuanya di-resample naik ke resolusi terbaik, storage dan pemrosesan meledak, sementara wilayah perbatasan tetap tidak punya data nyata — kamu cuma menaikkan skala ketidaktahuanmu.

Heterogenitas juga menghantam semantik sama kerasnya dengan elevasi. swissBUILDINGS3D mencakup Swiss, jadi generator bisa membangun bangunan voxel sederhana di atas footprint asli — tapi hanya di dalam negeri. Melintas perbatasan dekat Jenewa, tidak ada lapisan bangunan sama sekali, jadi pipeline melakukan fallback yang masuk akal: menanam pohon di tempat rumah seharusnya berdiri. Air butuh sumber sendiri (swissBATHY3D untuk dasar danau), begitu juga gletser, hutan, dan kebun anggur. Tidak ada satu file input tunggal. Di geodata, memang tidak pernah ada.

Pelajaran ini berlaku jauh melampaui Minecraft: resolusi adalah metadata per tile, bukan konstanta global. Pipeline yang mengasumsikan input seragam akan membuang-buang fidelitas atau mengarangnya — dan fidelitas yang dikarang lebih buruk daripada kekasaran yang jujur, karena dari dalam tidak ada yang bisa membedakannya.

Kisi tile peta yang mengalir melalui corong dan muncul sebagai lanskap voxel yang terbentuk.
Inversi intinya: simpan data sebagai tile dan resep, rakit blok hanya di tempat seseorang benar-benar datang.

Yang Benar-Benar Berhasil: Pipeline Berbasis Tile yang Generate Secara Lazy

Proyek Swiss berhasil karena membalik naluri bake-semuanya. Kamu tidak mengunduh dunia yang sudah jadi; kamu mengunduh world package — geodata yang sudah diproses plus generator khusus — dan game membangun blok saat kamu pertama kali benar-benar mengunjungi suatu tempat. Kunjungan pertama ke area baru butuh beberapa menit kerja; setelah itu jadi chunk tercache seperti dunia Minecraft biasa. Komputasi dibayar per kunjungan, bukan di muka, dan kamu tidak pernah men-generate terrain yang tidak pernah diinjak siapa pun. Tile adalah unit untuk segalanya: penyimpanan, caching, generasi, dan kegagalan.

Tiling dikaitkan dengan LV95, sistem koordinat survei resmi Swiss. Setiap tile mencatat dataset mana yang menutupinya dan pada resolusi berapa, dan mengonversi koordinat survei ke koordinat blok adalah transformasi affine murni. Proyek ini bahkan mempublikasikan rumusnya supaya kamu bisa mengambil koordinat dari peta nasional dan teleport ke titik yang sesuai di dalam game:

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.

Di atas grid tile, generasi adalah tumpukan lapisan yang dievaluasi per kolom. Ketinggian dasar berasal dari swissALTI3D. Penutup permukaan — air, hutan, jalan, jalur kereta, bendungan, penghalang longsor — berasal dari swissTLM3D. Dasar danau dari swissBATHY3D, tinggi pohon dari swissSURFACE3D, kontur gletser dari inventaris GLAMOS yang mundur sampai 1850, dan ketebalan es dari dataset ETH Zürich, jadi gletser Aletsch benar-benar berupa es yang terpahat, bukan tekstur putih yang dilapiskan di atas batu. Padang rumput, scree, dan kebun anggur berasal dari peta habitat federal; bahkan pohon jalan di Zürich berasal dari kadaster pohon kota. Totalnya sekitar lima belas dataset terbuka, semuanya gratis dipakai — swisstopo membuka datanya, termasuk untuk penggunaan komersial, pada 2021.

Dunia voxel bukan gambar terrain. Ia adalah cache dari jutaan keputusan kecil yang dibuat pipeline-mu, satu per meter persegi — dan kualitas dunianya persis sama dengan kualitas keputusan-keputusan itu.

Level of Detail Adalah Masalah Data, Bukan Trik Rendering

Render distance default Minecraft hanya menampilkan beberapa ratus meter. Screenshot proyek ini memperlihatkan gletser Aletsch melengkung menjauh sejauh kilometer — pandangan jauh (“Fernsicht”) itu adalah representasi terpisah dengan fidelitas yang dikurangi, yang dibangun game sekali saat peluncuran pertama. Ini level of detail klasik, tapi keputusan pentingnya adalah di mana LOD itu hidup: ia dihitung dari data sumber saat ingest, bukan dipoles renderer secara on the fly.

Kalau kamu pernah membangun piramida tile peta, kamu tahu hitungannya. Setiap level zoom memangkas resolusi di kedua sumbu, jadi piramida penuh memakan 1 + 1/4 + 1/16 + … ≈ 4/3 dari lapisan dasar — premi storage 33% untuk perilaku yang mulus di setiap skala. LOD terrain voxel adalah piramida yang sama yang didirikan tegak: terrain jauh adalah level zoom kasar, terrain dekat adalah level halus, dan seninya ada pada memilih skema kunci yang memungkinkanmu mengambil sel yang tepat dengan cepat. Kita juga menghadapi pertanyaan yang sama dalam trade-off antara geohash dan spatial index yang layak — pilihan kunci menentukan biaya lookup di setiap tahap berikutnya.

Keputusan LOD favoritku sama sekali tidak visual. Download gratisnya adalah irisan 2.400 km² — wilayah UNESCO Jungfrau-Aletsch: Eiger, Mönch, Jungfrau, dan gletser terbesar di Alpen — yang menjalankan pipeline yang sama persis dengan negara penuh yang berbayar. Itu release canary sebagai fitur produk. Ukurannya 1,1 GB, bukan 24, tidak perlu daftar, dan kalau berjalan di mesinmu, peta penuhnya juga akan berjalan. Kalau kamu merilis produk data besar, curi ide ini mentah-mentah: tier gratismu sebaiknya irisan representatif dari terrain tersulitmu, bukan demo yang dikebiri dari bagian termudahmu.

Gunung voxel yang berubah dari blok kecil halus di depan menjadi blok raksasa kasar di kejauhan yang berkabut.
Terrain jauh hanyalah level zoom kasar dari piramida yang sama — LOD ditentukan saat ingest, bukan oleh renderer.

Men-streaming Tile Spasial di Browser

Disiplin yang sama muncul di halaman web proyek yang sederhana itu. Peta ikhtisarnya memungkinkan kamu menggeser slider untuk membandingkan dunia voxel dengan foto udara asli — dan gambarnya sama sekali tidak berasal dari server proyek. Browser-mu mengambil tile SWISSIMAGE langsung dari layanan swisstopo, dan hanya setelah kamu menggeser slider. Lazy, langsung ke sumber, ramah cache: bandwidth berat dilayani infrastruktur publik yang memang ada untuk keperluan ini, dan tagihan hosting proyek tetap nyaris nol.

Pengalamatan tile di web adalah masalah yang sudah terpecahkan, dan layak dipahami luar kepala kalau kamu pernah menyentuh pekerjaan geospasial:

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.

Dua detail lebih penting daripada rumusnya. Pertama, permintaan ditunda sampai niat pengguna jelas — slider benar-benar digeser — yang sekaligus optimasi bandwidth dan bentuk sopan santun terhadap layanan publik gratis yang dibiayai uang publik. Kedua, provenance ikut bersama tile: halaman itu mencantumkan kredit SWISSIMAGE, swissBOUNDARIES3D, dan swissNAMES3D tepat di peta. Ketika produkmu adalah karya turunan dari open data, atribusi di titik tampilan bukan hiasan. Itu lisensi yang bekerja sebagaimana mestinya.

Apa yang Bisa Dicuri dari Pipeline Swiss

Kontra-argumen dulu, karena para praktisi sudah mengajukan yang bagus. Upaya buatan tangan seperti Build the Earth mempekerjakan ribuan relawan untuk memodelkan bangunan sungguhan, dan tidak ada pipeline otomatis yang menyentuh fidelitas itu — footprint swissBUILDINGS3D yang di-voxel-kan adalah perkiraan kasar, dan kalau arsitektur yang kamu pedulikan, ekspor khusus terrain bisa dibilang artefak yang lebih bersih. Adil. Tapi cakupan dan fidelitas saling bertukar langsung: otomatisasi memberimu 41.285 km² hari ini, membangun manual memberimu kota tua yang indah suatu saat nanti. Posisiku: untuk produk data, generasi otomatis dengan provenance yang dipublikasikan menang, dan landmark buatan tangan yang dikurasi bisa ditumpuk di atasnya di tempat yang penting.

Dan provenance adalah bagian yang dilewatkan semua orang. Proyek ini merilis daftar cacat yang diketahui: celah dekat perbatasan tempat hanya grid Copernicus 30 m yang menjangkau, spot yang bolong atau datar, jembatan dan jalan yang salah atau hilang, dan QA dilakukan dengan sampling, bukan meter demi meter. Daftar itu bekerja nyata — ia mengubah laporan bug “dunianya salah di sini” menjadi dokumentasi “ya, dataset itu memang berhenti di sana”. Setiap produk data turunan seharusnya mempublikasikan matriks provenance dan daftar hal-hal yang diketahui salah. Yang tidak melakukannya bukan lebih akurat; mereka hanya kurang jujur.

  • Tile semuanya. Tile adalah unit penyimpanan, caching, generasi, dan kegagalanmu. Monolit tidak menurun dengan anggun.
  • Jangan pernah downsample saat ingest. Simpan resolusi asli per sumber dan resample saat render.
  • Generate secara lazy. Begitu dunia lebih besar dari waktu main siapa pun, komputasi per kunjungan mengalahkan pre-baking.
  • Bangun piramida LOD saat ingest. Anggarkan overhead ~33% dan dapatkan penskalaan yang mulus di setiap jarak.
  • Rilis slice canary. Potongan gratis dan representatif dari data tersulitmu mengalahkan spesifikasi apa pun.
  • Publikasikan provenance dan cacat yang diketahui. Itu bagian dari produk, bukan permintaan maaf atasnya.

Negara penuh dijual seharga 15 CHF dengan semua versi mendatang termasuk — dan hanya untuk warga Swiss, karena alasan hukum, sebuah batasan yang anehnya menawan untuk barang digital murni. Tapi produk sesungguhnya bukan petanya. Melainkan bukti bahwa satu orang dengan data publik, pipeline berbasis tile, dan dokumentasi yang jujur bisa merilis lebih banyak daripada infrastruktur geospasial kebanyakan tim. Dataset-mu mungkin bukan 41.285 km². Alasanmu juga lebih kecil.