Bagaimana cara mereklasifikasi dataset tutupan lahan yang sangat besar?


10

Pertimbangkan dataset NLCD2001 Land Cover untuk Alaska ( tautan unduhan ). Saya perlu mengklasifikasi ulang dataset ini sehingga hanya piksel dengan nilai 41, 42, dan 43 yang dipertahankan; semua nilai piksel lainnya harus menjadi NoData (atau 0, jika perlu).

Ini sepertinya tugas yang sederhana, hanya membutuhkan satu panggilan ke alat Reklasifikasi. Sayangnya, setiap panggilan menghasilkan pesan kesalahan yang tidak jelas dan tidak membantu:

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)

Bagaimana saya bisa melakukan klasifikasi ulang dataset raster ini? Saya menggunakan ArcCatalog 10.0, Build 4000, dengan ekstensi Spatial Analyst diaktifkan.


Ekstrak menurut Atribut tampaknya juga melakukan apa yang saya butuhkan, tetapi sayangnya menghasilkan "Kesalahan Tidak Terduga" lainnya.
DoggoDougal

Mencoba dataset lain mungkin? Dua proses gagal pada dataset yang sama membuat Anda heran ...
Chad Cooper

2
Biasanya, reclassifyharus menjadi upaya terakhir, karena cakupannya sangat umum sehingga cenderung menggunakan metode yang kurang efisien daripada yang dapat diperoleh ketika reklasifikasi mudah diungkapkan secara hitung atau secara logis. Dalam kasus ini, kriteria untuk reklasifikasi sangat sederhana sehingga Anda harus mencobanya terlebih dahulu Conatau bahkan melakukan operasi aritmatika langsung (karena cepat). Misalnya, "grid" * ("grid" >= 41) * ("grid" <= 43)harus melakukannya. RAM seharusnya tidak menjadi masalah - Analis Tata Ruang secara otomatis windows I / O raster dan ini adalah operasi lokal.
whuber

1
Inlistadalah solusi yang bagus (+1). Saya bisa menggunakan condan memantau penggunaan RAM selama operasi. Tidak pernah melebihi 180 MB, yang hampir tidak lebih besar dari RAM yang digunakan hanya untuk meluncurkan ArcMap. Ubin di ArcGIS otomatis - Anda bahkan tidak bisa mengendalikannya (kecuali jika Anda memprogram ke antarmuka C / Fortran). Tampaknya keterbatasan RAM tidak terlalu diperhatikan.
Whuber

1
@whuber, conbekerja untuk saya juga, dengan kondisinya "Value" >= 41 AND "Value" <= 43. Saya akan pergi dengan solusi ini, tapi saya tidak yakin apakah nilai raster tambahan akan menarik di masa depan. Jelas saya bisa menambahkan ORklausa di mana, tapi kemudian mulai menjadi lebih rumit. InListtampaknya solusi paling mudah dalam hal keterbacaan dan pemeliharaan.
DoggoDougal

Jawaban:


9

