[英]R - convert SpatialLines into raster
在R中,我們可以使用raster
並將其轉換為具有SpatialLinesDataFrame
函數的rasterToCountour
:
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"
spplot(x)
contourToRaster
這樣的contourToRaster
? 我們可以簡單地獲取與沿着線的每個點相關聯的字段值,但是我正在尋找在線之間插值並在定義的域上產生完整柵格的更通用的東西。
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
您可以柵格化值。 在這種情況下,首先從因子標簽中提取它們。
x$value <- as.numeric(as.character(x$level))
rr <- rasterize(x, r, "value")
然后提取單元格值並插入這些值
xyz <- rasterToPoints(rr)
(如果你想跳過rasterize和rasterToPoints(正如mikoontz建議的那樣)你可以改為
#g <- geom(x)
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])
以更復雜的模型為代價)
現在插值,例如使用Tps
library(fields)
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)
m <- mask(p, r)
plot(m)
您是否只能訪問由rasterToContour()
創建的對象?
如果仍然可以訪問原始柵格,則可以先將輪廓創建為完整的多邊形(而不是將它們創建為線條)。 然后像“contourToRaster”一樣的函數就是rasterize()
(或者fasterize()
)。
從這里借來一些代碼: 如何將輪廓線轉換為填充輪廓?
library(fasterize)
rc <- cut(r, breaks= 10)
cut_vals <- cut(r[], breaks = 10, dig.lab = 5)
pols <- rasterToPolygons(rc, dissolve=T) %>%
st_as_sf()
r_template <- raster(pols, res = res(r))
back_to_raster <- fasterize(pols, r_template, field = "layer")
par(oma = c(0, 0, 0, 5))
plot(back_to_raster, legend = FALSE)
plot(back_to_raster, legend.only=TRUE, legend.width = 1,
axis.args=list(at=1:nlevels(cut_vals),
labels=levels(cut_vals)))
生產:
編輯:
如果你想進行插值,我喜歡羅伯特對此的處理方法。 我會跳過rasterize()
步驟,這可能非常慢,有利於直接將多線串轉換為點:
library(tidyverse)
library(sf)
library(raster)
library(fields)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
x_sf <- x %>% st_as_sf() %>% st_cast("LINESTRING") %>% st_cast("MULTIPOINT") %>% st_cast("POINT")
tps <- Tps(x = st_coordinates(x_sf), Y = as.numeric(as.character(x_sf$level)))
p <- interpolate(r, tps) %>% mask(r)
plot(p)
請注意,這兩種方法都依賴於對原始raster
對象的訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.