我是使用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
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
locations$Lon <- as.numeric(locations$Lon)
locations$Lat <- as.numeric(locations$Lat)
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
loc_proj <- spTransform(locations, proj4string(texture))
compareCRS(texture, loc_proj)
values <- raster::extract(texture, loc_proj)
对于值,即使我调用summary(texture)它返回有效数据,并且这样的位置也是有效的,但对于堆栈中的三个栅格中的每个栅格,我都只会得到NA。我对这些预测做错了什么? 已经非常感谢您了!
答案 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之间。这表明lon
和lat
是因子变量(无论出于何种原因);并且在将它们更改为数字时犯了一个错误。
考虑此问题
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))