कैसे एक बहुत बड़े भूमि कवर डेटासेट को पुनर्वर्गीकृत करें?


10

अलास्का के लिए NLCD2001 लैंड कवर डेटासेट ( लिंक डाउनलोड करें ) पर विचार करें। मुझे इस डेटासेट को दोबारा बनाने की आवश्यकता है ताकि केवल 41, 42 और 43 मूल्य के पिक्सेल संरक्षित हों; अन्य सभी पिक्सेल मान NoData (या यदि आवश्यक हो तो 0) बनने चाहिए।

यह एक साधारण कार्य की तरह लगता है, केवल एक टूल को Reclassify टूल की आवश्यकता होती है। दुर्भाग्यवश, प्रत्येक कॉल अस्पष्ट और अस्वाभाविक त्रुटि संदेश देता है:

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)

मैं इस रैस्टर डेटासेट को पुनः प्राप्त करने के बारे में कैसे जा सकता हूं? मैं ArcCatalog 10.0, बिल्ड 4000 का उपयोग कर रहा हूं, जिसमें स्थानिक विश्लेषक विस्तार सक्षम है।


एट्रिब्यूट्स द्वारा एक्सट्रेक्ट भी मुझे वही करने लगता है जो मुझे चाहिए, लेकिन दुर्भाग्य से एक और "अनपेक्षित त्रुटि" के रूप में सामने आता है।
डोगेगोडॉगल

शायद एक और डाटासेट की कोशिश की? एक ही डेटासेट पर विफल होने वाली दो प्रक्रियाएँ आश्चर्यचकित करती हैं ...
चाड कूपर

2
आमतौर पर, reclassifyएक अंतिम उपाय होना चाहिए, क्योंकि यह गुंजाइश में इतना सामान्य है कि यह संभावना है कि उन तरीकों का उपयोग करता है जो कम कुशल हैं, जब प्राप्त किया जा सकता है, तो पुनर्वर्गीकरण अंकगणितीय या तार्किक रूप से व्यक्त करना आसान है। वर्तमान मामले में, पुनर्वर्गीकरण की कसौटी इतनी सरल है कि आपको पहले Conया सीधे अंकगणितीय संचालन के साथ इसे आज़माना चाहिए (क्योंकि वे तेज़ हैं)। उदाहरण के लिए, "grid" * ("grid" >= 41) * ("grid" <= 43)इसे करना चाहिए। रैम एक मुद्दा नहीं होना चाहिए - स्थानिक विश्लेषक स्वचालित रूप से अपने रेखापुंज I / O को विंडो करता है और ये स्थानीय ऑपरेशन हैं।
whuber

1
Inlistएक अच्छा समाधान (+1) है। मैं conऑपरेशन के दौरान रैम उपयोग का उपयोग करने और उसकी निगरानी करने में सक्षम था । यह कभी भी 180 एमबी से अधिक नहीं हुआ, जो कि आर्कपैक को लॉन्च करने के लिए उपयोग की जाने वाली रैम से बमुश्किल अधिक है। ArcGIS में टाइलिंग स्वचालित है - आप इसे नियंत्रित करने के लिए भी नहीं मिलेंगे (जब तक कि आप C / Fortran इंटरफ़ेस पर प्रोग्रामिंग नहीं कर रहे हैं)। ऐसा प्रतीत होता है कि रैम की सीमाएँ थोड़ी चिंता का विषय हैं।
whuber

1
@whuber, conने मेरे लिए भी शर्त के साथ काम किया "Value" >= 41 AND "Value" <= 43। मैं इस समाधान के साथ गया होगा, लेकिन मुझे यकीन नहीं है कि अगर भविष्य में अतिरिक्त रास्टर मूल्यों में रुचि होने जा रही है। जाहिर है मैं एक ORखंड में जोड़ सकता हूं , लेकिन तब यह और अधिक जटिल होने लगता है। InListपठनीयता और स्थिरता के संबंध में सबसे सीधा-सीधा समाधान लगता है।
डॉग्गो डगल

जवाबों:


9

