Datos de Embajadas y Consulados en la ciudad de Madrid

España
Madrid
Embajadas
Consulados
Autor/a
Afiliación

Mateo Anduig Alborch

Universidad de Valencia

Fecha de publicación

1 de abril de 2026

Input

Se ha obtenido un conjunto de datos del Catálogo Nacional de Datos Abiertos (datos.gob.es), accesible también a través del Portal de Datos Abiertos del Ayuntamiento de Madrid (datos.madrid.es) .

Esta base de datos recopila información oficial y detallada sobre las Embajadas y Consulados ubicados en la ciudad de Madrid que están publicados en el portal institucional del ayuntamiento.

El archivo seleccionado para este proyecto se ha descargado en formato CSV . El dataset contiene un registro por cada representación diplomática e incluye una amplia variedad de variables, destacando:

  • Información identificativa: Nombre de la embajada o consulado.
  • Localización postal: Dirección completa que incluye el tipo de vía, nombre de la calle, número, código postal, barrio y distrito municipal.
  • Información de contacto y accesibilidad: Teléfono, correo electrónico, página web oficial y recomendaciones sobre el transporte público más cercano (Metro, Bus, Cercanías).
  • Datos espaciales: Coordenadas geográficas exactas (Latitud y Longitud) de cada infraestructura, lo cual resulta fundamental para su posterior georreferenciación y representación cartográfica.

Descripción

Para comenzar la exploración, procedemos a la lectura del fichero CSV. Dado que es un dataset editado en España, los valores están separados por punto y coma (;). Para su procesamiento utilizaremos el metapaquete tidyverse para la manipulación de datos, sf para el manejo de la información espacial y leaflet para la futura visualización interactiva.

# Cargar las librerías necesarias
library(tidyverse)
library(sf)
library(leaflet)

# Leer el conjunto de datos con la codificación correcta
embajadas_raw <- read_delim("../data/2526020002/201000-0-embajadas-consulados.csv", 
                            delim = ";", 
                            locale = locale(encoding = "ISO-8859-1"))

# Comprobar las dimensiones y la estructura del dataset
glimpse(embajadas_raw)
Rows: 156
Columns: 32
$ PK                    <dbl> 7933, 10197947, 21112, 64260, 10197938, 7934, 79…
$ NOMBRE                <chr> "Consulado de Argentina", "Consulado de Belice",…
$ `DESCRIPCION-ENTIDAD` <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ HORARIO               <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ EQUIPAMIENTO          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ TRANSPORTE            <chr> "Metro: Alonso Martínez (líneas 4, 5 y 10).", "M…
$ DESCRIPCION           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ ACCESIBILIDAD         <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
$ `CONTENT-URL`         <chr> "http://www.madrid.es/sites/v/index.jsp?vgnextch…
$ `NOMBRE-VIA`          <chr> "FERNANDO EL SANTO", "TALAVERA", "AVIADOR LINDBE…
$ `CLASE-VIAL`          <chr> "CALLE", "CALLE", "CALLE", "CALLE", "PASEO", "CA…
$ `TIPO-NUM`            <chr> "V", "V", "V", "V", "V", "V", "V", "V", "V", "V"…
$ NUM                   <dbl> 15, 9, 3, 5, 18, 18, 8, 54, 194, 1, 35, 3, 10, 4…
$ PLANTA                <chr> "BAJA", NA, NA, "2º ENTREPLANTA", "6", "5", NA, …
$ PUERTA                <chr> NA, NA, NA, NA, "Izquierda", "C y D", NA, "Derec…
$ ESCALERAS             <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ ORIENTACION           <chr> NA, NA, NA, "y 7 pasaje", NA, NA, NA, NA, "Entra…
$ LOCALIDAD             <chr> "MADRID", "MADRID", "MADRID", "MADRID", "MADRID"…
$ PROVINCIA             <chr> "MADRID", "MADRID", "MADRID", "MADRID", "MADRID"…
$ `CODIGO-POSTAL`       <dbl> 28010, 28016, 28002, 28001, 28046, 28010, 28014,…
$ `COD-BARRIO`          <dbl> 4, 4, 1, 1, 1, 4, 3, 5, 5, 5, 1, 1, 4, 5, NA, 5,…
$ BARRIO                <chr> "ALMAGRO", "HISPANOAMERICA", "EL VISO", "RECOLET…
$ `COD-DISTRITO`        <dbl> 7, 5, 5, 4, 4, 7, 1, 7, 5, 7, 4, 4, 1, 3, NA, 7,…
$ DISTRITO              <chr> "CHAMBERI", "CHAMARTIN", "CHAMARTIN", "SALAMANCA…
$ `COORDENADA-X`        <dbl> 441245, 442258, 442360, 441675, 441556, 441120, …
$ `COORDENADA-Y`        <dbl> 4475517, 4478302, 4477088, 4475445, 4475560, 447…
$ LATITUD               <chr> "4.042.822.303.456.550", "4.045.337.683.215.630"…
$ LONGITUD              <chr> "-3.692.664.355.978.790", "-36.809.717.814.324.7…
$ TELEFONO              <chr> "914 025 115", "913 520 419", "91 326 50 28", "9…
$ FAX                   <chr> "913 091 996", "917 157 638", "91 326 50 16", "9…
$ EMAIL                 <chr> "cmadr@mrecic.gov.ar", "brasildetoledo@terra.es"…
$ TIPO                  <chr> "/contenido/entidadesYorganismos/OrganismosInter…

