Mejora de la accesibilidad a los datos sobre ruido urbano de Valencia

Datos abiertos
Análisis espacial
R
Autor/a
Afiliación

Ruth Da Rocha Ayala

Universidad de Valencia

Fecha de publicación

1 de abril de 2026

Input

Se han obtenido tres conjuntos de datos de ruido urbano en Valencia publicados por el Ayuntamiento de Valencia en su portal de datos abiertos. Estos datasets proporcionan información georreferenciada sobre los niveles de ruido en Valencia, incluyendo la localización de las zonas y un índice de intensidad acústica (1–5) medidos en distintos periodos (día, noche, 24h)

Además, se indica que el índice de ruido total está asociado a la molestia global. Representa un valor medio de los tres periodos día/tarde/noche dando mayor importancia a los niveles por la tarde y por la noche para ser periodos más sensibles a los niveles de ruido (año 2022).

A continuación, se presenta información adicional sobre los conjuntos de datos :

Última modificación: 20 de agosto de 2025 0:01

Licencia de uso: https://creativecommons.org/licenses/by/4.0/

Los datos se pueden exportar directamente en los formatos: CSV, JSON, Excel, GeoJSON, Shapefile, KML, FlatGeobuf, GPX, Parquet. También se pueden visualizar en un mapa interactivo.

En este caso, se han utilizado los archivos en formato CSV.

Descripción

Se detecta que existen datos para el ruido urbano en Valencia medidos en distintos periodos (dia, noche y 24h) pero que se encuentran separados en 3 dataframes distintos. Además, la estructura de las coordenadas no permite su uso directo como objeto espacial.

Tratamiento

1. Carga de las librerías y los conjuntos de datos

Cargamos las librerías necesarias:

Leemos los conjuntos de datos desde el portal de datos abiertos de Valencia:

options(timeout = 300)
url_noche <- "https://valencia.opendatasoft.com/api/explore/v2.1/catalog/datasets/mapa-soroll-nit-mapa-ruido-noche/exports/csv?lang=es&timezone=Europe%2FMadrid&use_labels=true&delimiter=%3B"
download.file(url_noche, destfile = "ruido_noche.csv", method = "libcurl")

options(timeout = 300)
url_data <- "https://valencia.opendatasoft.com/api/explore/v2.1/catalog/datasets/mapa-soroll-24h-mapa-ruido-24h/exports/csv?lang=es&timezone=Europe%2FBerlin&use_labels=true&delimiter=%3B"
download.file(url_data, destfile = "ruido1.csv", method = "libcurl")

options(timeout = 300)
url_dia <- "https://valencia.opendatasoft.com/api/explore/v2.1/catalog/datasets/mapa-soroll-dia-mapa-ruido-dia/exports/csv?lang=es&timezone=Europe%2FBerlin&use_labels=true&delimiter=%3B"
download.file(url_dia, destfile = "ruido_dia.csv", method = "libcurl")
ruido_noche <- read.csv2("../data/2526020011/ruido_noche.csv")

ruido1 <- read.csv2("../data/2526020011/ruido1.csv", stringsAsFactors = FALSE)

ruido_dia <- read.csv2("../data/2526020011/ruido_dia.csv")

2. Exploración del dataset (estructura, columnas, filas…)

Se trata de tres objetos data.frame con 51-53 observaciones y 4 variables:

class(ruido1)
[1] "data.frame"
class(ruido_dia)
[1] "data.frame"
class(ruido_noche)
[1] "data.frame"
dim(ruido1)
[1] 51  4
dim(ruido_dia)
[1] 53  4
dim(ruido_noche)
[1] 54  4
colnames(ruido1)
colnames(ruido_dia)
colnames(ruido_noche)

3. Columnas

Detectamos que los nombres y el orden de las columnas no coinciden, por tanto, renombramos y ordenamos las columnas de los tres datasets. También eliminamos las columnas innecesarias.

 ruido1 <- ruido1 %>%
  rename(
    nivel_ruido = 'Nivell...Nivel',
    id = gid,
    coords = geo_point_2d,
    geo_shape = geo_shape
  )
