¿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
)
rUna 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")