光栅图像似乎使用 R 的传单进行了移动

Raster image seems to be shifted using leaflet for R

我想使用 R 中的传单包绘制一些空间数据,但是生成的光栅图像与参考网格相比似乎发生了偏移。我怀疑地图投影问题,但我不是该主题的专家,因此将不胜感激。

这是绘制地图的最小代码:

library(leaflet)
library(sp)
library(raster)

set.seed(111)

# create dummy data -rectangular grid with random values
m = 10
n = 10
x = seq(45,48,length.out = m)
y = seq(15,18,length.out = n)
X = matrix(rep(x, each = n), nrow = n)
Y = matrix(rep(y, m), nrow = n)

# collector dataframe
points = data.frame(value = rnorm(n*m), lng = c(Y), lat = c(X))

## create raster grid
s = SpatialPixelsDataFrame(points[,c('lng', 'lat')], data = points)
# set WGS84 projection
crs(s) = sp::CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

r = raster(s)

# add coloring
pal = colorNumeric(c("#0C2C84", "#f7f7f7", "#F98009"), points$value,
                    na.color = "transparent")

## plot map
leaflet() %>% addProviderTiles("CartoDB.Positron") %>%
   addRasterImage(r, colors = pal, opacity = 0.6)

这会生成这张地图,乍一看还不错:

如果将网格添加到此地图:

## grid
dx = diff(x)[1]/2
dy = diff(y)[1]/2

rect_lng = sapply(points$lng, function(t) c(t-dx, t+dx))
rect_lat = sapply(points$lat, function(t) c(t-dy, t+dy))

leaflet() %>% addProviderTiles("CartoDB.Positron") %>% 
  addRectangles(
    lng1=rect_lng[1,], lat1=rect_lat[1,],
    lng2=rect_lng[2,], lat2=rect_lat[2,],
    fillColor = "transparent",
    weight = 1
  ) %>%
  addRasterImage(r, colors = pal, opacity = 0.6)

地图是这样的:

这里我们可以看到网格不匹配。

这种不匹配的原因是什么?怎么可能被淘汰?我尝试了各种预测都是徒劳的。唯一有效的方法是使用 addRectangle 而不是 addRasterImage,但这需要更多的计算并减慢过程,因此我想避免。请注意,在上面的示例中 addRectangle 仅用于引用,在最终代码中我不想使用它。

对于具有更多单元格(网格)的地图,不匹配非常大,可能大于单个单元格的大小。

在此先感谢您的帮助。

编辑

问题可能与椭球投影和球体投影的投影问题有关,见最后一个问题here:

to convert between WGS84 and mercator on the sphere there will be substantial shifts in the Y mercator coordinates. This is because internally cs2cs is having to adjust the lat/long coordinates from being on the sphere to being on the WGS84 datum which has a quite differently shaped ellipsoid.

但是,我无法用推荐的 'trick' 解决问题:+nadgrids=@null

传单 R 包的作者在这里。在我看来,当源栅格的像素相对于屏幕上呈现的像素数而言非常少时,我编写的栅格图层渲染器开始漂移。您可以通过对栅格进行以下修改来查看:

r1 <- r
nrow(r1) <- 600
ncol(r1) <- 600
r <- resample(r, r1, method = "ngb")

我会看看是否可以改进渲染方面的问题,但与此同时,像这样的重新采样可能是最简单的解决方法,尽管不可否认它并不优雅。