Rを使用して緯度、経度、値の形式のデータをラスターファイルに変換するにはどうすればよいですか?


40

米国本土のkmグリッドに値のデータセットがあります。列は「緯度」、「経度」、「観測」です。たとえば、

"lat"    "lon"     "yield"
 25.567  -120.347  3.6 
 25.832  -120.400  2.6
 26.097  -120.454  3.4
 26.363  -120.508  3.1
 26.630  -120.562  4.4

または、Rデータフレームとして:

mydata <- structure(list(lat = c(25.567, 25.832, 26.097, 26.363, 26.63), 
lon = c(-120.347, -120.4, -120.454, -120.508, -120.562), 
yield = c(3.6, 2.6, 3.4, 3.1, 4.4)), .Names = c("lat", 
"lon", "yield"), class = "data.frame", row.names = c(NA, -5L))

(完全なデータセットは、csvとしてここからダウンロードできます

データは、30 km x 30 kmのグリッドの作物モデル(出力される予定)から出力されます(Miguez et al 2012から)。

ここに画像の説明を入力してください

これらをGIS-マップ投影などの関連メタデータでラスターファイルに変換するにはどうすればよいですか?

プラットフォームとソフトウェアに依存しないようにしたいので、ファイルはテキスト(ASCII?)ファイルであることが理想です。


CSVように、これはすでにある ASCIIで「テキストファイル」。また、プロジェクションをまったく使用しないため、追加する関連メタデータがほとんどない場合があります(ほとんどがデータム)。どんな種類の出力を求め、それをどうするつもりなのか、もう少し具体的に教えてください。
whuber

誰かがデータをさまざまなマッピングソフトウェア(ArcGIS、Googleマップ、Grass、Rなど)で使用できるように、できる限り簡単にしたいと思います。たとえば、追加の変換ステップを必要とせずに、再利用を促進します。GISファイル形式のWikipediaページに基づいて、1)「ラスター」ファイルには画像のような緯度と経度の列名を持つ行名が必要であり、2)メタデータには地理情報(コーナーの位置、カバーされるエリア)データによる)。
安倍

これは、RとGISで出会った最高のリファレンスの1つです。どうもありがとうございました!正しいproj4stringでlatとlongを別のcsvに提供してもらえますか?本当に感謝しています。

@Nandini正しいproj4stringが何であるかわからない、ランバートコンフォーマルproj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0を疑います。別のcsvファイルに関してあなたが何を求めているのかわかりません-それは質問でリンクされているものとどのように違いますか、それは受け入れられた答えによって生成されますか?
安倍14

私にとっては機能しません!「x」と「y」を「coordinates(pts)=

回答:


44

必要ないくつかの手順:

  1. あなたはそれが規則的な1kmグリッドであると言います、しかしそれは緯度経度が規則的でないことを意味します。まず、XとYの値が等間隔になるように、通常のグリッド座標系に変換する必要があります。

    a。列x、y、yieldを持つデータフレームとしてRに読み込みます。

    pts = read.table("file.csv",......)

    b。spパッケージなどを使用して、データフレームをSpatialPointsDataFrameに変換します。

    library(sp)
    library(rgdal)
    coordinates(pts)=~x+y

    c。最初にCRSを教えてから通常のkmシステムに変換し、次に宛先にspTransformします。

    proj4string(pts)=CRS("+init=epsg:4326") # set it to lat-long
    pts = spTransform(pts,CRS("insert your proj4 string here"))

    d。これがグリッド化されていることをRに伝えます。

    gridded(pts) = TRUE

    この時点で、座標が適切な通常のグリッド上にない場合、エラーが発生します。

  2. 次に、ラスタパッケージを使用してラスタに変換し、CRSを設定します。

    r = raster(pts)
    projection(r) = CRS("insert your proj4 string here")
  3. 見てみましょう:

    plot(r)
  4. ラスターパッケージを使用して、geoTIFFファイルとして書き込みます。

    writeRaster(r,"pts.tif")

このgeoTIFFは、すべての主要なGISパッケージで読み取り可能である必要があります。ここで明らかに欠けているのは、変換するproj4文字列です。これは、おそらく何らかのUTMリファレンスシステムになります。いくつかのデータなしではわかりにくい...


+1ワークフローをレイアウトしてくれてありがとう。データは、質問で提供されているリンクで利用できることに注意してください:見てください。悲しいかな、それらについてのあなたの仮定のいくつかが間違っていることを発見するでしょう。(具体的には、私がのために狩りを任意のグリッドを作成するために使用される投影についてのドキュメントが、どれも見つからなかったそして、あなたはポイントをプロットすることにより見ることができるようにそれは、奇妙な投影です。。)
whuberを

UTMシステムに非常に近いですが、私が試したものはどれも、Rがそれらをグリッド化するための通常のグリッドに十分近いものではありません。私はRのepsgデータベース全体をループしたいと思っています
。...-Spacedman

そのように投影法を発見できれば、それは本当のツールです。重要なのは、これらの7,000以上のポイントが通常のグリッド上にあるのに十分なタイミングを判断するための効果的かつ効率的な基準を見つけることです(標準投影では完全なグリッドを形成できない可能性があるため)。データベースをすばやく実行するには、グリッドの北部分の東西距離と南部分の東西距離など、少数の距離を比較するだけで十分です。それは、候補者の大多数を迅速に排除するはずです。
whuber

3
Mathematica 8でサポートされているすべての(デフォルト)プロジェクションを実行しました。実際にポイントがグリッド上にあるように見えるプロジェクションが見つかりました:Alaska State Plane(1983)Zone 10!これは、ランベルト正角円錐図法です。EPSG 26940だと思います。これを修正して、経度-106をほぼ中心とするようにすると、ポイントはかなり良いグリッドを形成します。
whuber

1
安倍、あなたはウェブページを読むつもりですか?でしたr = Import[ "https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv", "Data"];。その後、data = Rest[r]; ListPlot[data[[;; , {3, 2}]]](またはListPointPlot3D[data[[;; , {3, 2, 4}]]])を使用してポイントの簡単なプロットを取得できます。再投影の場合は、onのヘルプから始めて、GeoGridPositionインテリジェントな推測と相互参照を行って、何が起こっているのかを把握します:-)。ところで、@ Spacedmanの説明は本当に関連しています。25度から49度までのメトリックの歪みはcos(25)/ cos(49)= 1.38に等しくなります。それは相当な量です。
whuber

29

質問に対する最後の回答が得られたため、rasterFromXYZ必要なすべてのステップ(CRS文字列の指定を含む)をカプセル化するラスターパッケージの機能を使用することにより、はるかに簡単なソリューションが存在します。

library(raster)
rasterFromXYZ(mydata)

1
疲れを知らない@Spacedmanに謝罪します。彼は頻繁に私を助けてくれましたが、この答えは陽気な緑のダニを継承するに値すると思います。
ジオセオ14

@geotheory私はこの答えを選択しますが、それは素晴らしい機能ですが、私が使用しているデータセットでは非常に遅いようです(opにリンク)
安部

1
...実際、〜400KBのファイルを使用/tmp/し、ディスク領域を使い果たしたときに〜19GBのファイルを作成したため、ファイルが詰まってしまいました。
安倍

おそらくどこかにn二乗プロセスがあるでしょう。広いグリッドでポイントデータをグループ化し、各グループを個別にラスタライズしてからmerge()、結果を一緒にラスタライズできる場合があります。
ジオセオ

すべての敬意を払って、しかし、この答えはSpacedmanのものよりもはるかに優れています。
ゴースト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.