我在经度和纬度坐标上有几个位置,我需要估算每个位置的太阳辐射。
我发现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/,但重点是获取地图,我只需要提取特定的值而不知道如何做到这一点。
答案 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