Rでラスターを再投影すると、投影された点が有限ではないという警告が表示されますか?


8

1.質問

RのラスターパッケージでprojectRaster()関数を使用して警告が発生しました。完全に再現可能な例を以下に貼り付けます。

   Warning message:
   In rgdal::rawTransform(projto_int, projfrom, nrow(xy), xy[, 1],  :
   33940 projected point(s) not finite

私の質問は次のとおりです。このデータは、地上データで作業している場合に修正する必要がある問題ですか?つまり、データは「失われた」ということです。もしそうなら、これは私にとって大きな問題になるでしょう。もしそうなら、私がそれを修正できる方法があるかどうか知っていますか?

私はこの問題の解決策をオンラインで検索したところ、ここここ、およびここにいくつかの言及が見つかりましが、この問題に対する適切な答えを提供するものはないと思います。

2.ラスターライブラリを読み込む

  library(raster)

3.まず、各グリッドセルに定数を使用して、世界の(長緯度)マップを作成します

各グリッドセルに定数を配置して、警告がデータに影響する可能性がある場合の問題を診断できるかどうかを確認しています。

 rastertest.longlat<-raster(ncol=360, nrow=180)
 values(rastertest.longlat)<-c(rep(1,n=180*360))

4.(長緯度)マップを等面積グリッドに再投影すると、警告メッセージが表示されます

   rastertest.eck4<-projectRaster(rastertest.longlat, res=c(100000,100000), crs="+proj=eck4",method="ngb", over=T)

Warning message:
 In rgdal::rawTransform(projto_int, projfrom, nrow(xy), xy[, 1],  :
33940 projected point(s) not finite

このメッセージは基本的に、一部のグリッドセルで再投影が失敗したことを示していると思います。

5.しかし、2つのマップをプロットした場合、この警告はデータに問題を引き起こすようには見えません

つまり、プロットされたデータに白いギャップはありません。私の推測では、失われた細胞は非地球上の細胞であり、世界の最上部と最果てです。何か案は?

par(mfrow=c(2,1))

plot(rastertest.longlat, col="blue")
data(wrld_simpl)
wrld <- spTransform(wrld_simpl, CRS('+proj=longlat'))
plot(wrld, add=TRUE)

plot(rastertest.eck4, col="blue") 
wrld <- spTransform(wrld_simpl, CRS('+proj=eck4'))
plot(wrld, add=TRUE)

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

回答:


8

短い答え:それは結構です、そしてraster失敗の代わりに完了に進むために、そしていくつかのデータが失われたことをあなたに知らせるために感謝することができます。

長い答え:

それは投影に依存します、そしてこの場合それはおそらく単に「端」にあります。エッジとは何か、特定の投影ファミリの特定のインスタンスでそれがどのように現れるかは、「依存」部分です。

失われたのはセルの中心点ではないことがわかります。

tpoints <- rgdal::project(coordinates(rastertest.longlat), "+proj=eck4")
sum(is.na(tpoints))
#[1] 0

しかし、それはおそらくコーナーであり、セルのエッジである可能性があります。これはおそらく、中心点だけでなく、セルの範囲に基づくラスタープロジェクトを示しています。

 rgdal::project(as.matrix(expand.grid(x = c(-180, 0, 180), y = c(-90,0, 90))), "+proj=eck4")

私は、欠損値がどこから来るのかを予想していたことを認めます、それで、おそらくprojectRaster北と南に少し遠ざかっていますか?-90/90の範囲外の緯度に値を設定すると、警告が表示され始めます。さらに探索する機会があったらフォローアップします。

最後に、おそらく明示的な楕円体またはデータムパラメータ、つまり「+ proj = eck4 + ellps = WGS84」を使用する必要があります。


ありがとう!元のラスターの範囲を+/- 70度以下に再設定するだけです。rastertest.longlat<-raster(ncol = 4320、nrow = 2160、xmn = -180、xmx = 180、ymn = -70 、ymx = 70)を使用して再投影されます。rastertest.eck4<-projectRaster(rastertest.longlat、res = c(100000,100000)、crs = "+ proj = eck4、method =" ngb "、over = T)。警告は完全に消えるので、すべての欠損値は+/-〜70度で発生する必要があると思います
mike

@mikeすみませんが、これは許容できる解決策ではありません。データと情報を失うことは解決策ではありません。QgisとArcgisはこの操作を問題なく実行できます。projectRasterに問題があるはずです。私は、開発者がでチャイムことができると思います。
ハーマンToothrot

(-‸ლ)この場合、QGISとArcが何をするかを正確に示すことを歓迎します。推測はあまり役に立ちません。ここでRで何が行われているのかを正確に確認できます。実際には問題はありません。
mdsumner 2018年

5

すべてのザラザラした詳細に関して、これは私の元の質問に対する完全な回答ではありませんが、興味のある読者にどこかに行くことができます。

一般に、データが失われ、ラスターの再投影中にlonglatから等面積投影にデータが変形します。これは、グローバル分析にとって問題になる可能性があります。ベクター形式でデータを取得できる場合は、代わりにその形式を使用して再投影することをお勧めします。

以下は、一般的な問題に関する1つの参考資料です。そしてここで、損失を定量化しようとする別の方法があります。お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.