web-dev-qa-db-ja.com

Rで複数のラスターをマージする

私は、Rで複数のラスターイメージをマージする時間効率の良い方法を見つけようと努めてきました。これらは、キリマンジャロ南部地域の隣接するASTERシーンです。私の目標は、それらを組み合わせて1つの大きな画像を取得することです。

これは私がこれまでに得たものです(RastLayerオブジェクトのリストを表すオブジェクト 'ast14dmo'):

# Loop through single ASTER scenes
for (i in seq(ast14dmo.sd)) {
  if (i == 1) {
    # Merge current with subsequent scene
    ast14dmo.sd.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)
  } else if (i > 1 && i < length(ast14dmo.sd)) {
    tmp.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)
    ast14dmo.sd.mrg <- merge(ast14dmo.sd.mrg, tmp.mrg, tolerance = 1)
  } else {
    # Save merged image
    writeRaster(ast14dmo.sd.mrg, paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg", sep = ""), format = "GTiff", overwrite = TRUE)
  }
}

ご想像のとおり、コードは機能します。ただし、各ラスタオブジェクトのサイズが約70 mbであることを考えると、マージには非常に長い時間がかかります。また、Reduceとdo.callも試しましたが、ラスターファイルの異なる原点を回避する引数「tolerance」を渡すことができなかったため、失敗しました。

誰もがスピードアップする方法のアイデアを持っていますか?

18
fdetsch

do.callを使用できます

ast14dmo.sd$tolerance <- 1
ast14dmo.sd$filename <- paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg.tif", sep = "")
ast14dmo.sd$overwrite <- TRUE
mm <- do.call(merge, ast14dmo.sd)

ここに、raster::mergeの例からのデータをいくつか示します。

r1 <- raster(xmx=-150, ymn=60, ncols=30, nrows=30)
r1[] <- 1:ncell(r1)
r2 <- raster(xmn=-100, xmx=-50, ymx=50, ymn=30)
res(r2) <- c(xres(r1), yres(r1))
r2[] <- 1:ncell(r2)

x <- list(r1, r2)
names(x) <- c("x", "y")
x$filename <- 'test.tif'
x$overwrite <- TRUE
m <- do.call(merge, x)
20
Robert Hijmans

Rasterパッケージの 'merge'関数は少し遅いです。大規模なプロジェクトの場合、Rでgdalコマンドを使用する方が速いオプションです。

library(gdalUtils)
library(rgdal)

(現在の作業ディレクトリにある)結合したいすべてのラスターファイルのリストを作成します。

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif')

構築するテンプレートラスターファイルを作成します。タイルを追加する大きな空白のキャンバスを考えてみてください。

e <- extent(-131, -124, 49, 53)
template <- raster(e)
projection(template) <- '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
writeRaster(template, file="MyBigNastyRasty.tif", format="GTiff")

すべてのラスタータイルを1つの大きなラスターにマージします。

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff")
gdalinfo("MyBigNastyRasty.tif")

これは速度に関しては非常にうまく機能しますが(ラスターパッケージでのマージよりも高速です)、数千のタイルがある場合は、最初にvrtの構築を検討することもできます。

10
Matthew Bayly

たとえば、次のようにReduceを使用できます。

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd)
6
agstudy

私はこれと同じ問題に直面し、私は

#Read desired files into R
data_name1<-'file_name1.tif' 

r1=raster(data_name1)

data_name2<-'file_name2.tif'

r2=raster(data_name2)

#Merge files
new_data <- raster::merge(r1, r2)

新しいマージされたラスターファイルは生成されませんでしたが、データ環境に保存され、印刷時にマージされたマップが生成されました。

1
Sijeh Asuk

SAGA GISモザイクツール( http://www.saga-gis.org/saga_tool_doc/7.3.0/grid_tools_3.html )は、数値レイヤーをマージするための最大の柔軟性を提供し、デフォルトで並行して実行されます!すべてのラスター/画像をSAGA .sgrd形式に変換してから、コマンドラインsaga_cmdを実行するだけです。

1
Tom Hengl