我想使用 WMS 在 {ggspatial} 中添加底图。然而,我找不到路。我可以使用 {terra} 读取 WMS,但不能使用 {stars},但是,当传递到
annotation_spatial
时会引发错误。
library(ggspatial)
library(sf)
library(terra)
library(stars)
library(ggplot2)
points <- data.frame(
id = 1:5,
x = (436:440)*1e3,
y = (4670:4674)*1e3
) |>
st_as_sf(coords = c("x", "y"), crs = 25831)
box <- st_bbox(points)
wms <- paste0("https://geoserveis.icgc.cat/servei/catalunya/orto-territorial/wms?REQUEST=GetMap&VERSION=1.3.0&SERVICE=WMS&CRS=EPSG:25831&BBOX=",box[1],",",box[2],",",box[3],",",box[4],"&WIDTH=520&HEIGHT=520&LAYERS=ortofoto_color_vigent&STYLES=&FORMAT=JPEG&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&EXCEPTION=INIMAGE")
orto <- rast(wms)
plotRGB(orto) # This plots the ortophoto correctly
ggplot() +
annotation_spatial(orto) +
layer_spatial(points)
#> Error in `layer_spatial.SpatRaster()`:
#> ! Problem while converting geom to grob.
#> ℹ Error occurred in the 1st layer.
#> Caused by error:
#> ! vector::reserve
您可以使用
terra::geom_spatraster_rgb()
代替。您还可以使用 geom_sf()
来表示 sf 对象。 tidyterra
的默认行为是简化/重新采样输出以加快绘图速度。您可以使用 maxcell =
调整分辨率。您可以设置 maxcell = Inf
返回所有单元格,但我没有在您的示例 SpatRaster 上进行测试,因为它为 1.152922e+18 个单元格!
library(ggspatial)
library(ggplot2)
library(tidyterra)
ggplot() +
geom_spatraster_rgb(data = orto, maxcell = 1e6) +
layer_spatial(points) +
theme_minimal()
ggplot() +
geom_spatraster_rgb(data = orto, maxcell = 1e6) +
geom_sf(data = points) +
theme_minimal()