2016-05-11 2 views
0

Аналогичный вопрос к этому был дан ответ ранее, но я не могу найти решение моей конкретной задачи:Extract согласно широты/долготы от .txt

У меня есть .txt со значениями освещенности, и Я хотел бы извлечь в csv-файл временную серию значений освещенности для определенного lat и lon. The (глава) файл .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 и широчайший столбца (это будет простым способом для извлечения данных). Но у него есть заголовок вроде: NCOLS, NROWS, XLLCORNER, ... Но я не знаю, как извлечь серию lat/long time с таким файлом.

Кроме того, как только временные ряды для конкретного lat/long извлекаются, я хотел бы заменить возможную нодату (-999) на среднее значение предыдущего и следующего значений серии.

Я пользуюсь R версии 3.2.4.

Загружаемая ссылка на один из TXT-файлов. Обратите внимание на этот файл в течение определенного года/месяца/дня/часа. Существует столько файлов, сколько часов в году. http://www.mediafire.com/download/t7xl9adxz3764f3/solar_dni_20130102_00UT.txt

+0

Так же текстовый файл повторить то, что показывается в вашем образце? Другими словами, есть ли много значений XLL и YLL Corner? Поскольку вам нужен временной ряд, я предполагаю, что есть даты, соответствующие значениям освещенности ... для каждого угла xll/yll? – Bird

+0

@Bird. Я отредактировал сообщение, пожалуйста, найдите ссылку для загрузки .txt. Все .txt 8760 файлов года выглядят одинаково. Доступ к файлу должен прояснить вопросы. – tom

ответ

2

Файл является файлом ESRI ASCII Raster format. Измените его имя на что-то вроде solar.asc (.asc похоже - к сожалению - будьте важны), а затем установите пакет SDMTools. Как только это будет сделано, вы можете сделать:

library(SDMTools) 

dat <- read.asc("solar.asc") 

или

df <- asc2dataframe("solar.asc") 

Это определенно растровые данные (не временных рядов).

UPDATE

Поскольку вам нужно полный проходных для этого.

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) 

enter image description here

W00t! Австралия (та часть/длинная в файле уже дала это).

UPDATE # 2

Вы можете упростить извлечение, выполнив:

library(raster) 

r <- raster.from.asc(dat) 

as.numeric(extract(r, cbind(150.757, -26.918))) 
## [1] 973 
+0

Спасибо. Но когда я либо изменяю расширение на .asc, либо сохраняю .txt в текстовый файл с TextEdit и изменяю расширение на .asc: 'dat <- read.asc (" solar.asc ")' дает следующее сообщение: 'Ошибка в файле (файл," r "): не удается открыть соединение Кроме того: Предупреждающее сообщение: В файле (файл," r "): не может открыть файл 'solar_dni_20130102_00UT .asc ': Нет такого файла или каталога. Оттуда я не могу продолжить, какое-либо предложение? – tom

+0

Большое вам спасибо за расширенный ответ. Я новичок в R, нужно догнать логику. Тем не менее, я был заинтересован в извлечении значение для конкретной широты, долго, скажем, ш = -26,91, долго = 150,75 Я пытался что-то вроде: 'библиотека (SDMTools) библиотека (растровые) file.rename ("solar_dni_20130102_00UT.txt", «solar_dni_20130102_00UT. .asc ") df <- asc2dataframe (" solar_dni_20130102_00UT. asc ") s <- SpatialPoints (df) результат <- extract (s, -26.918, 150.757) write.csv (result," result.csv ")' Но «извлечение» не получается, есть ли у вас какая-либо идея пожалуйста? – tom

+0

Пригвожден! Большое спасибо! Таким образом, cbind (150.757, -26.918) присваивает cbind (x,) значение lat и cbind (, y) равным lon. И R распознает эти x и y как lat и long из-за заголовка файла ESRI ASCII Raster: XLLCORNER 112.025, YLLCORNER -43.975. Это правильно? – tom

Смежные вопросы