R: Як отримати широти та довготу від RasterLayer?


14

Я абсолютно новачок географічних даних, тому, будь ласка, вибачте мене, якщо питання не підходить.

Я завантажив дані з NCDC NARR і вдалося завантажити в R за допомогою rasterпакета. Я хотів би отримати список із широтою, довготою та значенням. Я розумію, що rasterToPoints()слід робити саме те, що я хочу, однак мої значення широти та довготи виглядають дивними:

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

Я припускаю, що мені слід щось зробити з проекцією, яка є в даний час Ламбертовим конформальним коніком (LCC). Ось подальша інформація про растр.

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

Що робити, щоб отримати реальні значення широти та довготи США?

Відповіді:


14

вам потрібно фактично перепрофілювати растр в географічну (десяткову градуси) проекцію, використовуючи "projectRaster" або "spTransform". Також перегляньте визначення CRS sp, які задають потрібний рядок проекції. Приклад у довідці для "projectRaster" цілком зрозумілий, як це зробити.

Якщо ви примушуєте свої растрові дані до об’єкту SpatialPointsDataFrame, тоді ви використовуєте "spTransform" та витягаєте координати з слота @coordinate і додаєте їх до data.frame в слоті @data. Ось приклад того, як це могло б виглядати.

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

Слід зазначити, що це невірна практика конвертувати растри в векторний об’єктний клас і заперечує переваги растрового пакету, що забезпечує безпечну обробку пам'яті. Часто доцільно подумати над своєю проблемою і оцінити, чи правильно ви підходите до неї. Якби ОП запропонувала контекст, чому вони потребують [x, y] координат для кожної комірки, спільнота форумів, можливо, змогла б надати обчислювальні альтернативи, які б утримували проблему в растровому середовищі.


1
Один із способів уважно ставитися до уваги (щодо уникнення перетворення даних) - зняти проекцію з оригінального растру (можливо, на дуже грубу сітку), створити дві сітки значень широти та довготи, що охоплюють ступінь непроекції, та запроектувати їх назад у обсяг вихідної сітки. Не створюються векторні класи: це повністю набір растрових операцій.
whuber

4

Отримайте координати клітинних центрів та створіть Просторовий об’єкт:

spts <- rasterToPoints(r, spatial = TRUE)

Перетворіть бали на бажану ціль:

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

Значення вже копіюються у вигляді стовпців у цій SpatialPointsDataFrame.

print(llpts)

Тепер, щоб закінчити, отримати data.frame:

x <- as.data.frame(llpts)

Загальна реалізація цього в пакеті SGAT, див. lonlatFromCellТут функцію :

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R


Я спробував це, але отримав таке повідомлення про помилку: > llpts$layer1 <- values(r[[1]]) Error in [[<<. Data.frame (* tmp *, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
janosdivenyi

Насправді вам не потрібно передавати атрибути, я їх видалю.
mdsumner

Окрім поради щодо пакетів SGAT, це не зовсім та сама відповідь / приклад, яку я надав? Координати не поширюються на data.frame у слоті даних, а лише значення з растру. Насправді координати містяться в слоті координат і їх потрібно додати до кадру даних.
Джефрі Еванс

Дякую, я додав крок as.data.frame. Я думаю, що страшна порада додавати координати як атрибути - особливо, змінюючи слот - оскільки координати об'єкта можуть змінюватися. Якщо ви хочете мати необроблений data.frame, просто зробіть його. Мені все одно, де інформація, можливо, просто відредагуйте вашу, і ми зможемо заповнити цю відповідь.
mdsumner

ОП спеціально захотів координати, і я вважаю, що зайвим буде зберегти в окремий data.frame. Я, як правило, не люблю додавати координати до слота даних, оскільки це зайве з гніздом для координат. Крім цього, не "страшна порада" додавати інформацію в слот даних. Що робити, якщо ви хочете мати дві системи координат. Ви можете додати lat / long в слот даних і мати об'єкт у зовсім іншій проекції. Крім того, якщо ви хочете просто експортувати плоский файл, а не сам GIS-формат, ви можете додати координати до data.frame і зберегти як csv.
Джефрі Еванс

0

Видається, що у вас там проектовані координати (не Широта / Довгота ака Координати GCS). Вам, мабуть, було не ясно, що в цьому проблема. Дивіться цю публікацію. Перетворення географічної системи координат в R


Я не зловив пост, на який ви посилаєтесь, перш ніж відповів. Ви можете позначити це як дублікат. Хоча додавання примусу і координати SpatialPointsDataFrame присвоює дещо інше. Твій дзвінок.
Джефрі Еванс

Я думав про те, щоб позначити це як таке, але подумав, якщо інша людина шукає подібну відповідь, не знаючи, що їм потрібно проектувати значення, це може виявитися для них. Крім того, ваша відповідь пропонує інший спосіб дістатися (Upvoted).
jbchurchill

Я спробував подивитися на вказані вами джерела. Для того щоб отримати стандартні широти / довготи, які я видав lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Однак масштаби нового растру - -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)це далеко не те, що я очікував би від США (який повинен бути десь від 30 до 70 і від -60 до -160). Я повинен був щось зрозуміти неправильно.
janosdivenyi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.