Digitalització completa del Nomenclátor de la Provincia de las Baleares, redactat el 25 de desembre de 1860 per la Junta General d'Estadística (predecessora de l'INE) sota Alejandro Oliván. És el primer nomenclàtor espanyol amb tabulació a nivell d'edifici.
Cada poble balear declara els edificis per ús (habitats permanentment, temporals, inhabitats), per nombre de plantes, més albergs i la distància al centre del municipi. Domini públic per antiguitat.
🔗 Demo en directe: https://nomenclator-1860.acpicornell.workers.dev 📂 Codi: https://github.com/acpicornell/nomenclator-1860
| Font | Període | Taules | Files |
|---|---|---|---|
| Nomenclàtor 1860 — Junta General de Estadística | 25 desembre 1860 | entries, notes, summaries, errata |
3.026 entrades |
L'obra completa — «Nomenclátor que comprende las poblaciones, grupos, edificios, viviendas, albergues, etc., de las cuarenta y nueve provincias de España», editat per la Junta General de Estadística entre 1863-1871, Imprenta de José María Ortiz, Madrid — està digitalitzada per la Biblioteca Nacional de España (signatura 2/45404 V.1 - 2/45408 V.5, domini públic, llicència CC-BY 4.0):
- 📚 Registre BNE: bdh-rd.bne.es/bdh0000167814
- 📄 Volum 1 (PDF)
- 📄 Volum 2 (PDF)
- 📄 Volum 3 (PDF)
- 📄 Volum 4 (PDF)
- 📄 Volum 5 (PDF)
Les 49 províncies de l'època apareixen disposades alfabèticament a través dels 5 volums. El PDF que digitalitzem aquí (pdfs/Nomenclàtor 1860 balears.pdf, no versionat — vegeu .gitignore) és l'extracció de les pàgines de la província de Balears.
db/nomenclator.duckdb (build-time, local)
├─ entries ← una fila per població/edifici
├─ notes ← notes a peu d'article
├─ summaries ← pàg. 50 (4 quadres-resum)
├─ errata ← pàg. 51 (fe d'errates)
└─ source_metadata ← provenença
│
▼ scripts/export_json.py
web/data/*.json (~1.5 MB sense gzip, ~500 KB gzip)
│
▼
web/ ← HTML + JS pur + Vega-Lite (sense WASM)
La pipeline Python local fa servir DuckDB internament per a extracció, validació i ingesta, però l'output final per al web és JSON estàtic. El runtime web no necessita DuckDB-WASM ni cap altra base de dades: tot el filtrat i les agregacions es fan en JavaScript sobre arrays en memòria del navegador. Això permet hostatjar la web a qualsevol CDN amb límits estrictes (Cloudflare Workers Free, GitHub Pages, S3 estàtic…).
- Python ≥ 3.12 amb uv
ANTHROPIC_API_KEYa.env(només si tornes a executar l'extracció del PDF)
uv sync # crea .venv amb tot.venv/bin/python scripts/rebuild.py # tot, excepte vision (car)
.venv/bin/python scripts/rebuild.py --json # només re-exportar JSON a web/data/
.venv/bin/python scripts/rebuild.py --seed # només estampar metadata
.venv/bin/python scripts/rebuild.py --include-expensive # amb Claude visionrebuild.py corre cada pas en l'ordre correcte, reporta timing i row counts, i actualitza source_metadata. Al final delega a scripts/export_json.py per generar els JSON consumits per la web.
# Extracció del PDF (car: Claude vision, ~10 USD)
.venv/bin/python scripts/extract_with_claude.py --range 4-51
# Càrrega i validació
.venv/bin/python scripts/load_claude_output.py
.venv/bin/python db/validate.py
.venv/bin/python db/validate_rows.py
# Correccions automàtiques
.venv/bin/python scripts/auto_fix.py --apply
.venv/bin/python scripts/auto_fix_2.py --apply
# Aplicar fe d'errates + carregar quadres-resum (pàg. 50, 51)
.venv/bin/python scripts/apply_errata_and_summaries.py
# Comprovacions de consistència
.venv/bin/python db/check_consistency.pyQuan re-exportis els JSON, recorda bumpar DATA_V a web/app.js perquè el navegador no serveixi una versió obsoleta.
cd web && python3 -m http.server 8000Obrir http://localhost:8000. La pàgina ha de servir-se per HTTP (no file://) perquè els JSON es carreguen via fetch. Pestanyes:
- Inici — visió general amb estadístiques principals.
- Explorar — filtres (població, partit judicial, municipi, classe, distància) sobre una taula paginada i ordenable, amb descàrrega CSV.
- Estadístiques — agregats per partit, classes més freqüents, distribució per plantes, més els 4 quadres-resum oficials de la pàg. 50.
- Gràfiques — sis visualitzacions Vega-Lite interactives:
- Donut de classes d'edifici (filtrable per municipi)
- Ocupació HC/HT/Inh per partit o municipi (amb selector)
- Boxplot de distàncies al nucli per classe
- Corba de Pareto de la concentració d'edificis
- Arrels toponímiques més freqüents (Son, Ca'n, Molí, Torre, Venda…)
- Composició arquitectònica per nombre de plantes (amb selector)
- Glossari — explicació de columnes, classes de població i convencions del text original.
L'única dependència de runtime és Vega-Lite (~800 KB a web/vendor/, reproduïble amb scripts/download_vendor.py).
El web és pur estàtic — qualsevol hosting CDN serveix, però aquest projecte deploya a Cloudflare Workers Static Assets connectant el repositori de GitHub directament:
- dash.cloudflare.com → Workers & Pages → Create → Workers → Import a repository
- Selecciona
acpicornell/nomenclator-1860 - Configuració:
- Build command: (buida)
- Build output directory:
web - Root directory:
/
- Save and Deploy
El fitxer web/_headers configura Cache-Control: no-store perquè cada push es reflexi al següent reload, més una CSP raonable (script-src 'self' 'unsafe-eval' per Vega). Vendor i dades són tots < 1.5 MB, ben per sota del límit de 25 MiB per fitxer de CF Workers.
El schema complet és a db/schema.sql. Taula principal entries:
| Columna | Tipus | Significat |
|---|---|---|
judicial_district |
TEXT | Palma / Inca / Manacor / Eivissa / Maó |
municipality |
TEXT | Literal del PDF |
place |
TEXT | Població o entitat |
place_class, class_normalized |
TEXT | Caserío, Casa de labor, Molino, Iglesia… |
distance_km |
DOUBLE | Distància al centre del municipi |
inhabited_permanent, inhabited_seasonal, uninhabited |
INT | Per ús |
buildings_1_floor…buildings_over_3_floors, shelters |
INT | Per construcció |
total |
INT | Suma per fila |
La pàgina 50 del PDF (quadres-resum) es carrega a la BD però s'amaga a la pestanya d'exploració; es mostra a la pestanya Estadístiques.
db/check_consistency.py executa 8 comprovacions sobre la BD:
- Coherència interna de fila (HC+HT+Inh = P1+P2+P3+PM+Alb = total)
- Σfiles de municipi vs subtotal imprès
- Σmunis de partit vs total del partit
- Σentries vs Quadre 3 pàg. 50
- Anomalies de NULL i zeros
- Files duplicades (mateix page+muni+place)
- Estat de la fe d'errates (8 correccions verificades)
- Gaps de normalització de
class_normalized
Estat actual: 100% coherència aritmètica interna post-fix Ca'n Mena. Les 15 desviacions Σfiles vs subtotal imprès (Δ ∈ [-1, +3], net +11 sobre 74.107 edificis, 0,015%) són del propi impressor del 1860, no de la digitalització — tots els subtotals impresos s'han verificat visualment contra el facsímil i coincideixen exactament amb la BD.
- Identificadors de codi (taules, columnes, fitxers, variables): anglès.
- UI web (textos, etiquetes, comentaris): català.
- README: català.
- Valors literals (noms de població, classes com «Caserío»): tal com apareixen a la font.
- Codi: GNU AGPL-3.0-or-later — vegeu
LICENSE. - Dades (
web/data/*.json): la font original (Nomenclátor de 1860) és domini públic per antiguitat (l'obra té més de 160 anys i és una publicació oficial de l'Estat anterior a 1880). Vegeudata/SOURCES.mdper a l'atribució recomanada.