Apéndice A — Tipos de ficheros geoespaciales

A.1 Introducción

Durante el curso trabajaremos con diferentes tipos de datos espaciales, los cuales se pueden almacenar y ofrecer en formatos muy diversos. Si bien es cierto que los formatos más habituales son Shapefile (.shp) y GeoPackage (.gpkg), existen muchos otros:

En esta sección se facilitan algunos mecanismos para obtener, de diversas fuentes de información, ficheros (con distintos formatos) que contienen información espacial.

A.2 Open Data (geo)portals

A continuación se ofrece una lista de enlaces a (geo)portales de datos abiertos que, evidentemente, es susceptible de ser ampliada:

Info

Si hay algún repositorio que echas en falta en este listado, envíame un correo a virgilio.perez@uv.es y lo incluyo.

A.3 Formatos de ficheros geoespaciales

Una buena forma de comenzar este bloque, además de cargar las librerías necesarias, es preguntarse ¿qué ficheros es capaz de leer el paquete sf? Para saberlo, podemos ejecutar la función sf::st_drivers().

library(tidyverse)
library(sf)
library(mapSpain)
library(leaflet)
library(leaflet.extras)
library(kableExtra)

options(scipen = 999) # para evitar notación científica en los plots

spain_mun <- mapSpain::esp_get_munic_siane(epsg = 4326, moveCAN = F)
(drivers <- as.data.frame(sf::st_drivers()))

A.3.1 GeoJSON

