之前已经回答了类似的问题,但我无法找到解决我特定问题的方法:
我有一个带有辐照度值的.txt,我想在csv文件中提取特定纬度和离子的辐照度值的时间序列。 .txt文件的(头部)如下所示:
NCOLS 839
NROWS 679
XLLCORNER 112.025
YLLCORNER -43.975
CELLSIZE 0.05
NODATA_VALUE -999
-999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999...
该文件没有lon和lat列(这将是提取数据的简单方法)。然而它有一个标题:NCOLS,NROWS,XLLCORNER,......但我不知道如何使用看起来那样的文件提取纬度/长时间系列。
此外,一旦提取了特定纬度/经度的时间序列,我想用可能的nodata(-999)替换该系列的前一个和下一个值的平均值。
我使用的是R版本3.2.4。
其中一个.txt文件的可下载链接。请注意此文件是指某年/月/日/小时。一年中的小时数和文件数一样多。 http://www.mediafire.com/download/t7xl9adxz3764f3/solar_dni_20130102_00UT.txt
答案 0 :(得分:2)
该文件是ESRI ASCII Raster format文件。将其名称更改为solar.asc
(.asc
似乎 - 很遗憾 - 很重要),然后安装SDMTools
包。完成后,您可以:
library(SDMTools)
dat <- read.asc("solar.asc")
或
df <- asc2dataframe("solar.asc")
它绝对是栅格数据(不是时间序列)。
更新
因为您需要完整的演练。
library(SDMTools)
# make sure you're in the same directory as your file
getwd()
## [1] "/Path/to/the/directory/with/the/data"
# make sure your original file is in the directory
file.exists("solar_dni_20130102_00UT.txt")
## [1] TRUE
# since the SDMTools functions seem to need ".asc" at the end
file.rename("solar_dni_20130102_00UT.txt",
"solar_dni_20130102_00UT.asc")
# this reads it as a raster
dat <- read.asc("solar_dni_20130102_00UT.asc")
# check it out
str(dat)
## asc [1:839, 1:679] NA NA NA NA NA NA NA NA NA NA ...
## - attr(*, "xll")= num 112
## - attr(*, "yll")= num -44
## - attr(*, "cellsize")= num 0.05
## - attr(*, "type")= chr "numeric"
# this reads it as a data.frame
df <- asc2dataframe("solar_dni_20130102_00UT.asc")
## working with solar_dni_20130102_00UT.asc ...
# check it out
str(dat)
## asc [1:839, 1:679] NA NA NA NA NA NA NA NA NA NA ...
## - attr(*, "xll")= num 112
## - attr(*, "yll")= num -44
## - attr(*, "cellsize")= num 0.05
## - attr(*, "type")= chr "numeric"
# put things back the way they were
file.rename("solar_dni_20130102_00UT.asc",
"solar_dni_20130102_00UT.txt")
而且,我们甚至可以证明这是一个ESRI ASCII光栅:
quick.map(dat, 0.5)
W00t!澳大利亚(文件中的lat / long已经把它送走了)。
更新#2
您可以通过执行以下操作来简化提取:
library(raster)
r <- raster.from.asc(dat)
as.numeric(extract(r, cbind(150.757, -26.918)))
## [1] 973