传单中的栅格和多边形,没有栅格插值

问题描述 投票:0回答:1

我试图在传单中显示多个图层,其中一个是 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...
r leaflet r-raster sp r-mapview
1个回答
0
投票

如果你不介意使用其他空间包,你可以试试这个:

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)
© www.soinside.com 2019 - 2024. All rights reserved.