R: Bagaimana cara mendapatkan garis lintang dan bujur dari RasterLayer?

14

Saya seorang pemula mutlak data geografis, jadi tolong, maafkan saya jika pertanyaannya tidak tepat.

Saya mengunduh data dari NCDC NARR dan berhasil memuat ke R menggunakan rasterpaket. Saya ingin mendapatkan daftar dengan garis lintang, bujur dan nilai. Saya mengerti bahwa rasterToPoints()harus melakukan apa yang saya inginkan, namun, nilai garis lintang dan bujur saya terlihat aneh:

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

Saya kira saya harus melakukan sesuatu dengan proyeksi yang saat ini Lambert Conformal Conic (LCC). Berikut ini info lebih lanjut tentang raster.

> 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

Apa yang harus saya lakukan untuk mendapatkan nilai garis lintang dan bujur AS yang sebenarnya?

janosdivenyi
sumber

Jawaban:

14

Anda harus memproyeksi ulang raster ke dalam proyeksi geografis (derajat desimal) menggunakan "projectRaster" atau "spTransform". Lihat juga definisi CRS sp yang menentukan string proyeksi yang Anda inginkan. Contoh dalam bantuan untuk "projectRaster" cukup jelas dalam cara melakukan ini.

Jika Anda memaksa data raster Anda ke objek SpatialPointsDataFrame maka Anda akan menggunakan "spTransform" dan menarik koordinat dari slot @coordinates dan menambahkannya ke data.frame di slot @data. Berikut ini contohnya.

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)

Saya harus mencatat bahwa itu bukan praktik yang baik untuk mengkonversi raster ke kelas objek vektor dan meniadakan keuntungan dari paket raster yang menyediakan pemrosesan yang aman memori. Seringkali bijaksana untuk benar-benar memikirkan masalah Anda dan menilai apakah Anda mendekatinya dengan benar. Jika OP telah memberikan konteks mengapa mereka membutuhkan koordinat [x, y] untuk setiap sel, komunitas forum mungkin dapat memberikan alternatif komputasi yang akan menjaga masalah di lingkungan raster.

Jeffrey Evans
sumber
1
Salah satu cara untuk mengambil hati-hati Anda (tentang menghindari konversi data) ke hati adalah untuk tidak memproyeksikan raster asli (mungkin ke grid yang sangat kasar), membuat dua grid nilai garis lintang dan bujur yang mencakup sejauh mana proyeksi, dan proyeksikan kembali ke sejauh mana kotak asli. Tidak ada kelas vektor yang dibuat: seluruhnya merupakan rangkaian operasi raster.
whuber
4

Dapatkan koordinat pusat sel dan buat objek Spasial:

spts <- rasterToPoints(r, spatial = TRUE)

Ubah poin ke target yang Anda inginkan:

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

Nilai-nilai sudah disalin sebagai kolom pada SpatialPointsDataFrame ini.

print(llpts)

Sekarang untuk menyelesaikan, dapatkan data.frame:

x <- as.data.frame(llpts)

Ada implementasi umum dari ini dalam paket SGAT, lihat fungsinya di lonlatFromCellsini:

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

mdsumner
sumber
Saya mencoba ini tetapi mendapat pesan kesalahan berikut: > 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
Sebenarnya Anda tidak perlu mentransfer atribut, saya akan menghapusnya.
mdsumner
Selain saran paket SGAT, bukankah ini jawaban / contoh yang sama persis dengan yang saya berikan? Koordinat tidak disebarkan ke data.frame dalam slot data, hanya nilai-nilai dari raster. Koordinat, pada kenyataannya, diadakan di slot koordinat dan perlu ditambahkan ke data.frame.
Jeffrey Evans
Terima kasih, saya menambahkan langkah as.data.frame. Saya pikir itu saran yang buruk untuk menambahkan koordinat sebagai atribut - terutama dengan munging dengan slot - karena koordinat objek dapat berubah. Jika Anda ingin data mentah. Bingkai hanya membuat satu. Saya tidak peduli di mana informasinya, mungkin cukup edit milik Anda dan kami dapat zap jawaban ini.
mdsumner
OP secara khusus menginginkan koordinat dan saya pikir itu berlebihan untuk menyimpan ke data.frame terpisah. Saya biasanya tidak suka menambahkan koordinat ke slot data terutama, karena berlebihan dengan slot koordinat. Selain itu, ini bukan "saran mengerikan" untuk menambahkan informasi ke slot data. Bagaimana jika Anda ingin memiliki dua sistem koordinat. Anda dapat menambahkan lat / panjang ke slot data dan memiliki objek dalam proyeksi yang sama sekali berbeda. Juga, jika Anda hanya ingin mengekspor file flat, dan bukan format GIS per se, Anda dapat menambahkan koordinat ke data.frame dan menyimpannya sebagai csv.
Jeffrey Evans
0

Tampaknya Anda memiliki Koordinat yang Diproyeksikan di sana (bukan Latitude / Longitude alias Koordinat GCS). Mungkin tidak jelas bagi Anda bahwa itulah masalahnya. Lihat posting ini. Konversi sistem koordinat geografis di R

jbchurchill
sumber
Saya tidak menangkap posting yang Anda referensi sebelum saya menjawab. Anda mungkin ingin menandai ini sebagai duplikat. Meskipun penambahan pemaksaan SpatialPointsDataFrame dan tugas koordinat membuat jika sedikit berbeda. Panggilanmu.
Jeffrey Evans
Saya berpikir untuk menandainya, tetapi saya pikir jika orang lain mencari jawaban yang sama tanpa mengetahui bahwa mereka perlu memproyeksikan nilai-nilai, ini mungkin muncul untuk mereka. Selain itu jawaban Anda menawarkan cara yang berbeda untuk sampai ke sana (Terpilih).
jbchurchill
Saya mencoba melihat sumber yang Anda daftarkan. Untuk mendapatkan garis lintang / bujur standar yang saya terbitkan lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Namun, tingkat raster baru -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)jauh dari apa yang saya harapkan dari AS (yang seharusnya berada di antara 30 hingga 70 dan -60 hingga -160). Saya harus salah paham sesuatu.
janosdivenyi