Answers:
您可以使用以下方法获取栅格中所有像元的非NA坐标:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
这些不是NA的单元格。然后,您可能可以将它们喂入SpatialPixels
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
尽管我个人将网格上的任何内容保留为栅格。
我不能完全确定您仍然想要什么- SpatialGrid
对象是定义完整的矩形网格,因此没有NA像素的网格就没有意义。
您的两个要求似乎是关于不同的事情:
1)某种可靠的栅格网格模板。
2)稀疏的网格不会显式存储丢失的单元格。
sp :: GridTopology提供了第一个,它只是基于左下单元格坐标(cellcentre.offset),单元格间距(cellsize)和网格尺寸(cells.dim)的网格描述。
sp :: SpatialPixelsDataFrame类允许您存储稀疏网格,但它本身比“模板”存储更多的东西-它也显式存储每个坐标。这是因为它完成了两项工作,一项允许您保留来自网格的原始坐标,并且可能略有不规则,而两项允许您仅存储具有有效值的单元格。(可以说,这两个目标应该是分开的,但这是另一回事了)。
我不认为raster包与GridTopology有明确的相似之处,但是您可以控制组件以“自己动手”:
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
将所有这些链接在一起,我们可以从光栅到sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(请注意尺寸如何反转)。另一个更简单的方法是强制使用SpatialGrid并使用sp的getGridTopology,尽管这样做会更加昂贵,因为最终会沿这种方式生成坐标:
getGridTopology(as(r1, "SpatialGrid"))
栅格“拓扑”的这三个部分不是全部必需的,因为有些部分是多余的,但是没有其他方法可以将它们全部捕获为一个对象-除非上面创建的栅格是“空”的,所以它可以做到GridTopology为sp做的工作。我不确定它有多“空”的细节,但是它肯定没有显式存储“数据”插槽,并且比其中的值还要小。通常,光栅包会尽最大努力将内存使用量保持在最低水平,因此,您不必担心真正的“稀疏”。
这可能会有助于解释更多信息,我知道我与Spacedman的答案重叠,但仍不清楚您在问题中的意思是什么。