Сглаживание карты с уровнями высот; R с тмап

Я создаю карту для научной рукописи. На карте должна быть показана базовая карта Мексики с точками отбора проб и цветом уровня высоты. Для этого я использую R с пакетом tmap. Это мой код:

library(sf)
library(raster)
library(dplyr)
library(spData)
library(spDataLarge)
library(tmap)    # for static and interactive maps

data(World)
data("metro")
data("land")

gpsdata <- read.csv('gps.csv')
gpsdata <- as.matrix(gpsdata)
gpspoints <- SpatialPoints(gpsdata)
plot(gpspoints)

gpsnames <- read.csv('gps_names.csv')

spdf = SpatialPointsDataFrame(gpsdata,gpsnames)

proj4string(gpspoints) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
proj4string(spdf) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

pdf('fig-sampling.pdf')
tm_shape(World[World$name=="Mexico", ]) + 
  tm_polygons() +
tm_shape(land) +
  tm_raster("elevation", breaks=c(-Inf, 250, 500, 1000, 1500, 2000, 2500, 3000, 4000, Inf),  
            palette = terrain.colors(9), title="Elevation") +
tm_shape(World) +
  tm_borders("black", lwd = 1) +
  tm_text("name") +
tm_layout(legend.position = c("right","center"),
          legend.bg.color = "lightblue", bg.color = 'lightblue') +
tm_shape(metro) +
  tm_bubbles("pop2020", title.size = "Population") +
  tm_text("name", size = "pop2010", legend.size.show = FALSE, root=8, size.lowerbound = 0.7, just = 'right', xmod = -0.5, ymod = 0)+
  tm_grid(projection="longlat", labels.size = .5) +
tm_shape(spdf) +
  tm_bubbles(col = 'blue', size = 0.3) +
  tm_text("Location", size = 0.8, just = 'left', xmod = 0.3)
dev.off()

К сожалению, слой высот отрисовывается очень большими пикселями:

карта с высотами; создана с помощью R/tmap.

Есть ли способ сгладить (я уже пробовал style = 'cont' для растрового слоя высот)?


person Robert Winkler    schedule 18.03.2020    source источник


Ответы (1)


Самый простой способ сделать что-то гладкое — это интерполировать его с помощью disaggregate из растрового пакета.

Это делает растр больше на заданный коэффициент и интерполирует значения пикселей, что влияет на сглаживание. Но больший растр для всего мира может оказаться слишком большим для вашего компьютера (он мой), поэтому сначала обрежьте до Мексики.

Мировые данные находятся в системе координат, отличной от системы координат земли, поэтому вам придется преобразовать их в координаты земли для урожая:

> land = crop(land, st_transform(World[World$name=="Mexico",],crs(land)))
> plot(land)

Это должно показывать только Мексику, но все равно блочно.

> land = disaggregate(land, 4, "bilinear")
> plot(land)

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

Если вы хотите провести анализ, данные высот с разрешением 30 метров доступны через набор данных SRTM и другие глобальные наборы данных DEM.

person Spacedman    schedule 19.03.2020
comment
Большое спасибо, @Spaceman! Я немного изменил ваш код, включив в него соседние земельные участки, и увеличил параметр «сглаживания»: landsel <- extent(-120,-80,12,34) land = crop(land, landsel) land = disaggregate(land, 10, "bilinear") plot(land$elevation, col = terrain.colors(9)) Не идеально (политические границы и топографическая карта имеют некоторые расхождения), но достаточно хорошо для полевой/выборочной карты. - person Robert Winkler; 19.03.2020
comment
Вы можете попробовать что-то вроде raster::mask(land, World[....]), чтобы замаскировать сглаженный растр до границы земли/моря World.... (Необходимо st_project World, как указано выше) - person Spacedman; 19.03.2020