Çok büyük bir arazi örtüsü veri kümesini nasıl yeniden sınıflandırabilirim?


10

Alaska için NLCD2001 Land Cover veri kümesini düşünün ( indirme linki ). Ben sadece 41, 42 ve 43 değeri piksel korunur böylece bu veri kümesini yeniden sınıflandırmak gerekir; diğer tüm piksel değerleri NoData (veya gerekirse 0) olmalıdır.

Bu, yeniden sınıflandırma aracına yalnızca bir çağrı gerektiren basit bir görev gibi görünüyor. Ne yazık ki, her çağrı belirsiz ve yararsız bir hata mesajıyla sonuçlanır:

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)

Bu raster veri kümesini yeniden sınıflandırmaya nasıl gidebilirim? Uzamsal Analist uzantısı etkinken ArcCatalog 10.0, Build 4000 kullanıyorum.


Öznitelikler ile ayıklamak da ihtiyacım olanı yapıyor gibi görünüyor, ama ne yazık ki başka bir "Beklenmeyen Hata" ile sonuçlanır.
DoggoDougal

Belki başka bir veri kümesini denediniz mi? Aynı veri kümesinde başarısız olan iki işlem sizi meraklandırıyor ...
Chad Cooper

2
Normalde, reclassifyson çare olmalıdır, çünkü kapsam açısından o kadar geneldir ki, yeniden sınıflandırmanın aritmetik veya mantıksal olarak ifade edilmesi kolay olduğunda elde edilebilenden daha az verimli yöntemler kullanması muhtemeldir. Mevcut durumda, yeniden sınıflandırma kriteri o kadar basittir ki, ilk önce onu denemelisiniz, Conhatta düz aritmetik işlemleri (hızlı oldukları için). Mesela, "grid" * ("grid" >= 41) * ("grid" <= 43)yapmalı. RAM bir sorun olmamalı - Spatial Analyst otomatik olarak tarama G / Ç'lerini pencereler ve bunlar yerel işlemlerdir.
whuber

1
Inlistgüzel bir çözümdür (+1). conOperasyon sırasında RAM kullanımını kullanabildim ve izledim . Asla 180 MB'ı aşmadı, bu sadece ArcMap'i başlatmak için kullanılan RAM'den çok daha büyük. ArcGIS'teki döşeme otomatiktir - onu kontrol edemezsiniz (C / Fortran arayüzüne programlama yapmadığınız sürece). RAM sınırlamalarının çok az endişe kaynağı olduğu görülmektedir.
whuber

1
@whuber, conbenim için de durumla çalıştı "Value" >= 41 AND "Value" <= 43. Bu çözüm ile giderdim, ancak ek raster değerlerinin gelecekte ilgilenip ilgilenmeyeceğinden emin değilim. Açıkça ORnerede maddeye bir tane ekleyebilirim , ama sonra daha karmaşık olmaya başlar. InListokunabilirlik ve sürdürülebilirlik açısından en basit çözüm gibi görünüyor.
DoggoDougal

Yanıtlar:


9

