Я хочу построить некоторые пространственные данные с помощью пакета листовок в 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
используется только для ссылки, в окончательном коде я не хочу его использовать.
Для карт с большим количеством ячеек (сеток) несоответствие довольно велико, может превышать размер одной ячейки.
Заранее благодарю за любую помощь.
ИЗМЕНИТЬ
Проблема может быть связана с проблемой проекции между проекциями эллипсоида и сферы, см. Последний вопрос здесь :
для преобразования между WGS84 и меркатором на сфере будут существенные сдвиги в координатах Y-меркатора. Это связано с тем, что внутренне cs2cs должен настроить координаты широты и долготы с точки на сфере до точки привязки WGS84, которая имеет эллипсоид совершенно другой формы.
Однако я не смог решить проблему с помощью рекомендованного «трюка»: +nadgrids=@null
.