Get boundaries of municipalities in Spain.
Source
CartoBase ANE (Atlas Nacional de España) provided by Instituto Geográfico Nacional (IGN), https://www.ign.es/web/ign/portal. Data are available from 2005 to the present.
Copyright: https://centrodedescargas.cnig.es/CentroDescargas/cartobase-ane
Always acknowledge authorship using the following statements:
When the original digital product is not modified or altered, use one of the following statements:
CartoBase ANE 2006-2024 CC-BY 4.0 ign.es.
CartoBase ANE 2006-2024 CC-BY 4.0 Instituto Geográfico Nacional.
When a new product is generated:
Obra derivada de CartoBase ANE 2006-2024 CC-BY 4.0 ign.es.
Data distributed through the sianedata data branch, see
https://github.com/rOpenSpain/mapSpain/tree/sianedata.
Arguments
- year
Character string or number. Release year. It must use format
YYYY(assuming end of year) orYYYY-MM-DD. Historical information starts as of 2005.- epsg
Character string or number. Projection of the map: 4-digit EPSG code. One of:
"4258": ETRS89."4326": WGS84."3035": ETRS89 / ETRS-LAEA."3857": Pseudo-Mercator.
- cache
Logical. Whether to cache downloaded files. Defaults to
TRUE. See Caching.- update_cache
Logical. If
TRUE, refreshes the cached file and forces a new download. Defaults toFALSE.- cache_dir
Character string. A path to a cache directory. See Caching.
- verbose
A logical value indicating whether to display informational messages.
- resolution
Character string or number. Resolution of the geospatial data. One of:
"10": 1:10 million."6.5": 1:6.5 million."3": 1:3 million.
- region
Optional. A vector of region names, NUTS or ISO codes (see
esp_dict_region_code()).- munic
Character string. A name or
regexexpression with the names of the required municipalities. UseNULLto return all municipalities.- moveCAN
A logical
TRUE/FALSEor a vector of coordinatesc(lat, lon). It places the Canary Islands close to Spain's mainland. Initial position can be adjusted using the vector of coordinates. See Displacing the Canary Islands inesp_move_can().- rawcols
Logical. If
TRUE, retains the raw columns of the resulting object as provided by IGN.
Value
An sf object.
Details
When using region you can use and mix names and NUTS codes (levels 1, 2 or
3), ISO codes (corresponding to level 2 or 3) or "cpro"
(see esp_codelist).
When calling a higher level, such as a province, Autonomous Community, Autonomous City or NUTS 1 region, all municipalities of that level are added.
Note
Although mapSpain supplies cartographically suitable datasets, a historical database of Spanish municipal boundaries is also available, offering higher-resolution geometries that may be more appropriate for GIS-oriented workflows:
Goerlich, F. J. & Pérez Vázquez, P. (2025). Base de datos histórica de contornos municipales de España -LAU2boundaries4Spain- [Data set]. Zenodo. doi:10.5281/zenodo.15345101 , https://www.uv.es/goerlich/Ivie/LAU2boundaries4Spain.html.
Caching
Functions that download data store files in cache_dir. When cache_dir
is NULL, they use the active package cache, which defaults to a temporary
directory. Set update_cache = TRUE to replace an existing cached file.
See Caching strategies in esp_set_cache_dir() to configure a
persistent cache.
See also
CartoBase ANE boundaries and utilities:
esp_get_capimun(),
esp_get_ccaa_siane(),
esp_get_countries_siane(),
esp_get_prov_siane(),
esp_get_spain_siane(),
esp_siane_bulk_download()
Municipality-level datasets:
esp_get_capimun(),
esp_get_munic()
Examples
# \donttest{
# Municipalities that have changed in the past: three snapshots.
munis2005 <- esp_get_munic_siane(year = 2005, rawcols = TRUE)
munis2015 <- esp_get_munic_siane(year = 2015, rawcols = TRUE)
munis2024 <- esp_get_munic_siane(year = 2024, rawcols = TRUE)
# Manipulate data.
library(dplyr)
#>
#> Attaching package: ‘dplyr’
#> The following objects are masked from ‘package:stats’:
#>
#> filter, lag
#> The following objects are masked from ‘package:base’:
#>
#> intersect, setdiff, setequal, union
allmunis_unique <- bind_rows(munis2005, munis2015, munis2024) |>
distinct()
id_all <- allmunis_unique |>
sf::st_drop_geometry() |>
group_by(id_ine, name) |>
count() |>
ungroup() |>
arrange(desc(n)) |>
slice_head(n = 1) |>
glimpse()
#> Rows: 1
#> Columns: 3
#> $ id_ine <chr> "18020"
#> $ name <chr> "Arenas del Rey"
#> $ n <int> 3
library(ggplot2)
allmunis_unique |>
filter(id_ine == id_all$id_ine) |>
ggplot() +
geom_sf(aes(fill = as.factor(fecha_alta)),
alpha = 0.7,
show.legend = FALSE
) +
scale_fill_viridis_d() +
facet_wrap(~fecha_alta) +
labs(
title = id_all$name,
subtitle = "Boundary changes over time",
fill = ""
)
# }
