Every city is simultaneously a physical object, a set of economic relationships, a carrier of memory, and a political argument. Reconstructing one from archival sources requires separating these layers and building them in the right order. This post explains how we do that for 1880–1930 Saigon.

The six-layer model

We start from how the modern world is understood as spatial data:

Macro signal (satellite) → LiDAR → Road & facade → Building blocks → POI & economic activity → Human interaction

Each layer depends on the one below it. You can't model facade geometry without knowing where the buildings are. You can't place a business without a building to put it in. The dependency is strict.

Reconstructing a historical city means finding a substitute for each modern data source — or accepting that some layers must be built differently, or with lower resolution, from archival evidence.

The historical translation

L1 — Historical maps (replaces satellite macro signal). The foundation is not satellite imagery — it's the historical map itself, georeferenced to modern coordinates and vectorized into geometry. Our pipeline handles the US Army L7014 series (500+ sheets) automatically via GCP propagation, and ingests French colonial maps (BnF Gallica, ANOM, EFEO) with manual control points. Georeferencing places the map; vectorization extracts what's on it as usable geometry. Both halves are needed. Status: georeferencing done for L7014, colonial maps ongoing, vectorization not yet started — the bigger half of this layer remains.

L2 — LoD1 city mass (replaces LiDAR). Modern cities have LiDAR point clouds that directly produce mass 3D models. Colonial Saigon has none. Our substitute: two panoramic paintings of Saigon, from 1882 and 1898, that show the full city skyline with directly observable building heights. These are exceptionally rare primary sources — the commercial photography of the era almost never captured the roofline of an entire district. Combined with the Morlighem (TU Delft 2021) pipeline for automated building detection, they allow us to produce LoD1 box models for the full 1900 city core with height confidence scores. Status: method designed, panoramas documented, pipeline adaptation beginning.

L3 — Road & facade → LoD2. The road network and basic facade geometry. In the modern world this comes from street-level camera passes and LiDAR returns off building surfaces. In the historical context, road geometry is extracted from the vectorized L1 maps; facade types (roof shapes, arcade structures, materiality) are inferred from archival photo evidence. The output is LoD2 — buildings with typed roofs and simplified surface geometry. Status: design phase.

L4 — Building blocks → LoD3 mesh. For roughly 30 landmark buildings, we run structure-from-motion photogrammetry (COLMAP) on archival photo collections: EFEO surveys, BnF Gallica postcards (the 1900–1930 Saigon postcard industry produced enough multi-angle coverage to support SfM), Manhhai collection, family archives. Output: full textured 3D meshes. The 1900–1930 postcard industry turns out to be a gift — commercial incentive to photograph buildings from flattering angles produced exactly the overlapping coverage photogrammetry needs. Status: schema designed, first photo collection missions underway.

L5 — Knowledge graph (POI & economic activity). Named places, businesses, institutions, ownership records, land use — stored as a typed graph with controlled predicates and ISO 8601 partial-date temporal encoding ('1905', '1905-03') for uncertain dates. The KG links directly to vectorized building geometries from L1. It is not just an additional layer — it is the connective tissue that gives the geometry its meaning. A building footprint without a name, an owner, and a political context is just a polygon. Status: schema complete, CRUD API in development.

L6 — Human interaction. GPS-triggered narratives, community annotations on historical maps, oral history links, crowdsourced photo tagging. This is where most users experience the archive — and where community knowledge flows back into L5 as citable entries. The KG provides context to this layer; this layer feeds new facts into the KG. Status: GPS story system live, annotation tool live, KG integration not yet connected.

Why the order matters

The dependency rule is not a suggestion. L1 must exist before L3 (road geometry comes from the vectorized map). L2 heights are calibrated against L4 photo evidence. L5 entities anchor to L1 building geometries. L6 community contributions are only meaningful if L5 has the ontology to absorb them.

Build out of order and you accumulate debt that compounds upward. Our phase sequence — L1 vectorization and L6 community tools first, then L5 KG, then L2–L4 3D — reflects these dependencies. The 3D work (L2–L4) starts only after we have the vectorized footprints from L1 that the Morlighem pipeline needs as input.

The HITL flywheel

Community contributors tag historical photos to locations (raw material for L3–L4) and trace building outlines on georeferenced maps (L1 vectorization). This data trains a machine learning model. The model suggests outlines that contributors validate faster than they could trace from scratch. Faster contribution → more data → better model → faster contribution. The data and model weights are published openly on Hugging Face.

The four contribution tiers map to the stack: Photo Hunters feed L3–L4 with photo evidence; Cartographers vectorize L1 map features; Architects build L4 meshes via photogrammetry; Historians populate L5–L6 with KG entities and citations.

The datum problem (a technical note)

The US Army L7014 maps use the Indian 1960 datum (EPSG:3148), based on the Everest 1830 spheroid. Modern GPS and web maps use WGS84. The difference in Vietnam is up to 200m — enough to put a road in the middle of a field. We apply a Helmert 3-parameter geocentric shift (towgs84=+198,+881,+317) as specified in EPSG transform 1052. PROJ and QGIS do not always apply this automatically — the explicit proj4 string with towgs84 parameters is required. Skipping it produces maps that look correct until you overlay on satellite imagery and notice the roads are a city block off.

French colonial maps (ANOM, BnF Gallica, EFEO) have more varied coordinate situations: Paris meridian, local Vietnamese geodetic references, sometimes nothing documented. These require manual GCPs and Allmaps annotation — more labor-intensive but fully compatible with the same pipeline.

What we've learned so far

The propagation algorithm works: one manual georeference → 10 automated neighbors, error rate under 1% validated against independent seeds. The Morlighem pipeline is proven on Dutch and Belgian maps (>84% building detection, >99% valid CityJSON) and we expect it to adapt, with colour calibration work, to French colonial Saigon's symbology. The 1882 and 1898 panoramas are a more significant calibration source than we initially understood — they reduce height uncertainty from roughly ±3m to approximately ±1.5m for the 1900 core.

The methodology is public. The pipeline is open. If you're working on historical city reconstruction for another Southeast Asian city — or anywhere with a colonial-era map archive — this framework is forkable. That's the point.