非常に大きな土地被覆データセットを再分類する方法は?


10

アラスカのNLCD2001土地被覆データセットを検討してください(ダウンロードリンク)。このデータセットを再分類して、値41、42、43のピクセルのみが保持されるようにする必要があります。他のすべてのピクセル値はNoData(または必要に応じて0)になるはずです。

これは簡単な作業のようで、Reclassifyツールを1回呼び出すだけで済みます。残念ながら、すべての呼び出しは曖昧で役に立たないエラーメッセージをもたらします:

Executing: Reclassify "D:\ak_nlcd_2001_land_cover_3-13-08_se5.img" Value "0 40 0;41 41;42 42;43 43;44 255 0;NODATA 0" "D:\alaska_reclassified.tif" DATA 
Start Time: Thu Jan 03 09:23:13 2013
ERROR 999998: Unexpected Error.
Failed to execute (Reclassify).
Failed at Thu Jan 03 09:23:13 2013 (Elapsed Time: 0.00 seconds)

このラスターデータセットを再分類するにはどうすればよいですか?Spatial Analystエクステンションを有効にして、ArcCatalog 10.0、ビルド4000を使用しています。


属性による抽出も必要な処理を実行しているようですが、残念ながら別の「予期しないエラー」が発生します。
DoggoDougal 2013年

多分別のデータセットを試しましたか?同じデータセットで2つのプロセスが失敗すると、不思議になります...
チャドクーパー

2
reclassify再分類が算術的または論理的に表現しやすい場合に得られる方法よりも効率の悪いメソッドを使用する可能性が高いため、通常は最後の手段です。現在のケースでは、再分類の基準は非常に単純なので、最初にそれを試すConか、単純な算術演算(それが高速であるため)を試す必要があります。たとえば、"grid" * ("grid" >= 41) * ("grid" <= 43)それを行うべきです。RAMは問題ではありません。SpatialAnalystは自動的にラスターI / Oをウィンドウ処理しますが、これらはローカル操作です。
whuber

1
Inlist良い解決策です(+1)。con運用中にRAMの使用状況を監視することができました。180 MBを超えることはありません。これは、ArcMapを起動するためだけに使用されるRAMをわずかに超えています。ArcGISのタイリングは自動です-(C / Fortranインターフェイスにプログラミングしている場合を除いて)それを制御することすらできません。RAMの制限はほとんど問題ではないようです。
whuber

1
@whuberはcon、条件付きで、私のためにも働いた"Value" >= 41 AND "Value" <= 43。私はこのソリューションを使用していましたが、将来的に追加のラスター値に関心があるかどうかはわかりません。もちろんOR、where句にを追加することもできますが、その後、より複雑になります。InList可読性と保守性の点で最も簡単な解決策のようです。
DoggoDougal 2013年

回答:


9