पहली संलग्न स्क्रिप्ट ने लगभग 15 मिनट (i7, 12GB RAM मशीन) में अपने AK NLCD डेटा को सफलतापूर्वक पुनर्वर्गीकृत किया। चूंकि मूल डेटासेट लगभग 7GB है, इसलिए आप मेमोरी मुद्दों का सामना कर सकते हैं। यदि आप संपूर्ण डेटासेट को एक चंक में संसाधित नहीं कर सकते हैं, तो पुनर्वर्गीकरण से पहले इसे दूसरी स्क्रिप्ट के साथ विभाजित करने का प्रयास करें। मेरी सिफारिश है कि डेटा का एक छोटा सा उपसमूह लें (TOC> Data> Export Data> Extent (डेटा फ़्रेम) में राइट क्लिक करें और पहले स्क्रिप्ट का परीक्षण करें। एक बार जब आप पुनरावर्ती कमांड के लिए मापदंडों में डायल करते हैं, तो क्लिपबोर्डिंग के साथ स्थानांतरित करें। संपूर्ण डेटासेट या इसे विभाजित करना। वैकल्पिक रूप से, आर्कजीआईएस 10.1 SP1 के लिए 64 बिट बैकग्राउंड जियोप्रोसेसिंग उत्पाद डाउनलोड करने का प्रयास करें , यहां उपलब्ध है । शुभकामनाएँ।

लिपि १

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

संपादित करें : यदि आपको प्रसंस्करण से पहले अपने डेटा को विभाजित करने की आवश्यकता है, तो इस स्क्रिप्ट को मदद करनी चाहिए:

लिपि २

# 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 () का उपयोग करते हुए वैकल्पिक दृष्टिकोण की कोशिश करना और सुन्न में काम करना दिलचस्प होगा। आप संभवतः स्मृति उद्देश्यों के लिए टाइल में रैस्टर को विभाजित करना चाहते हैं, लेकिन मुझे पता है कि GDAL के साथ, खस्ता सरणियों को फिर से वर्गीकृत करना बहुत तेज है।
20

@ दाविद सहमत, प्रदर्शन में उल्लेखनीय सुधार होगा।
हारून

सुझाव के लिए धन्यवाद, हारून। जैसे ही मैं एक और वर्कअराउंड समाप्त करता हूं, मैं इसे एक रन दूंगा, जो कि कलर मैप ( यहां संदर्भित ) को हटाने की आवश्यकता प्रतीत होती है । इस विधि को रेखापुंज के रूप में अच्छी तरह से विभाजित करने की आवश्यकता होती है, इसलिए यह मुझे आश्चर्यचकित करता है कि स्मृति-उपयोग या किसी अन्य कारण से Reclassify मूल विफल हो गया या नहीं।
DoggoDougal

@torik कोई समस्या नहीं - मैं अपने दो सेंट देने के लिए खुश हूं। मुझे लगता है कि कलर मैप को हटाना रास्ता नहीं है। बल्कि, मैं डेटा या 64 बिट बैकग्राउंड प्रोसेसिंग को विभाजित करने पर ध्यान केंद्रित करूंगा।
हारून

@ एरन, इस बात को ध्यान में रखते हुए कि आपने टाइलिंग को पूरा करने के लिए कोड प्रदान किया है, आपने चित्र के परिणामों का उत्पादन करने के लिए उप-रेस्टर कैसे बनाया? मैंने स्प्लिटरास्टर टाइलिंग (पूरे रास्टर डेटासेट के 100 सबसेट का उत्पादन) पूरा कर लिया है, और उन सभी के माध्यम से लूप करने का प्रयास किया है। पुनर्स्मरण विफल रहा, दुर्भाग्य से, उसी "अनपेक्षित त्रुटि" संदेश के परिणामस्वरूप।
डोगेगोडॉगल

4

व्हीलर ने इस पुनर्लेखन को व्यक्त करने के लिए तार्किक उपकरणों के उपयोग के संबंध में एक टिप्पणी की । थोड़ी खुदाई के बाद, मैंने इनलिस्ट को पाया , स्थानिक विश्लेषक के लॉजिकल मैथ टूलसेट के हिस्से के रूप में, मेरी ज़रूरत को पूरा किया।

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

यह अब तक का सबसे सरल समाधान है, जो सबसे तेज़ है, इसे निष्पादित करता है, और मूल डेटासेट को खंगालने पर कोई विचार नहीं करना पड़ता है। मशीन की उपलब्ध रैम पर विचार करने की कोई आवश्यकता नहीं है, क्योंकि यह उपकरण डिस्क से सीधे पढ़ेगा और डिस्क पर सही परिणाम संग्रहीत करेगा।

फ़िल्टर्ड अलास्का परिणाम InList का उपयोग कर


+1 अच्छी तरह से किया और एक महान समाधान। जिज्ञासा से बाहर, प्रसंस्करण में कितना समय लगा?
एरोन

@ एरॉन, अलास्का के सभी प्रसंस्करण में 13 मिनट और 23.4 सेकंड लगते हैं। नमूना सबसेट है, जो द्वारा बनाई गई 100 सबसेट समान रूप से आकार में से एक है SplitRaster_management, 7.04 सेकंड लेता है।
डोगेगोडॉगल

दिलचस्प है, दो तरीकों के बीच लगभग समान प्रसंस्करण समय (यानी यह मानते हुए कि हम समान सिस्टम चला रहे थे)।
आरोन

मेरे पास Intel Core 2 Duo E6850 @ 3 Ghz, 4GB RAM है, जो 64-बिट विंडोज 7 पर चल रहा है। मैं आपके समाधान का समय विश्लेषण शीघ्र ही करूँगा। मैं आर्क 10.0 के साथ समय के लिए अटक गया हूं, अन्यथा मैं 64-बिट पृष्ठभूमि प्रसंस्करण की जांच करूंगा।
डोगेगोडॉगल

1

मैंने मूल पोस्टिंग में वर्णित डेटासेट का उपयोग arcmap के 10.4 देव संस्करण के साथ किया है। जब उत्पादन रेखापुंज एक ग्रिड होता है, तो पुनर्वितरण विफल हो जाता है, क्योंकि पुनर्वर्गीकृत सेल गणना एक ग्रिड वैट के COUNT क्षेत्र में संग्रहीत की जा सकती है। जब आउटपुट रेखापुंज एक fgdb होता है, तो यह विंडोज 4 पर चलने वाली एक 4 कोर मशीन पर लगभग 11 मिनट में मेरे लिए सफलतापूर्वक निष्पादित होता है। गैर-ग्रिड रेखापुंज स्वरूपों को काम करना चाहिए क्योंकि वे गिनती क्षेत्र के लिए डबल सटीक फ्लोटिंग मानों का उपयोग करते हैं। मुझे उम्मीद है कि आपको 10.2 या 10.3 जारी किए गए संस्करणों के साथ समान व्यवहार मिलना चाहिए। हम Reclassify के लिए डिफ़ॉल्ट आउटपुट के लिए एक अलग रेखापुंज प्रारूप का उपयोग करके जांच करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.