ruido_dia <- ruido_dia %>%
  rename(
    nivel_ruido = 'Nivell...Nivel',
    id = objectid,
    coords = geo_point_2d,
    geo_shape = geo_shape
  )
ruido_noche <- ruido_noche %>%
  rename(
    nivel_ruido = 'Nivell...Nivel',
    id = gid,
    coords = geo_point_2d,
    geo_shape = geo_shape
  )

ruido1 <- ruido1 %>% select(id, nivel_ruido, geo_shape, coords)
ruido_dia <- ruido_dia %>% select(id, nivel_ruido, geo_shape, coords)
ruido_noche <- ruido_noche %>% select(id, nivel_ruido, geo_shape, coords)

4. Separación de coordenadas

Transformamos las coordenadas en variables numéricas separadas (latitud y longitud), de forma que se facilite su uso en análisis y visualización espacial.

ruido1 <- ruido1 %>%
  separate(coords, into = c("lat", "lon"), sep = ",", convert = TRUE)

ruido_dia <- ruido_dia %>%
  separate(coords, into = c("lat", "lon"), sep = ",", convert = TRUE)

ruido_noche <- ruido_noche %>%
  separate(coords, into = c("lat", "lon"), sep = ",", convert = TRUE)

5. Categorizar el ruido

Añadimos una variable categórica (categoria_ruido) que permite interpretar los niveles de ruido de forma más intuitiva, facilitando el uso del dataset por parte de usuarios no expertos. Los valores van de 1 a 4 aprox., por lo que se clasifica en : bajo, medio, alto.

ruido_final <- ruido1 %>%
  mutate(
    categoria_ruido = case_when(
      nivel_ruido <= 2 ~ "bajo",
      nivel_ruido == 3 ~ "medio",
      nivel_ruido >= 4 ~ "alto"
    ))

6. Unificación de los datasets

Añadimos la variable “periodo” y unificamos los datasets en un único dataset que incluirá toda la información útil.

ruido1$periodo <- "24h"
ruido_dia$periodo <- "dia"
ruido_noche$periodo <- "noche"

df <- bind_rows(ruido1, ruido_dia, ruido_noche)

7. Corrección de coordenadas

df_final <- df %>%
  distinct(lat, lon, .keep_all = TRUE)

8. Conversión a sf

Se transforma la geometría a tipo POINT mediante centroides, reduciendo la complejidad geométrica del dataset original. Esto permite tratar los datos como información espacial.

sf_data <- st_as_sf(df_final, coords = c("lon", "lat"), crs = 4326)

9. Agrupación de las observaciones por ubicación

df_resumen <- sf_data %>%
  group_by(id) %>%
  summarise(
    ruido_dia = first(nivel_ruido[periodo == "dia"], default = NA),
    ruido_noche = first(nivel_ruido[periodo == "noche"], default = NA),
    ruido_24h = first(nivel_ruido[periodo == "24h"], default = NA),
    geometry = geometry[1], 
    .groups = "drop"
  ) %>%
  st_as_sf() 

10. Barrios

La variable barrio se ha obtenido a partir de OSM. De esta forma se indica a qué barrios de Valencia pertenecen las coordenadas. Esta informacion facilita el análisis sobre qué zonas de la ciudad son más ruidosas.

options(timeout = 300)
query <- opq("Valencia, Spain") %>%
  add_osm_feature(key = "boundary", value = "administrative")
options(timeout = 300)
osm <- osmdata_sf(query)
barrios <- osm$osm_multipolygons
barrios <- barrios %>%
  filter(admin_level == "10") %>%
  select(name, geometry)
barrios <- st_transform(barrios, st_crs(df_resumen))

df_2 <- st_join(df_resumen, barrios)

11. Tipo de vía

La variable tipo_vía se ha construido a partir de la clasificación highway de OSM, agrupando las vías según su jerarquía funcional en tres categorías: primaria (alta capacidad), secundaria (conectividad intermedia) y residencial (tráfico local). Esto permite analizar la relación entre el tipo de vía y el ruido.