Uno de los formatos abiertos más utilizados para distribuir datos geográficos es el GeoJSON. Este formato, al igual que el JSON (muy utilizado en sitios web), es un archivo de texto que también guarda las coordenadas de los puntos/vértices de las entidades que se representan. Al ser un archivo de texto, en geometrías complejas (con muchos vértices) su tamaño será mucho mayor que cuando los datos se guardan en formatos binarios. A continuación, se muestra un ejemplo (fichero disponible aquí, ofrecido por la Diputación de Alicante:

path <- "data/centros-culturales.geojson"

datos <- sf::st_read(path, quiet = T)
class(datos)
[1] "sf"         "data.frame"
st_crs(datos)
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
leaflet(datos) %>%
  addTiles() %>%
  addCircleMarkers(radius = 1, label = ~paste0(CC_DENOMINACION," - ", CC_NUCLEO))

A.3.2 GeoPackage

Otro formato abierto que ha tomado fuerza en la comunidad de usuarios de SIG es el GeoPackage (terminación de archivos en .gpkg). Este es un archivo binario (es un contenedor de la base de datos SQLite) que tiene la gran ventaja de poder contener tanto datos vectoriales como raster e inclusive tablas de metadatos.

En este ejemplo se utiliza un conjunto de datos obtenido de aquí, que contiene el directorio de alojamientos turísticos colectivos (ALOJATUR) de Canarias:

url <- "https://datos.canarias.es/catalogos/estadisticas/dataset/7ce03361-fd0f-498a-9173-a933be0f30a5/resource/c1687628-6d8a-42ab-9cde-9d6e6ba00dce/download/alojatur_2023.gpkg"

# opción 1
datos <- sf::st_read(url, quiet = T) # importamos directamente desde internet

# opción 2
datos2 <- sf::st_read("data/alojatur_2023.gpkg", quiet = T) # descargamos y abrimos

ggplot() +
  geom_sf(data = spain_mun %>% filter(codauto == "05"), fill = "#F0DCAD", color="transparent") +
  geom_sf(data = datos, aes(color=cod_categor)) +
  labs(title = "Directorio de Alojamientos Turísticos Colectivos (ALOJATUR)",
       subtitle = "Canarias, a 01/01/2023") +
  guides(color = guide_legend(title = "Categoría (núm. estrellas)")) +
  theme(panel.grid.major = element_line(color = gray(.5), linetype = "dashed", size = 0.5),
        panel.background = element_rect(fill = "aliceblue"),
        legend.position = "bottom",
        legend.direction = "horizontal",
        legend.title.position = "top",
        legend.title = element_text(hjust = 0.5))

A.3.3 KML

El Keyhole Markup Language (.kml) es un tipo de formato abierto originalmente utilizado para desplegar y guardar datos en Google Earth pero que se ha vuelto común entre los usuarios de datos geográficos de otras plataformas. El formato se utiliza para guardar datos vectoriales pero también puede contener, en archivos con terminación .kmz, imágenes sobrepuestas, iconos y otros elementos.

En este caso visualizaremos los puntos wifi públicos distribuidos por la ciudad de Valencia, obtenidos de aquí:

url <- "https://valencia.opendatasoft.com/api/explore/v2.1/catalog/datasets/punts-wifi-puntos-wifi/exports/kml?lang=es&timezone=Europe%2FBerlin"

datos <- sf::st_read(url, quiet = T)
datos2 <- sf::st_read("data/punts-wifi-puntos-wifi.kml", quiet = T)

head(datos)
leaflet(datos) %>%
  addProviderTiles("Esri.WorldImagery") %>%
  addMarkers(clusterOptions = markerClusterOptions())

Probemos ahora con un fichero KMZ, obtenido de aquí:

datos <- sf::st_read("data/inst_deportivas.kmz")
Pregunta

¿Qué ocurre? ¿Qué podríamos hacer?

datos <- sf::st_read("data/inst_deportivas.kml", quiet = T)

leaflet(datos) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addMarkers(label = ~Name)

A.3.4 GeoTIFF

En el caso de los datos raster, existe una gran variedad de archivos capaces de almacenarlos. Uno de los más populares es el GeoTIFF, una modificación al popular archivo de imágenes TIFF, pero que le permite guardar datos con coordenadas geográficas. Normalmente el archivo con terminación .tif debe de acompañarse (aunque no siempre es así) con un archivo del mismo nombre pero con terminación .tfw (world file) que le da la referencia geográfica al raster. Este tipo de ficheros son adecuados para archivar e imprimir imágenes y gráficos de alta resolución, aunque su elevado volumen limita su utilización.

En este caso mostraremos el mapa de la Península Ibérica y Baleares a escala 1:1250000 para el año 2022 (125 Mb), obtenido del Centro Nacional de Información Geográfica.

datos <- sf::st_read("data/ME1250_Peninsula_2022.tif")
datos <- terra::rast("data/ME1250_Peninsula_2022.tif")
terra::plot(datos)

Ahora veremos otro ejemplo en el que el fichero .tif sí que viene acompañado de un fichero .tfw.

datos <- terra::rast("data/SIANE_CARTO_BASE_E_RASTER/elae_2k5_orog_gebco08_r_36w12n59e77n_20100927.tif")
terra::plot(datos)

A.3.5 NetCDF

En cuanto a formatos abiertos para datos raster, el más utilizado, especialmente para datos climáticos, es el netCDF (terminación de archivos en .nc). Este formato es sumamente ágil para guardar todo tipo de datos y tiene muchas ventajas para el procesamiento en herramientas gratuitas. Dependiendo de la fuente de los datos, estos archivos pueden llegar a pesar teras (Tb), por lo que su manipulación puede requerir de equipos informáticos potentes.

A.3.6 WebServices

Los estándares de servicios web para datos geográficos más populares actualmente son los WFS, WMS y WMTS. Podemos acceder a estos datos a través de una URL que puede integrarse tanto en sitios web como en programas de SIG para desplegar o descargar los datos. Muchos de los portales de Infraestructura de Datos Espaciales (IDEs) de gobiernos e instituciones públicas ofrecen información geoespacial de este modo.

  • El Web Feature Service (WFS) es un protocolo que proporciona datos vectoriales y que, dependiendo del programa en que se estén desplegando, permite guardar localmente los datos en cualquiera de los formatos para vectores que se mencionaron anteriormente.

  • El Web Map Service (WMS) sirve datos en mapas de bits (imágenes) y, a diferencia del WFS, no pueden descargarse los datos originales (con los que han sido generadas las imágenes).

  • El Web Map Tile Service (WMTS) es similar al WMS, puesto que también sirve para solicitar imágenes de mapas geográficos. Sin embargo, WMTS entrega los datos en forma de mosaicos (tiles), lo que hace que el servicio sea mucho más eficiente para mapas grandes o de alta resolución.

Veamos, a continuación, un ejemplo de cada caso.

A.3.6.1 WFS

En esta ocasión, los datos que vamos a obtener y visualizar hacen referencia a los centros en los que se realizan exámenes de la Junta Qualificadora de Coneixements de Valencià (JQCV), obtenidos de aquí:

url <- "https://terramapas.icv.gva.es/0105_Delimitaciones?service=wfs&request=getcapabilities"

datos <- sf::st_read(url)
Multiple layers are present in data source https://terramapas.icv.gva.es/0105_Delimitaciones?service=wfs&request=getcapabilities, reading layer `ms:ICV.Municipios'.
Use `st_layers' to list all layer names and their type in a data source.
Set the `layer' argument in `st_read' to read a particular layer.
Warning in CPL_read_ogr(dsn, layer, query, as.character(options),
quiet, : automatically selected the first layer in a data source
containing more than one.
Reading layer `ms:ICV.Municipios' from data source 
  `https://terramapas.icv.gva.es/0105_Delimitaciones?service=wfs&request=getcapabilities' 
  using driver `WFS'
Simple feature collection with 542 features and 15 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 626576.4 ymin: 4190817 xmax: 815520.5 ymax: 4519161
Projected CRS: ETRS89 / UTM zone 30N
capas <- sf::st_layers(url)
class(capas)
[1] "sf_layers"  "data.frame"
capas$name
[1] "ms:ICV.Municipios"        "ms:ICV.Comarcas"         
[3] "ms:ICV.Provincias"        "ms:ICV.ComunidadAutonoma"
comarcas <- sf::st_read(url, layer = "ms:ICV.Comarcas")
Reading layer `ms:ICV.Comarcas' from data source 
  `https://terramapas.icv.gva.es/0105_Delimitaciones?service=wfs&request=getcapabilities' 
  using driver `WFS'
Simple feature collection with 33 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 626576.4 ymin: 4190817 xmax: 815520.5 ymax: 4519161
Projected CRS: ETRS89 / UTM zone 30N
sf::st_geometry_type(comarcas)
sf::st_crs(comarcas)
comarcas_wgs84 <- sf::st_transform(comarcas,crs=4326)
leaflet(comarcas_wgs84) %>%
  addTiles() %>%
  addPolygons(label = ~comarca)

A.3.6.2 WMS

url <- "https://terramapas.icv.gva.es/0105_Delimitaciones?service=wms&request=getcapabilities"
datos <- sf::st_read(url)
url <- "https://terramapas.icv.gva.es/0105_Delimitaciones?service=wms&request=getcapabilities"

m <- leaflet() %>%
  addProviderTiles("CartoDB.Positron") %>%
  setView(lat=39.47776, lng=-0.34374, zoom = 7) 

m %>% addWMSTiles(baseUrl = url,
                  layers = "ICV.Comarcas",
                  options = WMSTileOptions(transparent = TRUE,
                                           format = "image/png"))

A.3.7 GML

Geography Markup Language (Lenguaje de Marcado Geográfico) es un sublenguaje de XML descrito como una gramática en XML Schema para el modelaje, transporte y almacenamiento de información geográfica. Su importancia radica en que a nivel informático se constituye como una lengua franca para el manejo y trasvase de información entre los diferentes software que hacen uso de este tipo de datos, como los Sistemas de Información Geográfica.

En esta ocasión, obtenemos y representamos las ubicaciones de las electrolineras de Bilbao (información extraída de aquí:

path <- "data/electrolineras.gml"
datos <- sf::st_read(path)
Reading layer `feature' from data source 
  `C:\Users\scorp\OneDrive - Universitat de València\01 PROFESOR\01 Docencia\01 Curso 2023 2024\01 BIA - Datos espaciales\02 Libro\data\electrolineras.gml' 
  using driver `GML'
Simple feature collection with 45 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -2.960322 ymin: 43.24169 xmax: -2.903115 ymax: 43.27958
Geodetic CRS:  WGS 84
leaflet(datos) %>%
  addProviderTiles("Esri.WorldStreetMap") %>%
  addCircleMarkers(radius = 3, color = "#171C7C")