Eklenen ilk komut dosyası AK NLCD verilerinizi yaklaşık 15 dakika içinde başarıyla yeniden sınıflandırdı (i7, 12GB RAM makinesi). Orijinal veri kümesi neredeyse 7GB olduğu için bellek sorunları yaşıyor olabilirsiniz. Veri kümesinin tamamını tek bir yığın halinde işleyemiyorsanız, yeniden sınıflandırmadan önce ikinci komut dosyasıyla bölmeyi deneyin. Benim tavsiyem, verilerin küçük bir alt kümesini almak (İçindekiler> Veri> Verileri Dışa Aktar> Genişlet (Veri Çerçevesi) içinde raster katmanını sağ tıklayıp ilk komut dosyasını test etmektir. Alternatif olarak, buradan temin edilebilen ArcGIS 10.1 SP1 için 64 bit Arka Plan Geoprocessing ürününü indirmeyi deneyin .

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

Düzenleme : Verilerinizi işlemeden önce ayırmanız gerekiyorsa, bu komut dosyası yardımcı olacaktır:

Metin 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
Performans açısından, arcpy.RasterToNumPyArray () kullanarak alternatif bir yaklaşım denemek ve yeniden sınıfı numpy ile yapmak ilginç olurdu. Raster, bellek amacıyla yine de fayanslara bölmek isteyeceksiniz, ancak GDAL ile, sayısal dizileri yeniden sınıflandırmanın çok hızlı olduğunu biliyorum.
DavidF

@DavidF Kabul ettiğinde, performansta önemli bir iyileşme olacaktır.
Aaron

Tavsiyeler için teşekkürler, Aaron. Renk haritasının kaldırılmasını gerektiren başka bir geçici çözümü bitirir bitirmeyeceğim ( burada atıfta bulunulan ). Bu yöntem, taramanın da bölünmesini gerektirir, bu nedenle Reclassify orijinalinin bellek kullanımı veya başka bir nedenden dolayı başarısız olup olmadığını merak ediyor.
DoggoDougal

@torik Sorun değil - İki sentimi vermekten mutluluk duyuyorum. Renk haritasının kaldırılmasının bir yolu olmadığını düşünüyorum. Aksine, verileri bölmeye veya 64 bit arka plan işlemeye odaklanacağım.
Aaron

@Aaron, döşemeyi gerçekleştirmek için kod sağladığınızı göz önünde bulundurarak, resimdeki sonuçları üretmek için kullandığınız alt küme rasterini nasıl oluşturdunuz? SplitRaster döşemesini (tüm raster veri kümesinin 100 alt kümesini üreterek) tamamladım ve yeniden sınıflandırmak için hepsinin içinden geçmeye çalıştım. Yeniden sınıflandırma maalesef aynı "Beklenmeyen Hata" iletisine neden oldu.
DoggoDougal

4

whuber bu yeniden sınıflandırmayı ifade etmek için mantıksal araçların kullanımı hakkında bir yorum yaptı . Biraz kazdıktan sonra , Mekansal Analistin Mantıksal Matematik araç setinin bir parçası olarak InList'i ihtiyacımı karşıladı .

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

Bulabildiğim kadar basit bir çözüm, en hızlı yürütüyor ve orijinal veri kümesini döşemeyi düşünmüyor. Bu araç doğrudan diskten okuyacak ve sonuçları doğrudan diskte saklayacağından, makinenin kullanılabilir RAM'ini dikkate almanıza gerek yoktur.

InList kullanarak filtre uygulanmış Alaska sonucu


+1 Aferin ve harika bir çözüm. Merakla, işlem ne kadar sürdü?
Aaron

@Aaron, Alaska'nın tamamını işlemek 13 dakika 23.4 saniye sürüyor. Örnek bir alt kümesi tarafından oluşturulan 100 eşit büyüklükteki alt-biridir SplitRaster_management, 7.04 saniye sürer.
DoggoDougal

İlginç, iki yöntem arasındaki kabaca aynı işlem süreleri (yani benzer sistemler kullandığımızı varsayarak).
Aaron

64-bit Windows 7 çalıştıran Intel Core 2 Duo E6850 @ 3 Ghz, 4GB RAM'im var. Kısa süre içinde çözümünüzün zamanlama analizini yapacağım. Şu an için Arc 10.0 ile sıkışıp kaldım, aksi takdirde 64 bit arka plan işlemeyi araştırırdım.
DoggoDougal

1

Orijinal gönderide belirtilen veri kümesini arcmap'in 10.4 dev sürümüyle kullandım. Yeniden sınıflandırılmış hücre sayıları bir ızgara KDV'sinin COUNT alanında depolanabilecek olanı aştığından yeniden sınıflandırma çıktı raster bir ızgara olduğunda başarısız olur. Çıkış raster bir fgdb olduğunda, Windows 8 çalıştıran eski bir 4 çekirdekli makinede yaklaşık 11 dakika içinde benim için başarıyla çalışır. Izgara olmayan raster formatları, sayım alanı için çift duyarlıklı kayan değerler kullandığından çalışmalıdır. 10.2 veya 10.3 sürümleriyle aynı davranışı elde etmenizi bekliyorum. Reclassify için varsayılan çıktı için farklı bir raster formatı kullanarak araştırma yapacağız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.