基于来自R中的SpatialPixelsDataFrame的纬度经度的Gettin值

时间:2017-07-21 17:36:43

标签: r raster

我在经度和纬度坐标上有几个位置,我需要估算每个位置的太阳辐射。

我发现NASA的数据在1度x 1度分辨率下具有完全相同的信息。

nasafile <- 'http://eosweb.larc.nasa.gov/sse/global/text/global_radiation'
nasa <- read.table(file=nasafile, skip=13, header=TRUE)

head(nasa)
  Lat  Lon  Jan  Feb  Mar Apr May Jun Jul Aug Sep  Oct  Nov   Dec  Ann
1 -90 -180 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19
2 -90 -179 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19
3 -90 -178 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19
4 -90 -177 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19
5 -90 -176 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19
6 -90 -175 9.63 5.28 0.75   0   0   0   0   0 0.1 3.24 8.28 10.97 3.19

正如您所看到的,它具有月度数据以及1度的特定纬度/经度坐标的平均年平均值。

如果我将其转换为SpatialPixelsDataFrame对象:

proj <- CRS('+proj=latlon +ellps=WGS84')
coords <- nasa[,2:1]
data <- nasa[,3:15]
nasaSP <- SpatialPixelsDataFrame(points=coords, data=data, proj4string=proj)

我想知道如何提取特定纬度和经度坐标的年度值。

我没有地理数据分析的经验,我一直在关注这篇文章:https://www.r-bloggers.com/maps-of-solar-radiation/,但重点是获取地图,我只需要提取特定的值而不知道如何做到这一点。

1 个答案:

答案 0 :(得分:4)

我会将SpatialPixelsDataFrame转换为栅格对象,以便使用raster包的功能。特别是对于提取值,如果它是raster对象,则更容易,因为您可以在任何给定位置提取值。

在这种情况下,我会将其转换为砖块,这是一个具有多个图层的栅格(因为我们有多个变量)。

library(raster)

# convert to brick

rbck <- brick(nasaSP)

# output

> rbck
class       : RasterBrick 
dimensions  : 180, 360, 64800, 13  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : -180.5, 179.5, -90.5, 89.5  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       :   Jan,   Feb,   Mar,   Apr,   May,   Jun,   Jul,   Aug,   Sep,   Oct,   Nov,   Dec,   Ann 
min values  :  0.00,  0.00,  0.17,  0.00,  0.00,  0.00,  0.00,  0.00,  0.10,  0.00,  0.00,  0.00,  1.51 
max values  :  9.97,  8.20,  7.54,  7.79,  8.31,  9.05,  8.49,  7.89,  7.38,  8.28,  9.31, 11.19,  6.98 

如果您只想查看一个变量(您提到了年度值),您可以轻松地对其进行分组:

solAnn <- rbck[['Ann']]

# plot

plot(solAnn)

现在,如果要提取值,可以通过多种方式进行提取。

假设我们有一个坐标矩阵:

extcoords <- matrix(c(1:10,1:10),ncol=2)

您可以使用栅格的单元格索引提取值,您可以使用函数cellfromXY获取该值:

vals <- solAnn[cellFromXY(solAnn,extcoords)]
> vals
 [1] 5.49 5.43 5.28 5.06 4.53 4.81 5.12 5.37 5.52 5.79

或者您可以将坐标转换为空间点,然后使用extract获取您的值:

pj <- crs('+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0')
pts <- SpatialPoints(coords = extcoords,proj4string = pj)

vals <- extract(solAnn,pts)

# Output 
> vals
 [1] 5.49 5.43 5.28 5.06 4.53 4.81 5.12 5.37 5.52 5.79

使用此方法,您还可以使用points()将地图添加到地图中。

如果您对所有值感兴趣,也可以在分组之前直接从栅格砖中提取:

vals <- extract(rbck,pts)

# Output
> vals
       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec  Ann
 [1,] 5.48 5.97 5.87 5.77 5.13 5.15 5.38 5.48 5.70 5.38 5.40 5.19 5.49
 [2,] 5.63 6.12 5.95 5.81 4.96 4.76 4.98 5.27 5.40 5.29 5.54 5.39 5.43
 [3,] 5.86 6.09 5.83 5.54 4.72 4.15 4.49 5.07 5.07 5.27 5.63 5.60 5.28
 [4,] 5.84 6.01 5.67 5.40 4.62 3.78 3.93 4.66 4.53 5.00 5.58 5.65 5.06
 [5,] 5.33 5.33 5.19 5.05 4.55 3.75 3.30 3.80 3.65 4.26 4.97 5.13 4.53
 [6,] 5.56 5.60 5.39 5.16 4.86 4.44 3.94 3.82 4.04 4.50 5.06 5.32 4.81
 [7,] 5.82 5.89 5.78 5.44 5.11 4.68 4.40 4.19 4.41 4.77 5.39 5.62 5.12
 [8,] 5.90 6.15 6.15 5.75 5.35 4.88 4.48 4.28 4.58 5.13 5.87 5.87 5.37
 [9,] 5.78 6.26 6.30 5.83 5.49 5.15 4.70 4.40 4.96 5.52 6.04 5.78 5.52
[10,] 5.69 6.15 6.40 6.24 6.08 5.70 5.35 5.08 5.46 5.84 5.85 5.59 5.79

HTH