Skrip terlampir pertama berhasil mereklasifikasi data AK NLCD Anda dalam waktu sekitar 15 menit (i7, mesin RAM 12GB). Karena set data asli hampir 7GB Anda mungkin mengalami masalah memori. Jika Anda tidak dapat memproses seluruh dataset dalam satu chunk, coba pisahkan dengan skrip kedua sebelum klasifikasi ulang. Rekomendasi saya adalah untuk mengambil sebagian kecil dari data (Klik kanan layer raster di TOC> Data> Ekspor Data> Extent (Data Frame) dan uji skrip pertama. Setelah Anda memanggil parameter untuk perintah reklasifikasi, kemudian bergerak menuju klasifikasi ulang seluruh dataset atau membaginya. Atau, coba unduh produk 64 bit Background Geoprocessing untuk ArcGIS 10.1 SP1, tersedia di sini . Semoga beruntung.

Skrip 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")

Sunting : Jika Anda perlu membagi data Anda sebelum diproses, skrip ini akan membantu:

Skrip 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
Dari sudut pandang kinerja, akan menarik untuk mencoba pendekatan alternatif menggunakan arcpy.RasterToNumPyArray () dan melakukan reklasifikasi dalam numpy. Anda mungkin ingin membagi raster menjadi ubin pula untuk tujuan memori, tetapi saya tahu bahwa dengan GDAL, mengklasifikasikan ulang array numpy sangat cepat.
DavidF

@ DavidvidF Setuju, kemungkinan akan ada peningkatan kinerja yang signifikan.
Aaron

Terima kasih untuk tipsnya, Aaron. Saya akan menjalankannya segera setelah saya menyelesaikan solusi lain, yang tampaknya membutuhkan penghapusan peta warna ( dirujuk di sini ). Metode ini membutuhkan pemisahan raster juga, jadi saya bertanya-tanya apakah Mereklasifikasi asli gagal karena penggunaan memori atau alasan lain.
DoggoDougal

@torik Tidak masalah - Saya senang memberikan dua sen saya. Saya pikir menghapus peta warna bukan cara untuk pergi. Sebaliknya, saya akan fokus pada pemisahan data atau pemrosesan latar belakang 64 bit.
Aaron

@ Harun, mengingat bahwa Anda memberikan kode untuk menyelesaikan ubin, bagaimana Anda membuat subset raster yang Anda gunakan untuk menghasilkan hasil foto? Saya telah menyelesaikan ubin SplitRaster (menghasilkan 100 himpunan bagian dari seluruh dataset raster), dan berusaha untuk mengulanginya semua untuk mengklasifikasi ulang. Sayangnya, klasifikasi ulang gagal, menghasilkan pesan "Kesalahan Tidak Terduga" yang sama.
DoggoDougal

4

whuber membuat komentar mengenai penggunaan alat logis untuk mengekspresikan reklasifikasi ini . Setelah menggali sedikit, saya menemukan InList , sebagai bagian dari perangkat Logical Math dari Spatial Analyst, memenuhi kebutuhan saya.

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')

Sejauh ini solusi sederhana yang dapat saya temukan, mengeksekusi tercepat, dan tidak memerlukan pertimbangan untuk memasang dataset asli. Tidak perlu mempertimbangkan RAM mesin yang tersedia, karena alat ini akan membaca langsung dari disk dan menyimpan hasilnya segera kembali pada disk.

Filter hasil Alaska menggunakan InList


+1 Dilakukan dengan baik dan solusi yang bagus. Karena penasaran, berapa lama prosesnya?
Aaron

@ Harun, memproses semua Alaska membutuhkan waktu 13 menit dan 23,4 detik. The bagian sampel , yang merupakan salah satu dari 100 subset berukuran sama yang dibuat oleh SplitRaster_management, membutuhkan waktu 7.04 detik.
DoggoDougal

Menarik, kira-kira waktu pemrosesan yang sama antara kedua metode (yaitu dengan asumsi kami menjalankan sistem yang sama).
Aaron

Saya memiliki Intel Core 2 Duo E6850 @ 3 Ghz, RAM 4GB, menjalankan Windows 7. 64-bit Saya akan segera melakukan analisis waktu solusi Anda. Saya terjebak dengan Arc 10.0 untuk saat ini, kalau tidak saya akan menyelidiki pemrosesan latar belakang 64-bit.
DoggoDougal

1

Saya telah menggunakan dataset yang disebutkan dalam posting asli dengan versi arcmap 10.4 dev. Reklasifikasi gagal ketika raster keluaran adalah kisi, karena jumlah sel yang direklasifikasi melebihi apa yang dapat disimpan dalam bidang COUNT dari PPN kisi. Ketika output raster adalah fgdb, itu dieksekusi dengan sukses bagi saya dalam waktu sekitar 11 menit pada mesin 4 core yang lebih tua yang menjalankan Windows 8. Format raster non-grid harus bekerja karena mereka menggunakan nilai mengambang presisi ganda untuk bidang hitung. Saya berharap Anda harus mendapatkan perilaku yang sama dengan versi yang dirilis 10.2 atau 10.3. Kami akan menyelidiki menggunakan format raster yang berbeda untuk output default untuk Reklasifikasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.