R: Bir RasterLayer'dan enlem ve boylam nasıl alınır?


15

Ben coğrafi verilerin mutlak bir başlangıç, bu yüzden lütfen soru uygun değilse beni affet.

NCDC NARR'dan veri indirdim ve rasterpaketi kullanarak R'ye yüklemeyi başardım . Enlem, boylam ve değer içeren bir liste almak istiyorum. Bunun rasterToPoints()tam olarak istediğimi yapması gerektiğini anlıyorum , ancak enlem ve boylam değerlerim garip görünüyor:

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

Sanırım şu anda Lambert Konformal Konik (LCC) olan projeksiyon ile bir şeyler yapmalıyım. Raster hakkında daha fazla bilgi.

> 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

Gerçek ABD enlem ve boylam değerlerini almak için ne yapmalıyım?

Yanıtlar:


15

gerçekten "projectRaster" veya "spTransform" kullanarak raster coğrafi (ondalık derece) bir projeksiyon yeniden projeksiyon gerekir. Ayrıca, istediğiniz projeksiyon dizesini belirten CRS sp tanımlarına da bakın. Bunun nasıl yapılacağı konusunda "projectRaster" yardımındaki örnek oldukça açıktır.

Raster verilerinizi bir SpatialPointsDataFrame nesnesine zorlarsanız, "spTransform" kullanır ve koordinatları @coordinates yuvasından alıp @data yuvasındaki data.frame öğesine eklersiniz. İşte neye benzeyeceğine bir örnek.

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)

Ben rasterleri bir vektör nesnesi sınıfına dönüştürmek iyi bir uygulama değildir ve bellek güvenli işleme sağlayan raster paketinin avantajlarını reddetmek gerekir. Sorununuzu gerçekten düşünmek ve doğru bir şekilde yaklaşıp yaklaşmadığınızı değerlendirmek genellikle ihtiyatlı olur. Eğer OP her hücre için neden [x, y] koordinatlarına ihtiyaç duyduklarına dair bir bağlam sağlamışsa, forum topluluğu sorunu raster ortamında tutacak hesaplama alternatifleri sunmuş olabilir.


1
Dikkatinizi (veri dönüştürmekten kaçınmakla ilgili) kalbe almanın bir yolu, orijinal rasterin (belki de çok kaba bir ızgaraya) projeksiyonunu yapmak, projeksiyonun kapsamını kapsayan iki enlem ve boylam değerleri ızgarası oluşturmak ve bunları projektöre geri yansıtmaktır. orijinal ızgaranın boyutu. Vektör sınıfları oluşturulmaz: tamamen bir dizi tarama işlemi.
whuber

4

Hücre merkezlerinin koordinatlarını alın ve bir Mekansal nesne oluşturun:

spts <- rasterToPoints(r, spatial = TRUE)

Noktaları istediğiniz hedefe dönüştürün:

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

Değerler zaten bu SpatialPointsDataFrame öğesinde sütunlar olarak kopyalandı.

print(llpts)

Şimdi bitirmek için bir veri alın. Çerçeve:

x <- as.data.frame(llpts)

SGAT paketinde bunun genel bir uygulaması var, buradaki işleve bakın lonlatFromCell:

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


Bunu denedim ama aşağıdaki hata iletisini aldım: > llpts$layer1 <- values(r[[1]]) Error in [[<-. (, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
Data.frame

Aslında nitelikleri aktarmanıza gerek yok, bunu kaldıracağım.
mdsumner

SGAT paket tavsiyesi dışında, bu verdiğim cevap / örnekle tam olarak aynı değil mi? Koordinatlar veri yuvasındaki data.frame öğesine yayılmaz, yalnızca rasterden alınan değerler. Koordinatlar aslında koordinatlar yuvasında tutulur ve data.frame'e eklenmesi gerekir.
Jeffrey Evans

Teşekkürler, as.data.frame adımını ekledim. Nesnelerin koordinatları değişebileceğinden, koordinatları öznitelik olarak eklemenin korkunç bir tavsiye olduğunu düşünüyorum. Ham data.frame istiyorsanız sadece bir tane yapın. Bilginin nerede olduğu umurumda değil, belki sadece sizinkini düzenleyin ve bu cevabı zap edebiliriz.
mdsumner

OP özellikle koordinatları istedi ve ayrı bir data.frame'e kaydetmenin gereksiz olduğunu düşünüyorum. Normalde veri yuvasına koordinatlar eklemeyi sevmiyorum, çünkü koordinat yuvasına gereksiz. Bunun dışında, veri yuvasına bilgi eklemek "korkunç tavsiye" değildir. İki koordinat sistemine sahip olmak istiyorsanız. Veri yuvasına enlem / boylam ekleyebilir ve nesneyi tamamen farklı bir projeksiyona alabilirsiniz. Ayrıca, yalnızca bir GIS biçimini değil, yalnızca düz bir dosyayı dışa aktarmak istiyorsanız data.frame'e koordinatlar ekleyebilir ve csv olarak kaydedebilirsiniz.
Jeffrey Evans

0

Orada Öngörülen Koordinatlar olduğu anlaşılıyor (Enlem / Boylam, yani GCS Koordinatları değil). Sorunun bu olduğu muhtemelen açık değildi. Bu gönderiye bakın. Coğrafi koordinat sistemini R cinsinden dönüştürme


Cevap vermeden önce referansını vermedim. Bunu kopya olarak işaretlemek isteyebilirsiniz. SpatialPointsDataFrame zorlama ve koordinat atama eklenmesi biraz farklı olsa da. Çağrınız.
Jeffrey Evans

Bunu işaretlemeyi düşündüm ama başka bir kişi değerleri yansıtmaları gerektiğini bilmeden benzer bir cevap arıyorsa, bu onlar için ortaya çıkabilir. Yanıtı yanı sıra oraya ulaşmak için farklı bir yol sunuyor (Olumlu).
jbchurchill

Listelediğiniz kaynaklara bakmaya çalıştım. Standart enlem / boylamları elde etmek için yayınladım lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Bununla birlikte, yeni raster kapsamı, -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)ABD'den beklediğimden çok uzaktır (30 ila 70 ve -60 ila -160 arasında bir yerde olmalıdır). Bir şeyi yanlış anlamalıydım.
Ocak

0
    library(raster)
r<-pt$cpc.pr[[1]] #my raster taken from a first layer of a stack
    rlon<-rlat<-r #copy r to rlon and rlat rasters [1]][1]which will contain the longitude and latitude
    xy<-xyFromCell(r,1:length(r)) #matrix of logitudes (x) and latitudes(y)
    rlon[]<-xy[,1] #raster of longitudes
    rlat[]<-xy[,2] #raster of latitides
    par(mfrow=c(1,2))
    image(rlon,main="longitudes")
    image(rlat,main="latitudes")

R Sonuç görüntüde gösterilmiştir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.