📦

GreenBox Logistics — Análisis Geoespacial de Expansión

Área Metropolitana de Madrid · Junio 2026 · Desarrollado con GeoPandas + Shapely

CULTIVA IA · Datos & Análisis
Skill: geopandas-analisis-geoespacial
DATOS · GEOESPACIAL
Resumen Ejecutivo — Madrid, 21 Distritos Analizados
Distritos analizados
21
CRS: EPSG:25830 (UTM zone 30N)
Hubs activos GreenBox
8
Buffer cobertura: 2 km radio
Población no cubierta
1.4M
47% del área metropolitana ↑ oportunidad
Distritos top expansión
5
Score medio: 87.3 / 100
🗺️ Mapa Coroplético — Score de Oportunidad por Distrito
Fuencarral Score: 94 Hortaleza Score: 91 San Blas Score: 88 Barajas Moncloa Score: 79 Tetuán Score: 84 Chamartín Score: 96 C. Lineal Score: 89 Vicálvaro Score: 73 Centro Hub ✓ Salamanca Hub ✓ Retiro Hub ✓ Arganzuela Score: 65 Carabanchel Score: 57 Latina Usera Score: 61 Pte. Vallecas Score: 55 Villa Vallecas Score: 71 Moratalaz Villaverde Score: 48 Vicálvaro Sur N↑ 0 5 km
Score 90-100 (expansión prioritaria)
Score 75-89
Score 50-74
Hub activo (cobertura OK)
Hub GreenBox (8 total)
Top 5 expansión
🏆 Top 5 Distritos — Score de Oportunidad
# Distrito Comercios Población Score
1
Chamartín
Sin cobertura
2.847 148.220
96
2
Fuencarral
Sin cobertura
2.190 219.407
94
3
Hortaleza
Sin cobertura
1.934 183.651
91
4
Ciudad Lineal
Cobertura parcial
3.102 226.178
89
5
San Blas-Canillejas
Sin cobertura
1.671 155.380
88
📍 Hubs Activos (Cobertura Buffer 2km)
  • Hub Centro — C/ Gran Vía, 28
    Área cubierta: 12.57 km² · 127 k hab.
    94.2%
  • Hub Salamanca — Av. Príncipe Vergara
    Área cubierta: 12.57 km² · 148 k hab.
    88.1%
  • Hub Retiro — C/ Doctor Esquerdo
    Área cubierta: 10.18 km² · 119 k hab.
    91.7%
  • Hub Tetuán, Moncloa, Vallecas (×3)
    Hubs secundarios · Cobertura parcial
    62-75%
  • Hub Norte + Hub SE
    Activación prevista Q3-2026
🏪 Densidad de Comercios — Top 8 Distritos
Ciudad Lineal
3.102
3.102
Chamartín
2.847
2.847
Centro
2.710
2.710
Salamanca
2.589
2.589
Fuencarral
2.190
2.190
Tetuán
2.086
2.086
Hortaleza
1.934
1.934
San Blas
1.671
1.671
📊 Cobertura Actual vs Potencial
53% Cubierto
Hubs activos (cobertura actual)
53%
Top 5 distritos (expansión)
31%
Resto sin priorizar (Q4+)
16%
Población cubierta ahora
1.59M
Población objetive Top 5
0.93M
Comercios no cubiertos
14.240
Revenue potencial est.
+2.1M€
🐍 Código GeoPandas — Análisis Ejecutado
🐍 Python 3.12 GeoPandas 1.0 Shapely 2.0 EPSG:25830
import geopandas as gpd import pandas as pd import matplotlib.pyplot as plt # 1. Cargar distritos Madrid (GeoJSON) distritos = gpd.read_file("madrid_distritos.geojson") hubs = gpd.read_file("greenbox_hubs.geojson") # 2. Reproyectar a UTM para medidas precisas distritos = distritos.to_crs("EPSG:25830") hubs = hubs.to_crs("EPSG:25830") # 3. Buffer 2km alrededor de cada hub hubs_buf = hubs.copy() hubs_buf.geometry = hubs.geometry.buffer(2000) # 4. Dissolve buffers → área cubierta total cobertura = hubs_buf.dissolve() # 5. Calcular % cobertura por distrito distritos['area_total'] = distritos.geometry.area intersect = gpd.overlay(distritos, cobertura, how='intersection') intersect['area_cubierta'] = intersect.geometry.area cov_pct = intersect.groupby('NOMBRE')['area_cubierta'].sum() distritos = distritos.merge(cov_pct, on='NOMBRE', how='left') distritos['pct_cubierto'] = ( distritos['area_cubierta'] / distritos['area_total'] ).fillna(0) # 6. Unir métricas (comercios, población) metricas = pd.read_csv("metricas_distritos.csv") distritos = distritos.merge(metricas, on='NOMBRE') # 7. Score de oportunidad distritos['comercios_norm'] = ( distritos['comercios'] / distritos['comercios'].max() ) distritos['pob_norm'] = ( distritos['poblacion'] / distritos['poblacion'].max() ) distritos['score'] = ( distritos['comercios_norm'] * 0.6 + distritos['pob_norm'] * 0.4 - distritos['pct_cubierto'] * 0.3 ) * 100 # 8. Top 5 y mapa coroplético top5 = distritos.nlargest(5, 'score') ax = distritos.plot(column='score', cmap='YlGn', legend=True, figsize=(12, 10)) hubs_buf.plot(ax=ax, alpha=0.2, color='blue') hubs.plot(ax=ax, color='blue', markersize=60) plt.savefig("mapa_oportunidad.png", dpi=150)
CRS entrada: EPSG:4326 (WGS84) → reproyectado a EPSG:25830 (UTM zone 30N) para cálculos métricos precisos. Geometrías validadas: 21/21 válidas (is_valid = True). I/O: GeoPackage + Arrow.
💡 Insights del Análisis Geoespacial

Chamartín: máxima prioridad (Score 96)

2.847 comercios activos, 0% cobertura actual y alta renta media. El sjoin_nearest confirma que está a >3.2 km del hub más cercano. ROI estimado nuevo hub: 14 meses.

Ciudad Lineal tiene el mayor volumen de comercios

3.102 puntos de pickup potenciales. La cobertura del Hub Este sólo alcanza el 38% del distrito. El overlay intersection revela una zona noreste sin cubrir de 8.3 km².

Efecto buffer solapado en Centro-Salamanca-Retiro

Los 3 hubs centrales tienen cobertura superpuesta en 4.2 km². El dissolve + difference muestra que ~22% del área es redundante. Redistribuir 1 hub liberaría capacidad para Fuencarral.

Próximos pasos recomendados

  • Abrir Hub Chamartín (Q3 2026) — Av. Concha Espina área
  • Abrir Hub Hortaleza/Fuencarral (Q3 2026) — compartido
  • Evaluar reubicación Hub Retiro → San Blas (Q4 2026)
  • Integrar datos tráfico OSM con sjoin para horarios punta
  • Añadir capa OpenStreetMap con contextily para presentación
Operaciones GeoPandas ejecutadas: read_file() to_crs(EPSG:25830) buffer(2000m) dissolve() overlay(intersection) sjoin_nearest() is_valid plot(choropleth) nlargest(5)