2017-07-19 81 views
0

我正在研究基於rasterVis::levelplot的繪圖函數,用戶可以僅通過柵格對象或柵格對象以及多邊形對象。在柵格中繪製具有覆蓋多邊形的柵格時確定問題的範圍

功能是相當複雜的,但顯示該問題的最小子集讀作:

library(sf) 
library(raster) 
library(rasterVis) 

myplot <- function(in_rast, in_poly = NULL) { 
    rastplot <- rasterVis::levelplot(in_rast, margin = FALSE) 
    polyplot <- layer(sp::sp.polygons(in_poly)) 
    print(rastplot + polyplot) 
} 

的問題是,我看到一些奇怪的(對我來說)的結果,同時測試它。讓我們來定義一些虛擬的數據 - 一個1000×1000的光柵和sf POYGON oject四個多邊形其分裂光柵 - :

in_rast <- raster(matrix(nrow = 1000, ncol = 1000)) 
in_rast <- setValues(in_rast, seq(1:1000000)) 

my_poly <- structure(list(cell_id = 1:4, geometry = structure(list(structure(list(
    structure(c(0, 0.5, 0.5, 0, 0, 0, 0, 0.5, 0.5, 0), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0.5, 1, 1, 0.5, 0.5, 0, 0, 0.5, 0.5, 0), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0, 0.5, 0.5, 0, 0, 0.5, 0.5, 1, 1, 0.5), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0.5, 1, 1, 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg"))), n_empty = 0L, class = c("sfc_POLYGON", 
"sfc"), precision = 0, crs = structure(list(epsg = NA_integer_, 
    proj4string = NA_character_), .Names = c("epsg", "proj4string" 
), class = "crs"), bbox = structure(c(0, 0, 1, 1), .Names = c("xmin", 
"ymin", "xmax", "ymax")))), .Names = c("cell_id", "geometry"), row.names = c(NA, 
4L), class = c("sf", "data.frame"), sf_column = "geometry", 
agr = structure(NA_integer_, class = "factor", .Label = c("constant", 
"aggregate", "identity"), .Names = "cell_id")) 

和測試功能。從理論上講,我認爲這應該工作:

my_poly <- as(my_poly, "Spatial") # convert to spatial 
myplot(in_rast, in_poly = my_poly) 

,但我得到:

enter image description here

這樣做:

in_poly <- my_poly 
in_poly <- as(in_poly, "Spatial") 
myplot(in_rast, in_poly = in_poly) 

仍然失敗,但有不同的結果:

enter image description here

我發現有工作的唯一方法是從一開始就給多邊形對象,我在函數內部使用相同的名稱(即in_poly

in_poly <- structure(list(cell_id = 1:4, geometry = structure(list(structure(list(
    structure(c(0, 0.5, 0.5, 0, 0, 0, 0, 0.5, 0.5, 0), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0.5, 1, 1, 0.5, 0.5, 0, 0, 0.5, 0.5, 0), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0, 0.5, 0.5, 0, 0, 0.5, 0.5, 1, 1, 0.5), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg")), structure(list(
    structure(c(0.5, 1, 1, 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5), .Dim = c(5L, 
    2L))), class = c("XY", "POLYGON", "sfg"))), n_empty = 0L, class = c("sfc_POLYGON", 
"sfc"), precision = 0, crs = structure(list(epsg = NA_integer_, 
    proj4string = NA_character_), .Names = c("epsg", "proj4string" 
), class = "crs"), bbox = structure(c(0, 0, 1, 1), .Names = c("xmin", 
"ymin", "xmax", "ymax")))), .Names = c("cell_id", "geometry"), row.names = c(NA, 
4L), class = c("sf", "data.frame"), sf_column = "geometry", 
agr = structure(NA_integer_, class = "factor", .Label = c("constant", 
"aggregate", "identity"), .Names = "cell_id")) 


in_poly <- as(in_poly, "Spatial") 
myplot(in_rast, in_poly = in_poly) 

enter image description here

任何人都可以解釋這裏發生了什麼?很明顯(?)是一個範圍問題,但我真的不明白爲什麼函數的行爲像這樣!

在此先感謝!

回答

1

latticeExtra::layer幫助頁面解釋說:

在層中使用的評價是非標準的,並且可以在第一被混淆:你通常是指變量如果面板函數內(X,Y等);通常可以引用全局環境(工作區)中存在的對象,但將其傳入圖層的data參數中的名稱會更安全。

當使用layer函數裏面,你可以嵌入你的對象列表中,並通過它在data說法:

myplot <- function(in_rast, in_poly = NULL) { 
    rastplot <- levelplot(in_rast, margin = FALSE) 
    polyplot <- layer(sp.polygons(x), 
        data = list(x = in_poly)) 
    print(rastplot + polyplot) 
} 

現在函數生成所需的結果:

myplot(in_rast, in_poly = my_poly) 

enter image description here