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

标签 r leaflet map-projections sp r-raster

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

这是绘制 map 的最小代码:

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)

这会生成这张 map ,乍一看没问题: enter image description here

如果将网格添加到此 map :

## 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)

map 看起来像这样:

enter image description here

这里我们可以看到网格不匹配。 enter image description here

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

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

在此先感谢您的帮助。

编辑

问题可能与椭球投影和球体投影的投影问题有关,见最后一个问题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.

但是,我无法使用推荐的“技巧”解决问题:+nadgrids=@null

最佳答案

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

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

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

关于光栅图像似乎使用 R 的传单进行了移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33742107/

相关文章:

java - Java中不同 map 投影之间的转换

java - 如何正确地将地理坐标转换为屏幕上的像素?

r - 在SF对象上设置正确的crs以绘制坐标点

R:将 CrossTable 导出到 Latex

r - dplyr:filter()中的动态变量

R:从 ggplot 对象中提取比例名称

javascript - 尝试使用传单绘制删除/编辑形状时出错 - ESRI

offline - 如何通过缓存制作离线 map (使用传单OSM)?

R - 如何从写入文件的列表中删除 "c("

javascript - 如何计算传单中的像素