Skip to contents

Patrones que aparecen una y otra vez trabajando con datos públicos argentinos.

Armar un extracto local reproducible

Los servidores públicos se caen, cambian de URL y a veces republican una capa con otro esquema. Si tu análisis tiene que correr igual el mes que viene, bajá una vez y trabajá contra el archivo.

extraer <- function(destino = "datos/extracto.gpkg") {
  if (file.exists(destino)) return(sf::read_sf(destino))

  capa <- argentum_read_wfs(
    "https://wms.ign.gob.ar/geoserver/ows",
    "ign:departamento",
    crs = 4326
  )
  sf::write_sf(capa, destino)
  capa
}

deptos <- extraer()

Guardá el .gpkg junto al código, no en .gitignore. Un extracto de unos pocos megabytes commiteado vale más que un script que dejó de correr.

Recortar a un área de estudio, del lado del servidor

area <- sf::read_sf("mi_area.gpkg")

localidades <- argentum_read_wfs(
  "https://wms.ign.gob.ar/geoserver/ows",
  "ign:localidad",
  bbox = area,          # el filtro viaja al servidor
  crs  = sf::st_crs(area)$epsg
)

# El bbox es un rectángulo; recortá a la forma real localmente
localidades <- sf::st_filter(localidades, area)

Los dos pasos son distintos y hacen falta los dos: el bbox reduce lo que viaja por la red, st_filter() recorta a la geometría exacta.

Figura con fondo del IGN

ign  <- "https://wms.ign.gob.ar/geoserver/ows"
area <- c(-58.6, -34.75, -58.3, -34.5)

fondo <- argentum_read_wms(ign, "ign:provincia", bbox = area, width = 1600)
datos <- argentum_read_wfs(ign, "ign:localidad", bbox = area, crs = 4326)

png("figura.png", width = 1600, height = 1200, res = 150)
terra::plotRGB(fondo)
plot(sf::st_geometry(datos), add = TRUE, pch = 21, bg = "#E4572E", cex = 1.2)
dev.off()

Relevar qué publica un organismo

Antes de comprometerte con una fuente, mirá qué hay:

inventario <- function(endpoint) {
  wfs <- tryCatch(argentum_layers(endpoint, "wfs"),
                  error = function(e) Argentum:::arg_empty_layers())
  wms <- tryCatch(argentum_layers(endpoint, "wms"),
                  error = function(e) Argentum:::arg_empty_layers())

  data.frame(
    servicio = c(rep("WFS", nrow(wfs)), rep("WMS", nrow(wms))),
    capa     = c(wfs$name, wms$name),
    titulo   = c(wfs$title, wms$title)
  )
}

inventario("https://wms.ign.gob.ar/geoserver/ows")

Buscar una capa por tema en varios organismos

Costoso —hace un GetCapabilities por organismo— pero cacheado, así que la segunda corrida es rápida.

buscar_capas <- function(patron, n = 10) {
  orgs <- utils::head(argentum_organizations(service = "wfs"), n)

  do.call(rbind, lapply(orgs$name, function(nombre) {
    capas <- tryCatch(argentum_layers(nombre), error = function(e) NULL)
    if (is.null(capas) || nrow(capas) == 0) return(NULL)

    hits <- grepl(patron, paste(capas$name, capas$title), ignore.case = TRUE)
    if (!any(hits)) return(NULL)

    data.frame(organismo = nombre, capas[hits, c("name", "title")])
  }))
}

buscar_capas("escuela|educaci")

Correr en un pipeline sin conexión estable

options(
  argentum.quiet     = TRUE,   # sin ruido en los logs
  argentum.timeout   = 90,     # servidores lentos
  argentum.max_tries = 5,      # más reintentos
  argentum.page_size = 1000,   # páginas chicas para servidores frágiles
  argentum.cache_ttl = Inf     # nunca revalidar dentro de la corrida
)

Verificar que una capa no cambió

huella <- function(x) {
  capas <- argentum_layers(x)
  vapply(capas$name, function(n) {
    paste(n, capas$crs[capas$name == n], capas$bbox[capas$name == n])
  }, character(1))
}

anterior <- readRDS("huella.rds")
actual   <- huella("https://wms.ign.gob.ar/geoserver/ows")

setdiff(actual, anterior)   # capas nuevas o modificadas
setdiff(anterior, actual)   # capas que desaparecieron

Vale la pena en cualquier proyecto que dependa de un servicio externo por más de un par de meses.