图像处理-在R中使用SpatialLine对象提取光栅像素值以及像素xy坐标



我有一个从多边形形状文件转换而来的Spatialline(基于"imagebrick"中的特征手动数字化-这意味着在空间上"polyline"one_answers"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
..   ...   ...   ...   ...

然后,我试图使用rastertoppoints函数来拉出xy坐标。这需要一个栅格层,其中包含我想要xy的所有像素。我试过使用"裁剪"来获得光栅"线",但它不起作用。

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.p。我也在考虑使用Rasterize函数栅格化"SpatialLine",然后使用rastertoppoints拉出xy坐标。但是我不能控制"栅格化的SpatialLine"的每个像素等于原始imagebrick中"线"所触及的像素。

感谢大家花时间看我的问题,提前感谢你们的帮助。

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

你想要的似乎是正确的

但是你说你"不能控制'栅格化的SpatialLine '的每个像素等于原始imagebrick中'线'所触及的像素。"

但它们是,除了多行单元格只表示一次。

另一种方法:

# 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))

相关内容

  • 没有找到相关文章

最新更新