最初に添付されたスクリプトは、AK NLCDデータを約15分で正常に再分類しました(i7、12GB RAMマシン)。元のデータセットはほぼ7 GBであるため、メモリの問題が発生している可能性があります。データセット全体を1つのチャンクで処理できない場合は、再分類する前に、2番目のスクリプトで分割してみてください。私の推奨は、データの小さなサブセット(TOC>データ>データのエクスポート>エクステント(データフレーム)でラスターレイヤーを右クリックし、最初のスクリプトをテストすることです。再分類コマンドのパラメーターをダイヤルしたら、再分類に進みます。データセット全体または分割するか、こちらから入手できるArcGIS 10.1 SP1用の64ビットバックグラウンドジオプロセシング製品をダウンロードしてみてください。

スクリプト1

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Overwrite output
env.overwriteOutput = 1

# Set environment settings
env.workspace = r'C:\temp'
Dir = env.workspace

# Set local variables
inRaster = Dir + "\\" + "nlcd_subset.img"
reclassField = "Value"
remap = RemapValue([[0, 40, 0], [41, 41],[42,42], [43,43], [44, 256, 0]])

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute Reclassify
outReclassify = Reclassify(inRaster, reclassField, remap, "NODATA")

# Save the output 
outReclassify.save(r"C:\temp\nlcd_test.img")

編集:処理の前にデータを分割する必要がある場合、このスクリプトが役立ちます。

スクリプト2

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Overwrite output
env.overwriteOutput = 1

# Set environment settings
env.workspace = r'C:\temp'
Dir = env.workspace

# Set local variables
inRaster = Dir + "\\" "nlcd" + "\\" + "nlcd_ak.img"
outFolder = Dir
reclassField = "Value"
remap = RemapValue([[0, 40, 0], [41, 41],[42,42], [43,43], [44, 256, 0]])

# Split Rasters
# Equally split a large TIFF image by number of images
arcpy.SplitRaster_management(inRaster, outFolder, "split", "NUMBER_OF_TILES", "#",
                             "NEAREST", "2 2", "#", "4", "PIXELS",\
                             "#", "#")

# List rasters for processing
rasters = arcpy.ListRasters()


for ras in rasters:
    print "processing..." + ras

    # Define new name
    name = "class_" + ras  

    # Execute Reclassify
    outReclassify = Reclassify(ras, reclassField, remap, "NODATA")

    # Save the output 
    outReclassify.save(Dir + "\\" + name)

3
パフォーマンスの観点からは、arcpy.RasterToNumPyArray()を使用して別のアプローチを試し、numpyで再分類することは興味深いでしょう。とにかくメモリ目的でラスタをタイルに分割したいと思うかもしれませんが、GDALを使用すると、numpy配列の再分類が非常に高速であることを知っています。
DavidF 2013年

@DavidF同意し、パフォーマンスが大幅に向上する可能性があります。
アーロン

ヒントをありがとう、アーロン。別の回避策が完了したらすぐに実行します。回避策には、カラーマップ(ここで参照)を削除する必要があるようです。この方法ではラスターも分割する必要があるため、メモリの使用やその他の理由でオリジナルの再分類が失敗したのではないかと思います。
DoggoDougal 2013年

@torik問題ありません。2セント差し上げてよかったです。カラーマップを削除することは、進むべき道ではないと思います。むしろ、私はデータの分割または64ビットのバックグラウンド処理に焦点を当てます。
アーロン

@Aaron、タイリングを実行するためのコードを提供したことを念頭に置いて、図の結果を生成するために使用したサブセットラスタをどのように作成しましたか?SplitRasterタイリング(ラスターデータセット全体の100サブセットを生成)を完了し、それらすべてをループして再分類しようとしました。残念ながら、再分類は失敗し、同じ「予期しないエラー」メッセージが表示されました。
DoggoDougal 2013年

4

whuberは、この再分類を表現するための論理ツールの使用についてコメントしました。少し掘り下げた後、Spatial AnalystのLogical Mathツールセットの一部としてInListが私のニーズを満たしていることがわかりました。

import arcpy

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")
from arcpy.sa import InList

# Pixel values of interest, named according to Table 2 of
#  http://landcover.usgs.gov/pdf/anderson.pdf
DECIDUOUS_FOREST = 41
EVERGREEN_FOREST = 42
MIXED_FOREST = 43

inRaster = r'D:\AK_NLCD_2001_land_cover_3-13-08\ak_nlcd_2001_land_cover_3-13-08_se5.img'
accepted_raster_values = [DECIDUOUS_FOREST, EVERGREEN_FOREST, MIXED_FOREST]
filteredAlaska = InList(inRaster, accepted_raster_values)
filteredAlaska.save(r'C:\alaska\ak_woods')

それは私が見つけることができた最も単純なソリューションであり、最も速く実行され、元のデータセットをタイリングすることを考慮する必要はありません。このツールはディスクから直接読み取り、結果をディスクに直接保存するため、マシンの使用可能なRAMを考慮する必要はありません。

InListを使用してフィルター処理されたアラスカの結果


+1よくできていて、優れたソリューションです。好奇心から、処理にはどのくらい時間がかかりましたか?
アーロン

@Aaron、アラスカ全体の処理には13分23.4秒かかります。試料のサブセットで作成された100等しいサイズのサブセットの一つであるSplitRaster_management、7.04秒かかります。
DoggoDougal 2013年

興味深いことに、2つのメソッド間で処理時間はほぼ同じです(つまり、同様のシステムを実行していると想定しています)。
アーロン

Intel Core 2 Duo E6850 @ 3 Ghz、4 GBのRAM、64ビットWindows 7を実行しています。ソリューションのタイミング分析をまもなく実行します。とりあえずArc 10.0にこだわっています。それ以外の場合は、64ビットのバックグラウンド処理を調査します。
DoggoDougal 2013年

1

元の投稿で言及されているデータセットを10.4開発バージョンのアークマップで使用しました。再分類されたセルカウントがグリッドVATのCOUNTフィールドに格納できるものをオーバーフローしているため、出力ラスターがグリッドの場合、再分類は失敗します。出力ラスターがfgdbの場合、Windows 8を実行している古い4コアマシンで約11分で正常に実行されます。非グリッドラスターフォーマットは、カウントフィールドに倍精度浮動小数点値を使用するため機能します。10.2または10.3リリースバージョンでも同じ動作が得られるはずです。Reclassifyのデフォルト出力に別のラスターフォーマットを使用することを検討します。

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