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 desaparecieronVale la pena en cualquier proyecto que dependa de un servicio externo por más de un par de meses.
