我试图在传单中显示多个图层,其中一个是 EPSG:27700 中的光栅。我设法充分覆盖这些图层的唯一方法是通过默认的 latlong 投影,这意味着对栅格进行重新投影,从而对其进行插值。我不能在这个项目中进行插值,所以我需要在 EPSG:27700 上工作。
如何向未投影的栅格显示附加图层?我曾尝试使用 CRS.Simple,因为我想在一个简单的笛卡尔平面中显示所有内容,但没有成功。我不介意失去美丽的背景瓷砖。但是无论我尝试什么,我都无法让我的多边形(也是 EPSG27700)层(或任何 sp 对象)正确显示我未插值的栅格。我希望下面的 MWE 有效地说明了我的问题:
library("raster")
library("leaflet")
library("raster")
library("eurostat")
## get UKK spdf projected on british grid EPSG27700
europe <- get_eurostat_geospatial(resolution = 10, nuts_level = 1, year = 2021)
UK_spdf <- as_Spatial(europe[grepl("UK", europe$id),])
UK_spdf <- spTransform(UK_spdf, crs("+init=epsg:27700 +units=km +datum=WGS84"))
## build a dummy raster projected on EPSG:27700
r <- rasterize(UK_spdf, raster(UK_spdf, ncols = 100, nrows = 200))
## the two layers overlay well in default plots
plot(r) ; plot(UK_spdf, add=TRUE)
## raster can be loaded
leaflet() %>%
addRasterImage(r, project = FALSE) ## project=FALSE to prevent interpolation
## how to get the polygons right?
leaflet() %>%
addPolygons(data = UK_spdf)
## does not work...
## you need to have it in lat long:
leaflet() %>%
addTiles() %>%
addPolygons(data = spTransform(UK_spdf, crs("+proj=longlat"))) %>%
addRasterImage(r)
## but we don't want that, as it implies that our raster will have to be reprojected and therefore interpolated
## so how to have them together on a simple planar coordinate system?
crs <- leafletCRS(crsClass = "L.CRS.Simple") ## maybe simple projection can help?
leaflet(options = leafletOptions(crs = crs)) %>%
addPolygons(data = UK_spdf) %>%
addRasterImage(r, project = FALSE)
## does not work...
如果你不介意使用其他空间包,你可以试试这个:
library(eurostat)
library(sf)
library(dplyr)
library(stars) ## provides `st_rasterize`
library(leafem) ## provides `addStarsImage`
library(leaflet)
europe <- get_eurostat_geospatial(resolution = 10,
nuts_level = 1,
year = 2021)
UK <- europe |> filter(CNTR_CODE == 'UK')
r_27700 <- UK |>
select(geometry) |>
st_transform(27700) |>
st_rasterize(nx = 100, ny = 200)
crs_option <- leafletCRS(code = "EPSG:27700")
leaflet(options = leafletOptions(crs = crs_option)) |>
addStarsImage(r_27700, project = TRUE) |> ## let Leaflet handle (re)projection
addPolygons(data = UK)