为什么spplot需要这么多时间用于多个面板

时间:2019-01-20 21:37:58

标签: r geospatial raster shapefile sp

我正在使用spplot绘制多个shapefile。这是构建数据的数据

docker tag

我的数据包含10年的变量library(raster) library(randomcoloR) my.shp <- getData('GADM', country = 'BRA', level = 2) my.shp$ID<- 1:nrow(my.shp) ,如下所示,其中每一列均为年份

X

我的问题是,绘制该图需要花费大量时间(大约一个小时),并且想知道代码本身是否存在某些固有错误,因此绘制时间太长。我的笔记本电脑有32 GB的RAM。

谢谢

2 个答案:

答案 0 :(得分:2)

我没有将此图表与您的spplot进行比较,因为我不想花一个小时等待它。

相反,我建议使用library(mapdeck)绘制交互式地图,这需要花费几秒钟的时间。

需要注意的两件事

  1. 您需要一个Mapbox访问令牌
  2. 您需要将sp对象转换为sf
library(raster)

my.shp <- getData('GADM', country = 'BRA', level = 2)
my.shp$ID <- 1:nrow(my.shp)

df <- matrix(sample(100:5000, 55040, replace = T), nrow = 5504, ncol = 10)
df <- data.frame(ID = 1:nrow(my.shp), df)

my.dat <- merge(my.shp, df, by = "ID")


library(sf)
sf <- sf::st_as_sf( my.dat )

library(mapdeck)

set_token( "YOUR_MAPBOX_TOKEN" )

mapdeck() %>% 
  add_sf(
    data = sf
    , fill_colour = "GID_2"
    )

enter image description here

答案 1 :(得分:1)

您愿意/能够切换到sf而不是sp吗?

尽管布局略有不同,但SF图功能比spplot快得多。

library(sf)
my.dat_sf <- st_as_sf(my.dat)
plot(my.dat_sf[rev(variable.names)], max.plot=10, breaks=c(seq(from = 100, to = 5000, by = 500),5000),
     pal = distinctColorPalette(length(seq(from = 100, to = 5000, by = 500))),
     main = "TEST", border=NA, key.pos=4)

此外,对于Spatial *对象,您可以尝试使用rmapshaper::ms_simplify()来简化多边形,对于SimpleFeatures,可以尝试使用sf::st_simplify()来简化多边形,这使您可以根据给定的{{ 1}}。因此,使用简化的多边形,绘制速度也会更快。

原始SpatialPolygon:

dTolerance
  

“ 25599.2 Kb”

和简化的SimpleFeature:

format(object.size(my.dat_sf), units="Kb")
  

“ 7864.2 Kb”

绘制简化的SimpleFeature,在装有8GB RAM的计算机上大约需要1分钟。

dat_sf_simple <- st_transform(my.dat_sf, crs = 3035)
dat_sf_simple <- st_simplify(dat_sf_simple, dTolerance = 1000, preserveTopology = T)
dat_sf_simple <- st_transform(dat_sf_simple, crs = 4326)
format(object.size(dat_sf_simple), units="Kb")

您也可以尝试使用plot(dat_sf_simple[rev(variable.names)], max.plot=10, breaks=c(seq(from = 100, to = 5000, by = 500),5000), pal = distinctColorPalette(length(seq(from = 100, to = 5000, by = 500))), main = "TEST", border=NA, key.pos=4) ,但是我敢肯定,性能最高的解决方案将是SF图。

ggplot2