Al inspeccionar el resultado de la función glimpse(), detectamos que el conjunto de datos original está compuesto por varias decenas de variables, muchas de las cuales están orientadas a la estructura interna de la web del Ayuntamiento (como CONTENT-URL, PK, etc.) o se encuentran mayoritariamente vacías (como EQUIPAMIENTO o HORARIO).

Sin embargo, las variables que realmente nos interesan para nuestro objetivo de georreferenciación han sido cargadas correctamente: * NOMBRE: Identifica claramente a cada país. * LATITUD y LONGITUD: Se han importado como variables numéricas (gracias a que usan el punto . como separador decimal en el CSV original), lo que facilitará enormemente su transformación en geometrías espaciales. * Variables de localización y contacto: BARRIO, NOMBRE-VIA, TELEFONO y TRANSPORTE contienen cadenas de texto útiles para la caracterización de cada punto.

Tratamiento

Una vez cargados los datos, procedemos a la limpieza y transformación espacial del dataset. Nuestro objetivo es conservar únicamente las variables esenciales, clasificar cada punto según su naturaleza diplomática y unificar la información postal.

El conjunto de datos original del Ayuntamiento de Madrid provee las coordenadas en dos sistemas: proyectadas (X, Y en ETRS89) y geográficas (Latitud, Longitud). Dado que la librería leaflet es una herramienta web, exige por defecto que los datos espaciales se presenten en el sistema de referencia geodésico global WGS84 (EPSG: 4326). Al disponer ya de las variables LATITUD y LONGITUD en este formato, nos ahorramos tener que aplicar conversiones matemáticas complejas para reproyectar geometrías (como el uso de la función st_transform()). Simplemente indicaremos a la función st_as_sf() que utilice estas dos columnas y les asigne el CRS 4326.

Durante la fase de exploración inicial, se detectó la ausencia de coordenadas (valores nulos) en el registro correspondiente al Consulado de Islandia. En lugar de eliminar este registro, se ha procedido a realizar una imputación manual de datos consultando fuentes externas. Se ha verificado que dicho consulado se ubica en la Calle Pollensa, 2 (Las Rozas, Madrid), asignándole las coordenadas geográficas correspondientes (Lat: 40.5052, Lon: -3.8856) directamente mediante código.

Finalmente, para mejorar la visualización en el mapa interactivo, creamos una nueva variable categórica denominada TIPO. Utilizando la función str_detect() de la librería stringr, el código lee el texto de la columna NOMBRE y detecta automáticamente si contiene las palabras “Embajada” o “Consulado”. Además, concatenamos las distintas variables de localización (vía, número y barrio) en una única columna llamada DIRECCION.

El flujo de trabajo aplicado es el siguiente:

# PASO 1: Limpieza inicial y corrección del formato de las coordenadas convirtiendolas en numericas 
embajadas_limpio <- embajadas_raw %>%
  select(NOMBRE, LATITUD, LONGITUD, `NOMBRE-VIA`, NUM, BARRIO, TELEFONO, TRANSPORTE) %>%
  mutate(
    # Quitamos los puntos falsos de los miles SIN borrar ningún número
    lat_sin_puntos = str_remove_all(LATITUD, "\\."),
    lon_sin_puntos = str_remove_all(LONGITUD, "\\."),
    
    # Ponemos el punto decimal real después de los dos primeros dígitos 
    LATITUD = as.numeric(paste0(str_sub(lat_sin_puntos, 1, 2), ".", str_sub(lat_sin_puntos, 3))),
    LONGITUD = as.numeric(paste0(str_sub(lon_sin_puntos, 1, 2), ".", str_sub(lon_sin_puntos, 3))),
    
    # Aseguramos que el número de calle sea texto para evitar errores luego
    NUM = as.character(NUM)
  ) %>%
  # Limpiamos las columnas temporales
  select(-lat_sin_puntos, -lon_sin_puntos)


