如何从R中点位置的栅格中提取值?


13

我的问题是关于从点位置的栅格中提取值。通过函数提取,这非常容易,并且函数为我提供了一个数据帧,其中包含点中所有变量的值。我想在该数据框中具有每个点的坐标。我该如何实现?可以对R说,从栅格中提取值时还要添加位置点的列。

这是我的程序:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

结果是这样的:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

但是我想再加上两列包含坐标数据的列(但是可能是我的csv提取位置表中的其他列)。

非常感谢。


抱歉,之前显示的结果格式不正确。
JMCosta 2013年

必须为五列(bio1,bio12 .... bio4)
JMCosta 2013年

这些值不应该与您的坐标相对应presencias吗?
RomanLuštrik'13

变量的值来自优先点。但我也希望表中各点的协调。但我不知道该怎么办。
JMCosta

那类似的东西cbind(coordinates(presencias), variables_presencia)呢?然后coordinates(result) <- ~ X + Y,您可以使用转换为SPDF,并且可以再次使用为空间对象设计的多种方法。
罗曼·卢斯特里克(RomanLuštrik),

Answers:


20

假设presenciasvariables共享相同的投影,这应该是一件容易的事。我建议您在read.table()语句后添加这些代码行,以将presencias数据框转换为SpatialPointsDataFrame对象(如果与我的示例不同,只需对包含x和y坐标的列的名称进行优化)。

coordinates(presencias) <- c("x", "y")

为了提供可重现的示例,我尝试进一步扩大答案范围。首先,在德国或多或少重要的位置下载并解压缩此ESRI shapefile。这些将在以后用作点数据。您还需要包装dismorgdalraster为这个简单的例子,所以一定要确保这些库(和所有的依赖)安装在您的本地硬盘上。

让我们从加载所需的包开始。

library(dismo)
library(rgdal)
library(raster)

接下来,您应该生成一个示例RasterLayer。在我们的案例中,我们将使用软件包中的gmap()函数dismo以获得德国的实物图。

germany.mrc <- gmap("Germany")

现在,您可以readOGR从R的rgdal包中导入点shapefile 。确保调整数据源名称(dsn = ...)。在您的特定情况下,整个投影材料已过时。但是,必须在示例中完成此操作,才能成功地将点数据与Germany RasterLayer叠加。

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

为了减少点数据的庞大规模,我们将随机抽取德国十个地点的样本。这足以满足我们的目的。

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

现在准备工作已经完成,我们可以开始提取十个随机采样点所在的特定像素的值。

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

为了将点坐标与提取的像素值合并,我们只需要设置一个包含SpatialPointsDataFrame坐标的数据框。而已!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208

1

当然,您可以这样做:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(假设您的坐标数据位于称为“ x”和“ y”的两列中)


我以这种方式思考,但我有以下疑问:提取所得到的数据帧与存在顺序相同。(数据帧的第一行是状态表的第一行)
JMCosta

另外,如果没有任何点(3或4)的变量数据,则行数将不同,并且顺序肯定会不同。
JMCosta

@JMCosta:你错了。这些点将返回NA值。
罗伯特·希曼斯
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.