在栅格

时间:2018-04-09 13:51:58

标签: r raster

我有一个看起来像这样的栅格:

library(raster)

# Create data
set.seed(123)
r <- raster(ncols=10, nrows=10)
r[] <- sample(10:360, ncell(r),replace = T)
crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
projection(r)
plot(r)

enter image description here

对于每个网格,栅格包含一年中的某一天作为值。我正在寻找一种生成地图(可能是动画)的方法,从第1天到第365天,当地图到达与网格日相匹配的那天时,网格应该变为绿色。

我很抱歉,但由于我不知道在R中是否可能这样做,我无法制作我所尝试过的东西。

谢谢

修改

我能想到的一种方法是运行这样的循环:

for(i in 2:365){

    breakpoints <- c(1,i,365)
    colors <- c("green4","white")
    plot(r, breaks = breakpoints,col=colors)
}

将每个循环的ouptut保存为.png,然后开发一个.gif图像

2 个答案:

答案 0 :(得分:5)

使用循环,您可以将栅格reclassify转换为二进制栅格(如果低于或等于当天,则为0,如果更高,则为1)。然后,您可以使用animation包来创建gif。

library(animation)
ani.options(interval=.05)

saveGIF({
  for (i in 1:365){
    m <- c(1, i, 0,  i, 365, 1)
    rclmat <- matrix(m, ncol=3, byrow=TRUE)
    rc <- reclassify(r, rclmat)

    plot(rc, col=c("green3", "white"), legend=FALSE, main = paste("Day", i))
  }
}) 

演示(200天)

enter image description here

答案 1 :(得分:2)

基于DJack的一些代码,你也可以使用Shiny来让用户选择一天。如果您的栅格具有适当的空间投影,则可以使用Leaflet在交互式地图上叠加栅格。

library(shiny)
library(shinydashboard)
library(ggplot2)
library(raster)
library(leaflet)

set.seed(123)
r <- raster(ncols=10, nrows=10)
r[] <- sample(10:360, ncell(r),replace = T)
crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"



ui <- fluidPage(

  titlePanel("Daily Raster!"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      sliderInput(inputId = "bins", label = "Day", min = 1, max = 365, value = 1)
    ),

    # Main panel for displaying outputs ----
    mainPanel(

      # Output: Histogram ----
      leafletOutput(outputId = "Raster")
    )
  )
)

server <- function(input, output) {

  output$Raster <- renderLeaflet({

    m <- c(1, input$bins, 0,  input$bins, 365, 1)
    rclmat <- matrix(m, ncol=3, byrow=TRUE)
    rc <- reclassify(r, rclmat)

    leaflet() %>% addRasterImage(rc)

  })

}

shinyApp(ui, server)

enter image description here