# PASO 2: Imputación manual de Consulado de Islandia 
embajadas_imputado <- embajadas_limpio %>%
  mutate(
    LATITUD = ifelse(str_detect(str_to_lower(NOMBRE), "islandia"), 40.5052, LATITUD),
    LONGITUD = ifelse(str_detect(str_to_lower(NOMBRE), "islandia"), -3.8856, LONGITUD)
  )



# PASO 3: Filtrado final, nuevas variables y conversión a sf
embajadas_sf <- embajadas_imputado %>%
  mutate(
    # Clasificación Embajada/Consulado
    TIPO = case_when(
      str_detect(str_to_lower(NOMBRE), "embajada") ~ "Embajada",
      str_detect(str_to_lower(NOMBRE), "consulado") ~ "Consulado",
      TRUE ~ "Otro"
    ),
    # Unificación de dirección (evitando que el barrio salga "NA")
    BARRIO = ifelse(is.na(BARRIO), "", BARRIO),
    DIRECCION = paste(`NOMBRE-VIA`, NUM, "-", BARRIO)
  ) %>%
  # Limpieza de columnas sobrantes
  select(-`NOMBRE-VIA`, -NUM, -BARRIO) %>%
  # Conversión espacial a WGS84
  st_as_sf(coords = c("LONGITUD", "LATITUD"), crs = 4326)

# Inspeccionamos la estructura final
glimpse(embajadas_sf)
Rows: 156
Columns: 6
$ NOMBRE     <chr> "Consulado de Argentina", "Consulado de Belice", "Consulado…
$ TELEFONO   <chr> "914 025 115", "913 520 419", "91 326 50 28", "917 021 220"…
$ TRANSPORTE <chr> "Metro: Alonso Martínez (líneas 4, 5 y 10).", "Metro: Conch…
$ TIPO       <chr> "Consulado", "Consulado", "Consulado", "Consulado", "Consul…
$ DIRECCION  <chr> "FERNANDO EL SANTO 15 - ALMAGRO", "TALAVERA 9 - HISPANOAMER…
$ geometry   <POINT [°]> POINT (-3.692664 40.42822), POINT (-3.680972 40.45338…

Output

A continuación, se presenta un mapa interactivo generado con la librería leaflet. En él se representan las delegaciones diplomáticas , diferenciando visualmente las Embajadas de los Consulados.

Al pasar el cursor sobre cualquier punto del mapa, se mostrará dinámicamente el nombre de la entidad. Adicionalmente, al hacer clic sobre el marcador, el usuario podrá desplegar una ventana emergente (pop-up) que contiene información enriquecida y unificada: la dirección exacta, el teléfono de contacto y las alternativas de transporte público más recomendadas.

# 1. Definimos una paleta de colores categórica según el TIPO de entidad
paleta_colores <- colorFactor(
  palette = c("red", "blue"), 
  domain = embajadas_sf$TIPO
)

# 2. Renderizamos el mapa interactivo con Leaflet
leaflet(data = embajadas_sf) %>%
    addTiles() %>% 
# Añadimos los puntos
  addCircleMarkers(
    radius = 6,
    color = ~paleta_colores(TIPO),
    stroke = FALSE,
    fillOpacity = 0.8,
    
    # Etiqueta rápida al pasar el ratón (Hover)
    label = ~NOMBRE, 
    
    # Ventana de información al hacer clic (usamos HTML para formatear el texto)
    popup = ~paste0(
      "<b>", NOMBRE, "</b><br><br>",
      "<b> Dirección:</b> ", DIRECCION, "<br>",
      "<b> Teléfono:</b> ", ifelse(is.na(TELEFONO), "No disponible", TELEFONO), "<br>",
      "<b> Transporte:</b> ", ifelse(is.na(TRANSPORTE), "No disponible", TRANSPORTE)
    )
  ) %>%
  
  # Añadimos la leyenda explicativa en la esquina inferior derecha
  addLegend(
    position = "bottomright",
    pal = paleta_colores,
    values = ~TIPO,
    title = "Tipo de Entidad",
    opacity = 1
  )

Como conclusión a la visualización obtenida, el mapa interactivo revela una clara concentración espacial de las delegaciones diplomáticas en la almendra central de Madrid . La herramienta generada no solo facilita la localización exacta de estas entidades, sino que, gracias a la unificación de los datos de contacto y las alternativas de transporte, resulta de gran utilidad tanto a nivel ciudadano como para futuros análisis de geografía urbana.

Para asegurar la reproducibilidad del proyecto, se exporta el conjunto de datos final en formato GeoPackage (.gpkg). Este estándar garantiza la integridad de las geometrías y los atributos, facilitando su uso en futuros análisis espaciales.

El fichero generado con este procedimiento se puede descargar de aquí.



Proyecto de Innovación Educativa Emergente (PIEE-3898312)