---
id: "0052"
title: "Extracción masiva de footprint_aurgi → registry"
status: completado
type: feature
domain: []
scope: multi-app
priority: alta
depends: []
blocks: []
related: []
created: 2026-05-04
updated: 2026-05-17
tags: []
---

## Cierre (2026-05-05)

Los 9 batches completos: 41 funciones + 4 tipos + app `footprint_geo_stack` + 4 pipelines.
Tests: 240 pasan, 2 skip esperados (1 por `osm2pgsql` ausente, 1 por geo stack no
relanzable sin `.env` con `VALHALLA_DATA_DIR`).

Bugs encontrados y arreglados al cerrar el issue:

1. `setup_geo_stack_docker_pipeline` abortaba `verify` si `docker compose up -d` fallaba.
   Ahora corre verify aunque el `up` falle (caso típico: stack ya vivo, lanzado con su
   `.env` en otra parte).
2. El check de PostGIS usaba el nombre `footprint_postgis` que no coincide con el
   `container_name: better_maps_postgis` del compose. Corregido + credenciales reales
   (`-U geoserver -d gis`).

Función primitiva añadida como subproducto: `docker_container_running_py_infra` con
tests unitarios + integración (7 tests, todos pasan). Reutilizable para cualquier
verificador de stack.

# 0052 — Extracción de funciones de `sources/footprint_aurgi/`

Extracción de 45 funciones + 4 tipos del proyecto interno `footprint_aurgi` (código propio Aurgi, sin LICENSE — `source_license: internal-aurgi`).

## Capacidades cubiertas

1. Geocodificación y routing (Valhalla)
2. Generación de isócronas (sync + async batch)
3. Stack Docker geo (PostGIS + Martin + Valhalla)
4. Spatial primitivas (haversine, point-in-polygon, bbox, sindex)
5. Visualización en mapa (basemap OSM, KDE, alpha-shape hulls)
6. PDFs reporting (compresión ghostscript, table pages)
7. Estadística para distribuciones reales (skew/kurt, trimmed/geo means)
8. Fuzzy joining adaptativo
9. Normalización España (CP→provincia)
10. Data prep (CSV→Parquet via duckdb)

## Batches

| # | Dominio | Funciones | Owner |
|---|---|---|---|
| 1 | geo (puras) + tipos | haversine, point_in_polygon, bbox, extent, distance_bucket + LonLat, BBox, IsochroneRequest, Centro | agent-A |
| 2 | core (string ES) | slugify_ascii, normalize_for_join, cp_provincia_es, infer_provincia_from_cp | agent-B |
| 3 | datascience (stats) | trimmed_mean, geometric_mean, detect_distribution_type, best_central_tendency, summary_stats, kde_density_levels, alpha_shape_concave_hull | agent-C |
| 4 | datascience (fuzzy) | fuzzy_merge_adaptive, words_to_dataset, remove_words_from_column | agent-D |
| 5 | geo (Valhalla client) | valhalla_route, valhalla_matrix_1_to_n, valhalla_isochrone, valhalla_isochrones_async | agent-E |
| 6 | geo (I/O + viz) | load_geojson_polygons, load_boundary_gdf, add_basemap_osm, add_basemap_with_timeout, plot_kde_2d, plot_heatmap_log | agent-F |
| 7 | infra (PDF + data) | compress_pdf_ghostscript, render_table_page_pdfpages, add_header_logo, safe_read_csv_fallback, csv_to_parquet_duckdb, osm2pgsql_ingest | agent-G |
| 8 | infra (docker stack) | docker-compose footprint geo (PostGIS + Martin + Valhalla) — levantar y verificar | agent-H |
| 9 | pipelines | setup_geo_stack_docker, compute_centers_reachability, generate_isochrones_by_zone, count_points_per_zone | agent-I (wave 2) |

## Fuente

- Path: `sources/footprint_aurgi/`
- Sub-proyectos: aurgi_mapas, better_maps, frontend_mapas, fuzzy_joins, ponderacion_isochronas, zonas_mapas_aurgi
- Atribución uniforme: `source_repo: "internal:footprint_aurgi"`, `source_license: "internal-aurgi"`

## Resultado esperado

Reporte final por función: ✅ tests pasan / ❌ tests fallan / ⚠️ stub (requiere infra externa).
