2026-09-18 — Arquitectura places-turismo: top 5 por rating para campaña

Contexto

Rama places-turismo en ~//nef/estado_turismo — adaptación de smooth-nav/places-explorer para mostrar 5 lugares destacados por sitio turístico, priorizando mejores reseñas. Complemento de la campaña de turismo de Quintana Roo.

Decisiones técnicas

1. Top 5 ordenados por rating

Por qué: La campaña necesita mostrar lo mejor de cada destino, no un catálogo exhaustivo.
Cómo: turismo-api.js ordena por rating descendente, slice(0, 5). Datos de Google Places API (rating 0-5, reviewCount entero).

2. Rating prominente en el panel

Dónde: tier 1 (tarjeta), reemplazando volatilidad.
Formato: “4.8 ★★★★★ (9,500 reseñas)“
Estilos: .pp-rating dorado (—pp-sun), .pp-review-count secundario.

3. Datos de 3 niveles

// Nivel 0: índice (GeoJSON features)
{ id, name, lat, lng, cat, rev }
 
// Nivel 1: tarjeta (batch request visible)
{ id, summary, rating, reviewCount, price, open, tint }
 
// Nivel 2: detalle (prefetch + open)
{ id, desc, rating, reviewCount, hours, tags, photos, sources }

4. Fuentes de datos

  • Coordenadas, categorías: /spab-retrieval/data/destinos.json (Tulum, Bacalar, etc.)
  • Lugares, ratings: googleplaces.ts → base/lugares.csv (place_id, rating, n_reseñas)
  • Costo: Places API con reviews = tier Enterprise; ~30 lugares × N destinos × mensual

Archivos clave

places-explorer/
├── index.html                  título, imports turismo-api
├── src/
│   ├── turismo-api.js         TOP_5 = RAW.sort(rating).slice(0,5)
│   ├── places-panel.js        renderT1() con estrellas
│   ├── places-panel.css       .pp-rating, .pp-review-count
│   ├── place-store.js         (sin cambios)
│   ├── maplibre-adapter.js    (sin cambios)
│   └── types.d.ts             PlaceCard += rating, reviewCount
└── README.md                   instrucciones de integración

Próximos pasos (no implementados)

  1. Endpoint real: GET /api/destinos/{slug}/top-places

    • Lee base/lugares.csv filtrado por destino = slug
    • Ordena por rating DESC, n_resenas DESC
    • Devuelve top 5 con estructura PlaceIndex[]
  2. Selector de destino

    <select id="destino">
      <option value="tulum">Tulum</option>
      <option value="bacalar">Bacalar</option>
      <option value="cancun">Cancún</option>
    </select>

    → Recarga store.loadIndex() con nuevo slug

  3. Caché localStorage

    • Key: places-${slug}-${rev}
    • TTL: 1 hora (turístico cambia poco)
  4. Deploy

    • Cloudflare Pages: /places-explorer
    • Workers: /api/destinos/:slug/top-places
    • Binding: D1 o R2 con lugares.csv parseado

Ruta Maya (siguiente iteración)

Ver 2026-09-18-ruta-maya-rescate.md — integrar lugares de múltiples destinos en una narrativa geográfica continua.


Comando para servir local:

cd ~//nef/estado_turismo/places-explorer
python3 -m http.server 8000
# → http://localhost:8000

Commit: 0f8bf46 en rama places-turismo