Разрешение растра не отображается должным образом

Я вижу странное поведение, когда строю определенный растр. Это затененный рельефный растр, который я приобрел у naturalearthdata.com. Вы можете скачать это здесь.

Я обнаружил, что в зависимости от того, в каком пространственном масштабе я строю растр, он отображает разное разрешение, несмотря на то, что разрешение растра не изменяется.

library(raster)
relief <- raster('GRAY_50M_SR_W.tif')

# let's use Mexico as an example:
library(maptools)
data(wrld_simpl)
mx <- wrld_simpl[which(wrld_simpl@data$NAME == 'Mexico'),]

# Here I create a cropped version of the raster
reliefMX <- crop(relief, mx)

Чтобы проиллюстрировать проблему, я строю график Мексики, чтобы получить экстент карты, затем рисую полный экстент растра, а затем обрезанный растр сверху.

Вы можете видеть, что растры показывают очень разные разрешения, но у них действительно одинаковые разрешения.

plot(mx)
plot(relief, col = grey(0:100/100), legend = FALSE, axes = F, box = F, add=T)
plot(reliefMX, col = grey(0:100/100), legend = FALSE, axes = F, box = F, add=T)

> res(relief)
[1] 0.03333333 0.03333333
> res(reliefMX)
[1] 0.03333333 0.03333333

введите описание изображения здесь

Есть идеи? Как я могу заставить эти растры правильно отображать?

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.4

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] maptools_0.9-2 raster_2.5-8   sp_1.2-4      

loaded via a namespace (and not attached):
[1] compiler_3.4.0  rgdal_1.2-7     tools_3.4.0     foreign_0.8-68  Rcpp_0.12.10   
[6] grid_3.4.0      lattice_0.20-35

1 ответ

Решение

Это зависит от maxpixels аргумент в призыве к raster::plot:

maxpixels integer> 0. Максимальное количество ячеек, используемых для графика. Если maxpixels

Когда вы строите "полную" карту, изображение автоматически сокращается, чтобы сэкономить память и сократить время рендеринга. Вы можете изменить значение maxpixels, чтобы получить желаемый уровень "детализации". см. например:

plot(relief, col = grey(0:100/100), legend = FALSE, axes = F, box = F, add=F)

plot(relief, col = grey(0:100/100), legend = FALSE, axes = F, box = F, add=F, maxpixels = 5000000)

Хотя при этом "уровне масштабирования" это не бросается в глаза, второе изображение более детально. Вы можете оценить это, "увеличив" на вашей обрезанной области:

plot(mx)
plot(relief, col = grey(0:100/100), legend = FALSE, axes = F, box = F, add = T, maxpixels = 5000000)

Все еще не "хорошо", как априори обрезанный (так как я все еще не использую "все" пиксели), но уже лучше.

На практике это все компромисс между временем рендеринга / памятью и качеством вывода. Очевидно, что если вам просто нужно построить часть области, гораздо эффективнее обрезать изображение заранее.

НТН.

Другие вопросы по тегам