Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/danitocsc/transporte-unrc-web-public/llms.txt

Use this file to discover all available pages before exploring further.

El pipeline de datos de Transporte Tijuana transforma 192 respuestas de encuesta —con direcciones abiertas y campos estructurados— en un sitio web interactivo que muestra rutas piloto, estadísticas y un mapa de demanda completamente anonimizado. El flujo atraviesa cuatro etapas: recolección, procesamiento en Python, análisis logístico espacial y visualización con Next.js.
Los scripts de procesamiento Python son herramientas internas de análisis y no están incluidos en este repositorio público. Solo los artefactos de salida —los archivos JSON y el PDF— se publican en web/public/data/ y web/public/downloads/. Esta página documenta el pipeline completo para fines de transparencia metodológica.

1
Recolección
2
La encuesta se distribuyó a los estudiantes de UNRC Unidad Tijuana a través de Google Forms. El formulario combinaba campos estructurados con preguntas de respuesta abierta:
3
Campos estructurados:
4
  • Turno de asistencia (Matutino, Intermedio, Vespertino)
  • Días de asistencia (Lunes a Miercoles, Jueves a Sabado, Todos los días)
  • Licenciatura
  • 5
    Campos abiertos:
    6
  • Dirección o referencia de origen (colonia, calle, punto de referencia)
  • Sugerencias para el servicio de transporte (tarifa, horarios, rutas)
  • 7
    Al cierre del período de recolección se obtuvieron 192 respuestas totales. La distribución por turno fue: Matutino (96, 50 %), Intermedio (53, 27.6 %) y Vespertino (42, 21.9 %). Los estudiantes provenían de 70 colonias distintas de la zona metropolitana de Tijuana.
    8
    9
    Procesamiento Python
    10
    Las respuestas crudas del formulario se procesaron con un script Python privado que produce todos los archivos estáticos que consume el sitio web.
    11
    Herramientas utilizadas:
    12
    LibreríaVersiónUsopandas—Limpieza, normalización y agregación de la hoja de cálculo exportada de Google Formsgeopy / Nominatim—Geocodificación automática de los campos de dirección abiertosfpdf2—Generación automática del reporte en PDF con portada, tablas y análisismatplotlib—Gráficas estadísticas embebidas en el PDF
    13
    Proceso detallado:
    14
  • Limpieza con pandas: se normalizan los valores de turno y días, se estandarizan los nombres de colonias y se identifican respuestas incompletas o duplicadas.
  • Geocodificación con Geopy/Nominatim: cada respuesta con una dirección legible (por ejemplo "Colonia Natura, Tijuana") se convierte en coordenadas lat / lng reales mediante consultas a la API de Nominatim. El campo fuente_coordenada_publica en el output registra el proveedor utilizado.
  • Aplicación de jitter: las coordenadas reales se desplazan aleatoriamente unos metros antes de escribirse en los archivos de salida, generando lat_publica y lon_publica. Esto protege los domicilios exactos.
  • Generación de PDF con fpdf2: el script construye el reporte en PDF con estadísticas, gráficas generadas por matplotlib, mapas de referencia y un código QR que apunta al sitio web.
  • 15
    Artefactos de salida:
    16
    web/public/data/
    ├── summary.json        # Métricas completas, series estadísticas y sugerencias
    ├── map_points.json     # Puntos de demanda anonimizados (PublicPoint[])
    ├── paradas.json        # Paradas piloto con metadatos de ruta
    └── custom_routes.json  # Trazados de las rutas piloto
    
    web/public/downloads/
    ├── reporte-demanda-transporte.pdf  # Reporte oficial en PDF
    └── public_points.csv               # Dataset público de puntos anonimizados
    
    17
    De las 192 respuestas originales, 190 pudieron ser geocodificadas exitosamente, representando un 98.96 % de cobertura.
    18
    19
    Análisis Logístico
    20
    Con las 190 ubicaciones geocodificadas, se realizó un análisis espacial para diseñar las rutas piloto:
    21
    Metodología:
    22
  • Clustering espacial: se agruparon los puntos de demanda para identificar las zonas de mayor concentración de estudiantes y definir ubicaciones óptimas de paradas, priorizando puntos de referencia peatonal existentes (puentes peatonales, tiendas, intersecciones conocidas).
  • Diseño de rutas: partiendo de los clústeres, se trazaron rutas sobre vialidades reales considerando los tiempos de viaje estimados, la conectividad con el Blvd. Corredor 2000 y la entrada de la universidad.
  • 23
    Resultado: 2 rutas piloto que cubren los 190 estudiantes geolocalizados.
    24
    Ruta 1 — Centro: UNRC vía Corredor 2000
    25
  • Color en mapa: #0011ff
  • Cobertura: 107 estudiantes
  • Desglose por turno: Matutino (49), Intermedio (32), Vespertino (26)
  • Tramo: Av. Constitución (Centro) → Blvd. Paseo de los Héroes → Corredor 2000 → UNRC
  • Distancia estimada: 39.9 km · ~72 min
  • Paradas representativas: 01 Sitio Azul y Blanco, 13 Plaza Paseo 2000, 14 Puente Peatonal Real de San Francisco / Plaza Oasis, 17 Parada Sendero
  • Horarios de salida propuestos: 5:30 am (Matutino), 9:30 am (Intermedio), 1:30 pm (Vespertino)
  • 26
    Ruta 2 — La Mesa: UNRC vía Camino Verde
    27
  • Color en mapa: #ff9500
  • Cobertura: 83 estudiantes
  • Desglose por turno: Matutino (47), Intermedio (21), Vespertino (15)
  • Tramo: Blvd. Díaz Ordaz (La Mesa) → Lomas del Valle → Camino Verde → UNRC
  • Distancia estimada: 37.3 km · ~59 min
  • Paradas representativas: 01 Calzapato Carrousel, 14 Mitote, 17 Oxxo Monte Bello, 22 El Florido Natura
  • Horarios de salida propuestos: 5:30 am (Matutino), 9:30 am (Intermedio), 1:30 pm (Vespertino)
  • 28
    29
    Visualización Next.js
    30
    Los archivos JSON generados en las etapas anteriores se colocan directamente en web/public/data/ y se sirven como datos estáticos. Next.js 16 los lee en el servidor en tiempo de petición y los pasa a los componentes de React.
    31
    Lectura de datos del servidor:
    32
    La función loadSiteData() en web/lib/site-data.ts lee summary.json y map_points.json concurrentemente usando la API fs/promises de Node.js:
    33
    // web/lib/site-data.ts
    import { promises as fs } from "node:fs";
    import path from "node:path";
    
    const SUMMARY_PATH = path.join(process.cwd(), "public", "data", "summary.json");
    const MAP_PATH     = path.join(process.cwd(), "public", "data", "map_points.json");
    
    export async function loadSiteData(): Promise<{
      summary: SummaryPayload;
      map: MapPayload;
    }> {
      const [summary, map] = await Promise.all([
        readJsonFile<SummaryPayload>(SUMMARY_PATH),
        readJsonFile<MapPayload>(MAP_PATH),
      ]);
      return { summary, map };
    }
    
    34
    Comportamiento de renderizado por ruta:
    35
    RutaEstrategiaDetalle/informeSSR dinámico (por defecto)Llama a loadSiteData() en cada petición; renderiza métricas, gráficas, mapa de calor y testimonios/mapa-demandaforce-dynamicLee paradas.json y custom_routes.json con readFileSync en cada petición; sanitiza los campos antes de pasar al cliente
    36
    Stack de visualización:
    37
    LibreríaUso en el sitioMapLibre GL JSRenderizado del mapa vectorial acelerado por hardware en /mapa-demanda; muestra las polilíneas de rutas y los marcadores de paradasRechartsGráficas interactivas de barras y pastel para las series de turnos, días y colonias en /informeReact-Leaflet + Leaflet.heatCapa de mapa de calor (heatmap) sobre el mapa de demanda en /informe, mostrando densidad de puntos sin revelar ubicaciones individuales
    38
    Despliegue:
    39
    El sitio se despliega automáticamente en Vercel a través de la integración con GitHub. El directorio raíz del proyecto para el despliegue es web/. El dominio oficial es transporte-unrc.vercel.app.

    Resumen del flujo de datos

    Google Forms (192 respuestas)
    
    
    Python interno (pandas + geopy + fpdf2 + matplotlib)
    
            ├── summary.json        → /informe (SSR, métricas + gráficas)
            ├── map_points.json     → /informe (heatmap MapLibre/Leaflet)
            ├── paradas.json        → /mapa-demanda (paradas sanitizadas)
            ├── custom_routes.json  → /mapa-demanda (polilíneas MapLibre)
            ├── public_points.csv   → descarga pública
            └── reporte PDF         → descarga pública
    
    
            Next.js 16 SSR (Vercel)
    
    
            Navegador del visitante
            (Recharts + MapLibre GL JS + Leaflet.heat)
    

    Build docs developers (and LLMs) love