RまたはPythonを使用して大きなラスターをポリラインに変換する最も速い方法は?


14

グローバルな水域(1ビット値0および1)の大きなラスターファイル(129600 x 64800ピクセル)があり、海と内陸の海岸線を抽出しようとしています。

ArcGISとQGISでラスターからポリラインに変換しようとしましたが、時間がかかります。

誰かがこのタスクのためのより良い/より速い方法(PythonまたはR)またはより良いツールを知っていますか?

更新

  • R:rasterToContourは高速で正確かもしれませんが、私のような非常に大きなデータセット(8,398,080,000ピクセル)がある場合、非常に大きなRAM(16GB以上)が必要か、Rにハードドライブとそれ以上の処理を強制します年齢もかかります。
  • Python / GDAL:gdal_poligonizeはポリラインの代わりにポリゴンを作成します

更新2

  • R rasterToContour:rasterToContourは、必要な結果を提供しません。下の例に示すように、ArcGIS(ラスターからポリゴン、フィーチャからライン)と比較すると、正確なピクセルアウトラインは抽出されません。

rasterToContourの結果 rasterToContourの結果

ArcGISの結果 ArcGISの結果

更新3

Python / GDAL:テストデータセットでコマンドラインからgdal_polygonizeをArcGISに対して実行しましたが、結果は非常に明確でした。

  • gdal:49秒
  • ArcGIS:1.84秒

それは、更新プログラム3見ました
ジェネリックWevers

そのテストデータセットを提供して、提案された代替案がより高速であるか、必要な結果が得られるかどうかを確認できますか?
カーステン

このような巨大なラスターの場合、C / C ++とgdalライブラリを使用する方がはるかに優れているでしょう。
ロドリゴ

回答:


7

私はRで作業しており、過去にパッケージrasterToPolygonsから使用してrasterいましたが、今ではgdal_polygonizeRJohn Baumgartnerが好んでいます。それに基づいて gdal_polygonize.pyおり、はるかに高速です。John Baumgartnerがコードを公開し、彼のブログで使用例を示しました。

Pythonに精通している場合はgdal_polygonize.py、もちろん直接使用できます。


1
やってみます 前回gdal_polygonize.pyを使用したとき、ArcGISはさらに高速でした。
ジェネリックWevers

ArcGisがそのgdalより高速になるとは思っていませんでした。@Generic Militzer
アイリス

ああ、これはポリゴンを作成しますが、ポリラインが必要です。
ジェネリックWevers

データをファイルジオデータベースに格納すると、非常に高速です。しかし、それでも十分な速度ではありません。それが私が代替案を探している理由です。
ジェネリックWevers

2
ポリゴンを取得することは必ずしも問題ではありませんが、いつでもポリラインに変換できます(ただし、その数はもちろんしばらくかかる可能性があります)。
マーティン

6

後世のために、私はこの種の操作を迅速に行うためのstars::パッケージで成功を収めてきましたR

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

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

plot(r)
plot(x, add = TRUE)

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


5

ラスターパッケージrasterToContourから試してください。

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

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

次に、以下のコードを使用して、たとえば「ESRI Shapefile」(。shp)などのローカルフォルダーにファイルを簡単に書き込むことができます。rgdalを参照しogrDriversて、システムと互換性のあるドライバーを確認してください。

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

指を交差させてみますが、RAMが失われることはありません。私は16GBを持っていますが、これで十分ですが、Rは大きなラスターファイルではそれほど効率的ではない場合があります。しかし、見てみましょう。
ジェネリックWevers

変換は何とか機能しましたが、詳細を確認することができませんでした。私は通常、ラスターデータ処理の方が好きなので、SpatialLineDataFrameをシェープファイルまたは同等のものに転送する方法を教えてください。レイヤー名(OGRwrite)がわからないので、グーグルで検索してもまだ苦労しています。
ジェネリックWevers

ハハ、私は間違いなくあなたのポイントを参照してください。上記の更新を参照してください。
fdetsch

2
別のヒント:「maxpixels」をrasterToContourより高い値(1e + 9など)に設定してみてください。その後、詳細が表示されます。デフォルト設定では、非常に一般化された等高線が作成されます。
fdetsch

1
resampleデータをより粗い空間解像度にしたくない場合、私が想像できる唯一の解決策は、データを複数のタイル(16個のサブラスターなど)にrasterToContour分割し、各タイルで繰り返し実行し、 、最後にmerge、結果のシェープファイルを1つの巨大なシェープファイルにまとめます。興味のある方のために、ワーキンググループのパッケージRsenalは、splitRaster1つの巨大なラスターから複数のサブラスターを作成するために呼び出される関数を提供しています。
fdetsch

2

私はGDALの大ファンですが、ポリゴン化ツールは私のアプリケーションにとっても遅すぎました。

迅速な代替手段はDans GDALスクリプトgdal_trace_outlineからのもので、これには耐性、ドーナツなどに関するオプションもあります。

gdal_polygonizeこのようにして、後で変換する必要があるポリゴンも生成されますogr2ogr -nlt MULTILINESTRING

欠点は、LinuxまたはMac OsXシステムを使用している場合を除き、自分でコンパイルする必要があることです。


残念ながら、「セグメンテーションエラー(コアダンプ)」というエラーメッセージで失敗しました。ファイルが大きすぎるか、より正確であるため、小さなポリゴンが多くなりすぎていると思います。
一般的なウィーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.