使用R中的SpatialLine对象提取栅格像素值以及像素xy坐标

时间:2014-03-18 03:36:47

标签: r image-processing extraction r-raster rasterize

我有一个Spatialline,我从多边形shapefile转换(根据“imagebrick”中的功能手动数字化 - 这意味着“polyline”和“imagebrick”在空间上重叠,如我所愿)

polyline <- as(shapefiles_data[1,],"SpatialLines")

> polyline
class       : SpatialLines 
features    : 1 
extent      : 357714.3, 357719, 4076030, 4076035  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat 

和Rasterbrick

> imagebrick
class       : RasterBrick 
dimensions  : 29180, 14940, 435949200, 4  (nrow, ncol, ncell, nlayers)
resolution  : 0.6, 0.6  (x, y)
extent      : 354038.4, 363002.4, 4066992, 4084500  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat 
names       : band1, band2, band3, band4 
min values  :     0,     0,     0,     0 
max values  : 65535, 65535, 65535, 65535 

我试图提取Rasterbrick中被Line(SpatialLine)触摸的像素。但我还想提取与这些提取像素相关联的xy坐标,并将它们存储在SpatialPointsDataFrame中。我试过了:

extract_polyline_test <- extract(imagebrick, polyline)
extract_polyline_test <- as.data.frame(extract_polyline_test)
> extract_polyline_test
band1 band2 band3 band4
1    125   156    73   392
2    129   161    80   366
3    156   208   122   374
4    142   175    97   330
5    102   117    31   389
6    117   143    57   381
7    162   221   127   413
8    213   302   204   405
..   ...   ...   ...   ...

然后,我试图使用RasterToPoints函数来拉出xy坐标。这需要一个包含我想要xy的所有像素的栅格图层。我试图使用“crop”来获得光栅“线”,但它不起作用。

rastercrop_polyline <-crop(imagebrick,polyline)
rastercrop_polyline

> rastercrop_polyline
class       : RasterBrick 
dimensions  : 8, 7, 56, 4  (nrow, ncol, ncell, nlayers)
resolution  : 0.6, 0.6  (x, y)
extent      : 357714.6, 357718.8, 4076030, 4076035  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat 
data source : in memory
names       : band1, band2, band3, band4 
min values  :    72,    63,     0,   156 
max values  :   274,   415,   299,   497 

s.polyline <- rasterToPoints(rastercrop_polyline)
> s.polyline
         x       y band1 band2 band3 band4
 [1,] 357714.9 4076035    93    96    17   342
 [2,] 357715.5 4076035    72    63     0   377
 [3,] 357716.1 4076035    90    93    17   371
 [4,] 357716.7 4076035   125   156    73   392
 [5,] 357717.3 4076035   129   161    80   366
 [6,] 357717.9 4076035   156   208   122   374
 [7,] 357718.5 4076035   142   175    97   330
 [8,] 357714.9 4076034   100   108    25   326
 ..  ........  .......   ...   ..     ..    ...

似乎“裁剪”功能不会裁剪光栅的“线”,而是整个“多边形”。有没有其他方法来获取我提取的像素的xy坐标?

P.S。我还试图提取每个提取像素的周围像素。我该怎么做?我注意到提取函数中有一个函数参数。我应该在提取函数中编写一个小函数,还是有其他方法可以做到这一点?

p.p.s我还想使用Rasterize函数来栅格化“SpatialLine”,然后使用RasterToPoints拉出xy坐标。但我无法控制“栅格化的SpatialLine”的每个像素等于原始图像砖中“线”所触及的像素。

感谢大家抽出时间查看我的问题,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

你说你“正在考虑使用Rasterize函数来栅格化”SpatialLine“,然后使用RasterToPoints来拉出xy坐标。”

这对你想要的东西来说似乎是正确的

但是你说你“无法控制”栅格化的SpatialLine“的每个像素等于原始图像砖中”线“所触及的像素。”

但它们是,除了具有多行的单元格仅表示一次。

另一种方法:

# set up some example data
r <- raster()
values(r) <- runif(ncell(r))
cds1 <- rbind(c(-50,0), c(0,60), c(40,5), c(15,-45), c(-10,-25))
cds2 <- rbind(c(80,20), c(140,60), c(160,0), c(140,-55))
lines <- SpatialLines(list(Lines(list(Line(cds1)), "1"), Lines(list(Line(cds2)), "2") ))

# values for lines
v <- extract(r, lines)
# create raster with cell numbers
ids <- init(r, v='cell')
# extract these
cells <- extract(ids, lines)
# compute xy
xy = lapply(cells, function(x) xyFromCell(r, x))