Skip to contents

¿Para qué querría una imagen?

Si WFS te da geometrías de verdad, ¿por qué pedir un dibujo?

Tres razones, y con datos argentinos aparecen todo el tiempo.

Hay capas que solo existen como WMS. Imágenes satelitales, ortofotos, cartas históricas escaneadas, sombreado de relieve. No tienen equivalente vectorial: el organismo tiene un ráster y WMS es cómo lo comparte.

Hay capas WFS que no valen el peso. Una capa nacional de parcelas son millones de polígonos. Si solo la necesitás como fondo visual, bajarte la geometría es tirar recursos: pedile al servidor que la dibuje.

La cartografía del organismo tiene información. Un servidor de catastro renderiza las parcelas con la simbología que usa su propio personal. Reproducir eso desde la geometría cruda es trabajo que no necesitás hacer.

El argumento que no podés omitir

WMS no tiene el concepto de “la capa entera”. Cada request renderiza un rectángulo fijo, así que bbox es obligatorio:

ign <- "https://wms.ign.gob.ar/geoserver/ows"

r <- argentum_read_wms(
  ign,
  layer = "ign:provincia",
  bbox  = c(-59, -35, -57, -34),
  width = 1000
)

r

Una nota sobre el mapa base del IGN: la capa oficial capabaseargenmap ahora responde HTTP 403 (“Bloqueado: uso de WMS en mapa base”) a los GetMap de clientes genéricos - el IGN la reserva para sus propias aplicaciones. Por eso los ejemplos usan capas temáticas, que siguen abiertas.

Arriba solo pasamos width; height sale de la relación de aspecto del bounding box, así que el mapa no queda deformado. Pasá los dos si querés un lienzo específico, o solo height si lo que te limita es el alto.

La columna bbox de argentum_layers() te da una extensión de partida cuando no conocés la huella de la capa:

capas <- argentum_layers(ign, service = "wms")
capas[capas$name == "ign:provincia", "bbox"]

Combinar ráster y vector

Acá está el retorno. El ráster vuelve con el CRS asignado, así que se compone directamente con cualquier cosa que hayas leído por WFS:

area <- c(-59, -35, -57, -34)

fondo  <- argentum_read_wms(ign, "ign:provincia", bbox = area, width = 1200)
limites <- argentum_read_wfs(ign, "ign:provincia", bbox = area, crs = 4326)

terra::plotRGB(fondo)
plot(sf::st_geometry(limites), add = TRUE, border = "white", lwd = 2)

Como argentum_read_wms() devuelve un SpatRaster común, todo terra funciona: crop(), mask(), project(), writeRaster().

Apilar capas en un solo pedido

Pasar varios nombres de capa arma un compuesto del lado del servidor, de abajo hacia arriba. Un request en vez de varios, y el servidor se encarga de la mezcla:

argentum_read_wms(
  ign,
  layer = c("ign:provincia", "ign:limite_politico"),
  bbox  = area
)

Leyendas

Un mapa renderizado sin su leyenda suele ser ilegible. GetLegendGraphic devuelve la simbología que usó el servidor:

leyenda <- argentum_wms_legend(ign, "ign:provincia")
terra::plotRGB(leyenda)

La leyenda es una imagen, no un mapa, así que no lleva CRS.

Elegir el formato

"image/png" es el default y conserva transparencia, que necesitás para superponer. "image/jpeg" pesa bastante menos en imágenes fotográficas pero no puede ser transparente. "image/tiff" conviene si vas a analizar los píxeles en vez de mostrarlos —aunque la mayoría de los servidores igual renderiza a RGB de 8 bits, así que no reemplaza a los datos originales.

argentum_read_wms(ign, "alguna_ortofoto", bbox = area, format = "image/jpeg",
                  transparent = FALSE)

Sobre el orden de los ejes

WMS 1.3.0 cambió el orden de las coordenadas: para los CRS cuya definición oficial es latitud primero, el parámetro BBOX también va latitud primero. WMS 1.1.1 siempre fue longitud primero.

Esto genera muchísimos dolores de cabeza, porque equivocarse no da error: da un mapa del lugar equivocado, o del océano.

Argentum hace la inversión según la versión que el servidor efectivamente negoció. Incluye las fajas Gauss-Krüger argentinas (EPSG:22171 a 22175), que están definidas con el norte primero y por lo tanto están afectadas — un caso que la mayoría de los clientes genéricos resuelve mal.

En principio no deberías tener que pensarlo. Si igual te sale un mapa invertido, forzá el protocolo viejo y comparalo:

argentum_capabilities(ign, "wms", version = "1.1.1")