如何从栅格生成空间网格?


9

我需要一个空间网格作为各种专题地图的主网格。如何从丢弃所有NA像素的栅格中生成空间网格?


6
给我们扔一些废料。编写栅格的一些代码以及您对此的期望?
Spacedman

Answers:


14

您可以使用以下方法获取栅格中所有像元的非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像素的网格就没有意义。


谢谢队友,我也不知道想要什么。我尝试开发一个工作流,以从各种空间点数据生成相同的栅格地图(在分辨率,坐标,crs等方面)。由于空间点散射,无法进行栅格化。需要使用iwd或类似的东西。没错,网格是矩形的-作为主模板,我需要的可能是SpatialPointsDataFrame。可以网格化。S.
Janbob Squarebrains 2012年

您可能需要一个主栅格(ha!),然后创建与其并发的所有后续栅格。
雷达

2
同意 如果网格化,栅格几乎总是答案。或者,或者在R中浏览大约20页的“应用空间数据分析”以弄清楚如何进行SpatialPixels。实际上,我今天已经把这个选择交给了一名博士生。他明智地选择了!
Spacedman

20

要将RasterLayer转换为Spatial *对象(网格或像素),可以使用强制功能“ as”

library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')

plot(r)
points(p)

7

您的两个要求似乎是关于不同的事情:

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的答案重叠,但仍不清楚您在问题中的意思是什么。

  • (可以说,由于您可以仅通过存储稀疏像元来存储索引而不是使用显式坐标来存储稀疏像元,并且如果您确实需要它们,则可以将原来“稍微不规则”的像元坐标存储为属性。sp或栅格都不能处理不规则栅格,甚至不是简单的直线情况-这与大多数GIS工具保持一致,但是很不幸,因为它在NetCDF之类的格式中很常见,并且由R的旧有很好的graphics :: image函数处理(但是如果使用了最近的rasterImage选项,则不是) )

感谢您提供的非常有启发性的陈述,我需要进行总结。希望能使我解决问题或提出更明确的问题!
Janbob Squarebrains

还有@Spacedman:我在论坛上
Janbob Squarebrains 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.