options(timeout = 300)
bb <- getbb("Valencia, Spain")
query_roads <- opq(bbox = bb, timeout = 25) %>%
  add_osm_feature(
    key = "highway",
    value = c("motorway", "trunk", "primary", "secondary", "tertiary", "residential")
  )
osm_roads <- osmdata_sf(query_roads)

roads <- osm_roads$osm_lines %>%
  select(highway, geometry) %>%
  filter(!is.na(highway))
roads <- st_transform(roads, st_crs(df_resumen))

idx <- st_nearest_feature(df_2, roads)
df_2$tipo_via <- roads$highway[idx]

df_2 <- df_2 %>%
  mutate(tipo_via = case_when(
    tipo_via %in% c("motorway", "trunk", "primary") ~ "principal",
    tipo_via %in% c("secondary", "tertiary") ~ "secundaria",
    tipo_via == "residential" ~ "residencial",
    TRUE ~ "otras"
  ))

12. Visualización

pal <- colorNumeric("YlOrRd", sf_data$ruido_24h, na.color = "transparent")
leaflet(df_resumen) %>%
  addTiles() %>%
  addCircleMarkers(
    radius = 5,
    color = ~pal(ruido_24h),
    stroke = FALSE,
    fillOpacity = 0.8,
    popup = ~paste(
      "Ruido día:", ruido_dia, "<br>",
      "Ruido noche:", ruido_noche, "<br>",
      "Ruido 24h:", ruido_24h
    )
  ) %>%
  addLegend(
    "bottomright",
    pal = pal,
    values = ~ruido_24h,
    title = "Nivel de ruido (24h)",
    labFormat = function(type, cuts, p) {
      paste0(round(cuts, 1))
    },
    opacity = 1
  )

El mapa interactivo realizado con leaflet nos permite observar fácilmente las zonas con mayor ruido urbano, que corresponden a los colores más fuertes.

Output

El resultado es un conjunto de datos limpio y estructurado, que permite trabajar con los datos de ruido urbano en Valencia de forma más eficiente. Este nuevo dataset mejora significativamente la accesibilidad respecto a las fuentes originales.

Formato: geopackage

Tipo de geometría: POINT

Sistema de referencia: EPSG:4326

Variables:

  • geometry
  • ruido_noche
  • ruido_dia
  • ruido_24h
  • barrio
  • tipo_via

En concreto, permite :

  • Visualizar la distribución del ruido en el espacio
  • Identificar áreas más tranquilas y áreas más ruidosas y localizar puntos críticos de contaminación
  • Comparar los niveles de ruido según el periodo

Esto es útil para ayudar a la toma de decisiones en gestión ambiental y movilidad.

Algunas posibles utilidades concretas son:

Evaluación del impacto del tráfico y la desigualdad ambiental. Relacionar las zonas ruidosas con la intensidad del tráfico e identificar vías problemáticas. Identificar qué barrios están más expuestos al ruido.

Apoyo a la planificación urbana. Ayudar a decidir dónde ubicar zonas residenciales, colegios, hospitales y también eventos como fiestas públicas. También puede ayudar a diseñar zonas de bajas emisiones o poco tráfico.

Análisis de contaminación nocturna y seguimiento de políticas públicas. Detectar áreas con exceso de ruido por ocio nocturno y evaluar el cumplimiento de normativas ácusticas. Analizar si determinadas medidas reducen el ruido.

Estudios de salud pública. Llevar a cabo estudios que relacionen el ruido con trastornos del sueño, estrés… e identificar zonas de riesgo para la población.

Generación de mapas. Por último, el dataframe sirve para la creación de mapas donde se observen los distintos puntos y niveles de ruido urbano en Valencia.

sf::st_write(df_2, "df_ruido_valencia.gpkg")

El/los fichero(s) generados con este procedimiento/técnica/metodología se puede(n) descargar de aquí.



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