使用SpatialPointsDataFrame从Raster提取值仅返回NA

时间:2019-08-21 13:53:58

标签: r

我是使用R进行空间数据分析的初学者,并且想简单地从栅格堆栈中提取某些位置(具有lon / lat位置)的值。但是,当使用extract()时,它仅返回NA,因此我想我在投影上犯了一个错误。

我将lon / lat位置加载到SpatialPointsDataFrame中,将lon / lat更改为数字并将crs设置为EPSG:4326。 栅格堆栈随crs EPSG:3035一起提供,因此我使用了“ sftransform()”来相应地投影lon / lat位置。两个数据集的“ compareCRS”给出的输出为“ TRUE”,因此该投影应该可以正常工作。 但是,当我尝试使用extract()时,它仅返回NA。

当我将坐标放入Google Maps中时,它们已正确映射,但R中的mapview()却似乎完全脱离网格,因此我认为有关投影的某些信息出了错,但我不知道该怎么办。 我希望这里有人可以帮助我!

加载到名为“纹理”的栅格堆栈中

> print(texture)
class      : RasterStack 
dimensions : 8073, 7781, 62816013, 3  (nrow, ncol, ncell, nlayers)
resolution : 500, 500  (x, y)
extent     : 2635700, 6526200, 1385700, 5422200  (xmin, xmax, ymin, ymax)
crs        : +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs 
names      : Clay_eu23, Sand_eu23, Silt_eu23 
min values :         0,         0,         0 
max values :  76.47613, 100.00000,  91.61756

使用Lon / Lat位置在DF中加载

  Datalogger        Lat       Lon
1        DL3 48.5932246 9.5576115
2        DL4 49.0160648 9.1887693
3        DL2 48.7100801 9.2141318
4       DL10 49.0038758 8.4934965
5        DL5 49.0034701 8.4954198
6        DL6 48.4183515 8.8958118

将Lon / Lat列更改为数字

locations$Lon <- as.numeric(locations$Lon)
locations$Lat <- as.numeric(locations$Lat)

设置坐标的crs并创建SpatialPointsDF

coordinates(locations) <- ~Lon+Lat
proj4string(locations) <- CRS("+init=epsg:4326")

> print(locations)
class       : SpatialPointsDataFrame 
features    : 10 
extent      : 1, 10, 1, 10  (xmin, xmax, ymin, ymax)
crs         : +init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 1
names       : Datalogger 
min values  :        DL1 
max values  :        DL9 

将位置重新投影到栅格堆栈(纹理)的crs

loc_proj <- spTransform(locations, proj4string(texture))

检查crs是否正确

compareCRS(texture, loc_proj)

尝试从栅格堆栈中提取值

values <- raster::extract(texture, loc_proj)

对于值,即使我调用summary(texture)它返回有效数据,并且这样的位置也是有效的,但对于堆栈中的三个栅格中的每个栅格,我都只会得到NA。我对这些预测做错了什么? 已经非常感谢您了!

1 个答案:

答案 0 :(得分:0)

您做到了

locations$Lon <- as.numeric(locations$Lon)
locations$Lat <- as.numeric(locations$Lat)

您有

print(locations)
#class       : SpatialPointsDataFrame 
#features    : 10 
#extent      : 1, 10, 1, 10  (xmin, xmax, ymin, ymax)

也就是说,您的经度和纬度在1到10之间。这表明lonlat是因子变量(无论出于何种原因);并且在将它们更改为数字时犯了一个错误。

考虑此问题

x <- as.factor(c(9.5576115, 9.1887693, 9.2141318, 8.4934965, 8.4954198, 8.8958118))
as.numeric(x)
#[1] 6 4 5 1 2 3

as.numeric在转换中不使用因子标签。因为这些标签可能包含字母,所以它不能这样做。相反,它为您提供了索引

因此,您应该

as.numeric(as.character(x))
#[1] 9.557612 9.188769 9.214132 8.493496 8.495420 8.895812

在您的代码中:

locations$Lon <- as.numeric(as.character(locations$Lon))
locations$Lat <- as.numeric(as.character(locations$Lat))