Rでベクターをラスターに高速処理


9

Rでベクターをラスターに変換しています。ただし、プロセスが長すぎます。より速く実行するために、スクリプトをマルチスレッドまたはGPU処理に入れる可能性はありますか?

ラスタライズされたベクトルへの私のスクリプト。

r.raster = raster()
extent(r.raster) = extent(setor) #definindo o extent do raster
res(r.raster) = 10 #definindo o tamanho do pixel
setor.r = rasterize(setor, r.raster, 'dens_imov')

r.raster

クラス:RasterLayer寸法:9636、11476、110582736(nrow、ncol、ncell)解像度:10、10(x、y)範囲:505755、620515、8555532、8651792(xmin、xmax、ymin、ymax)座標。ref。:+ proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

セッター

クラス:SpatialPolygonsDataFrame機能:5419範囲:505755、620515.4、8555429、8651792(xmin、xmax、ymin、ymax)座標。ref。:+ proj = utm + zone = 24 + south + ellps = GRS80 + units = m + no_defs変数:6つの名前:ID、CD_GEOCODI、TIPO、dens_imov、area_m、domicilios1分の値:35464、290110605000001、RURAL、0.00000003、100004、 1.0000の最大値:58468、293320820000042、URBANO、0.54581673、99996、99.0000

セッターのプリント ここに画像の説明を入力してください


setorとr.rasterの要約を投稿できますか?setor内のオブジェクトの数とr.rasterのサイズについて少し知りたいのですが。それらを印刷するだけで問題あり
ません

質問の本文に要約を入れました。
DiogoCaribé16年

要約ではなく、印刷する-私が私たちに求めた情報はtgereではありません
mdsumner

申し訳ありませんが、プリントを入れました。
ディオゴカリブ

ああ、がっかりしたのは、印刷結果を見るまでこれを思いつかなかった-ラスタの投影がポリゴンと一致していることを確認してください。現時点では一致していません-r <-raster(setor);を試してください。res(r)<-10; setor.r = rasterize(setor、r、 'dens_imov')-また、res(r)<-250を最初に設定してみてください。高解像度バージョンの
所要時間の目安に

回答:


17

この方法でパッケージを使用して関数を「並列化」しようとしました:rasterizeRparallel

  1. 分割SpatialPolygonsDataFrameの中でオブジェクトをnパーツ
  2. rasterize 部分ごとに
  3. すべてのパーツを1つのラスターにマージする

私のコンピューターでは、並列化されたrasterize関数は、並列化されていない関数よりも2.75倍少なくなりましたrasterize

注:以下のコードは、Webからポリゴンシェープファイル(〜26.2 MB)をダウンロードします。任意のSpatialPolygonDataFrameオブジェクトを使用できます。これは単なる例です。

ライブラリとサンプルデータをロードします。

# Load libraries
library('raster')
library('rgdal')

# Load a SpatialPolygonsDataFrame example
# Load Brazil administrative level 2 shapefile
BRA_adm2 <- raster::getData(country = "BRA", level = 2)

# Convert NAMES level 2 to factor 
BRA_adm2$NAME_2 <- as.factor(BRA_adm2$NAME_2)

# Plot BRA_adm2
plot(BRA_adm2)
box()

# Define RasterLayer object
r.raster <- raster()

# Define raster extent
extent(r.raster) <- extent(BRA_adm2)

# Define pixel size
res(r.raster) <- 0.1

ブラジルSPDF

図1:ブラジルSpatialPolygonsDataFrameプロット

単純なスレッドの例

# Simple thread -----------------------------------------------------------

# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))

私のラップトップでの時間:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

マルチスレッドスレッドの例

# Multithread -------------------------------------------------------------

# Load 'parallel' package for support Parallel computation in R
library('parallel')

# Calculate the number of cores
no_cores <- detectCores() - 1

# Number of polygons features in SPDF
features <- 1:nrow(BRA_adm2[,])

# Split features in n parts
n <- 50
parts <- split(features, cut(features, n))

# Initiate cluster (after loading all the necessary object to R environment: BRA_adm2, parts, r.raster, n)
cl <- makeCluster(no_cores, type = "FORK")
print(cl)

# Parallelize rasterize function
system.time(rParts <- parLapply(cl = cl, X = 1:n, fun = function(x) rasterize(BRA_adm2[parts[[x]],], r.raster, 'NAME_2')))

# Finish
stopCluster(cl)

# Merge all raster parts
rMerge <- do.call(merge, rParts)

# Plot raster
plot(rMerge)

ブラジルラスター

図2:ブラジルのラスタープロット

私のラップトップでの時間:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Rでの並列化の詳細


とても良い答えです!
DiogoCaribé2016年

マシンのコア数としてnを設定しませんか?
Sam

@サム私は問題なく動作するはずだと思いますが、それが良いかどうかわかりません!私は分割さ場合を想定機能におけるn個の部分に等しいコア数多分この部分の一つは、プロセスと、それは使用せずになり、処理コアへの容易なことができます!ただし、1つのコアが1つのパーツの処理を終了するときにコアよりも多くのパーツがある場合、他のパーツが使用されます。しかし、確かに、私にはわかりません!この問題の助けをいただければ幸いです。
グズマン2017年

今夜、いくつかのテストを実行します。50mにラスタライズされた小さなシェープファイル(約25km x 25km)では、n = 20、30、または最大50に対してn = 2、4、または8を使用することで小さな改善があります。今夜、非常に大きなシェープファイルにサブします25mにラスタライズします。シングルコアの処理は10時間なので、nのさまざまな値がどうなるかを確認します。(n = 50は1時間弱)
Sam

@グズマン私は再びコードを実行しています。ただし、エラーが発生し、理由は不明です。手伝って頂けますか?checkForRemoteErrors(val)のエラー:7つのノードでエラーが発生しました。最初のエラー:オブジェクト 'BRA_adm2'が見つかりません
DiogoCaribé'19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.