R:RasterLayerから緯度と経度を取得する方法は?


14

私は地理データの絶対的な初心者なので、質問が適切でない場合はご容赦ください。

NCDC NARRからデータをダウンロードし、rasterパッケージを使用してRにロードすることに成功しました。緯度、経度、値のリストを取得したいのですが。私はそれ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

私は、現在Lambert Conformal Conic(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」を使用して、実際にラスタを地理的(10進度)投影に再投影する必要があります。目的の投影文字列を指定するCRS sp定義も参照してください。「projectRaster」のヘルプの例は、これを行う方法が非常に明確です。

ラスターデータをSpatialPointsDataFrameオブジェクトに強制する場合、「spTransform」を使用して@coordinatesスロットから座標を取得し、@ dataスロットのdata.frameに追加します。これがどのように見えるかの例を次に示します。

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)

ラスタをベクトルオブジェクトクラスに変換することはお勧めできません。メモリセーフな処理を提供するラスタパッケージの利点は無効になります。多くの場合、問題について本当に考えて、問題に正しく近づいているかどうかを評価するのが賢明です。OPがすべてのセルに[x、y]座標を必要とする理由に関するコンテキストを提供していた場合、フォーラムコミュニティは、ラスター環境で問題を保持する代替計算を提供できた可能性があります。


1
心に注意する(データ変換を回避する)ための1つの方法は、元のラスター(おそらく非常に粗いグリッド)の投影を解除し、投影解除の範囲をカバーする緯度と経度の値の2つのグリッドを作成し、元のグリッドの範囲。ベクタークラスは作成されません。これは完全に一連のラスター操作です。
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には伝播されず、ラスターからの値のみが伝播されます。実際、座標は座標スロットに保持されており、data.frameに追加する必要があります。
ジェフリーエヴァンス

おかげで、as.data.frameステップを追加しました。オブジェクトの座標は変化する可能性があるため、座標を属性として(特にスロットを変更することによって)追加するのはひどいアドバイスだと思います。生のdata.frameが必要な場合は、作成してください。情報がどこにあるかは気にしません。たぶんあなたの情報を編集するだけで、この回答を削除できます。
mdsumner

OPは特に座標を求めていたため、別のdata.frameに保存するのは冗長だと思います。私は通常、データスロットに座標を追加することを好みません。これは、座標スロットと冗長であるためです。これ以外に、データスロットに情報を追加することは「ひどいアドバイス」ではありません。2つの座標系が必要な場合はどうなりますか。データスロットに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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.