4.8 KiB
4.8 KiB
FASE 2 - Web MVP (semanas 3-4)
Objetivo
Web minima viable desplegada en URL temporal con 3 paginas funcionales: home con headline + /mapa interactivo + /metodologia. La web consume dataset.parquet y tiles.pmtiles generados en Fase 1. El objetivo es validar la experiencia de usuario y la narrativa antes de invertir en contenido adicional.
Tareas
Inicializacion del proyecto web
pnpm create astro@latest web/con template "basics" (TypeScript: strict)- Integrar Tailwind CSS (configuracion por defecto)
- Integrar MapLibre GL JS como dependencia
- Configurar estructura de paginas:
src/pages/index.astro,mapa.astro,metodologia.astro - Configurar layout comun en
src/layouts/Base.astro(header + footer + meta tags)
Datos
- Copiar
tiles.pmtilesaweb/public/tiles/ - Crear
web/public/data/dataset.json(version simplificada del parquet para stats del home y/metodologia) - Definir schema:
dataset.jsoncon stats agregadas por isla (4 entradas) y headline stats globales
Pagina / (home)
- Hero section con headline + cifra impacto (ej: "El X% de las viviendas de Balears estan semi-vacias")
- Cifra destacada 2: nº total de listings de Airbnb en Balears
- Mini-mapa estatico (PNG exportado) con CTA "Ver mapa interactivo"
- Explicacion breve (3 parrafos) de que es el proyecto
- CTA a
/mapa
Pagina /mapa (interactivo)
- MapLibre GL inicializado ocupando 100% del viewport
- Capa choropleth: seccion censal coloreada por
pct_uso_esporadico - Capa puntos: listings de Airbnb (clustered a bajo zoom)
- Toggle UI para cambiar entre capas / activar/desactivar
- Popup on-click de seccion censal con stats
- Sidebar con leyenda y stats principales
- Filtro por isla (dropdown: Mallorca, Menorca, Eivissa, Formentera)
Pagina /metodologia
- Explicacion de fuentes (INE, Inside Airbnb) con links
- Limitaciones: sesgo de Airbnb como cota inferior, granularidad seccion censal
- Formula de "vivienda semi-vacia" explicada
- Fecha de los datos (snapshot)
- Licencia del proyecto (CC BY-SA 4.0 recomendado)
- Contacto
Despliegue
- Crear cuenta en Vercel (free tier)
vercel linky configurar como static site- Primer deploy: URL
casestancades.vercel.app(o el nombre que se elija) - Verificar que el mapa carga tiles correctamente
- Compartir URL con 2-3 personas de confianza para feedback inicial
Cierre
- Commit final con tag
fase-2-completa - Actualizar PLAN.md
- Anotar feedback recibido en este documento
Comandos clave
# Crear proyecto
cd /Users/ichi/Desktop/DEV/VIvienda
pnpm create astro@latest web -- --template basics --typescript strict --yes
cd web
pnpm install
pnpm add maplibre-gl pmtiles tailwindcss
# Dev local
pnpm dev # http://localhost:4321
# Build
pnpm build
# Deploy
pnpm dlx vercel
Snippet: inicializar MapLibre con PMTiles
// web/src/components/Mapa.astro
<script>
import maplibregl from 'maplibre-gl';
import { Protocol } from 'pmtiles';
import 'maplibre-gl/dist/maplibre-gl.css';
const protocol = new Protocol();
maplibregl.addProtocol('pmtiles', protocol.tile);
const map = new maplibregl.Map({
container: 'map',
style: {
version: 8,
sources: {
cases: {
type: 'vector',
url: 'pmtiles:///tiles/dataset.pmtiles',
attribution: 'INE + Inside Airbnb',
},
},
layers: [
{ id: 'background', type: 'background', paint: { 'background-color': '#f5f5f4' } },
{
id: 'secciones-fill',
type: 'fill',
source: 'cases',
'source-layer': 'cases',
paint: {
'fill-color': [
'interpolate', ['linear'], ['get', 'pct_uso_esporadico'],
0, '#fef3c7', 10, '#fbbf24', 25, '#ea580c', 50, '#991b1b',
],
'fill-opacity': 0.65,
},
},
{
id: 'secciones-line',
type: 'line',
source: 'cases',
'source-layer': 'cases',
paint: { 'line-color': '#78716c', 'line-width': 0.3 },
},
],
},
center: [2.85, 39.6],
zoom: 8,
});
</script>
<div id="map" class="w-full h-screen"></div>
Criterio de "fase terminada"
- Web desplegada en URL temporal de Vercel
- 3 paginas funcionales: home, /mapa, /metodologia
- Mapa interactivo carga tiles y permite explorar Balears
- Sin errores en consola del navegador
- Mobile responsive (mapa con dedos funciona)
- Feedback de al menos 1 persona ajena al proyecto
- Commit final con tag
fase-2-completa
Decisiones tomadas durante la fase
Llenar durante la ejecucion.
Problemas encontrados
Llenar durante la ejecucion.
Proximos pasos
Fase 3: lanzamiento publico. Ver FASE-3-lanzamiento.md.