Як перекласифікувати дуже великий набір даних про земельне покриття?


10

Розгляньте набір даних NLCD2001 Land Cover для Аляски ( посилання для завантаження ). Мені потрібно перекласифікувати цей набір даних, щоб збереглися лише пікселі значення 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, Build 4000 з увімкненим розширенням Spatial Analyst.


Витяг за атрибутами, здається, також робить те, що мені потрібно, але, на жаль, призводить до чергової "Несподіваної помилки".
DoggoDougal

Спробували інший набір даних, можливо? Два невдалі процеси в одному і тому ж наборі даних змушують вас дивуватися ...
Чад Купер

2
Зазвичай, це reclassifyмає бути в крайньому випадку, оскільки воно є настільки загальним за обсягом, що воно, ймовірно, використовує методи, які менш ефективні, ніж їх можна отримати, коли рекласифікацію легко виразити арифметично або логічно. У цьому випадку критерій перекласифікації настільки простий, що вам слід спершу спробувати його Conчи навіть прямі арифметичні операції (адже вони швидкі). Наприклад, "grid" * ("grid" >= 41) * ("grid" <= 43)слід це зробити. Оперативна пам’ять не повинна бути проблемою - просторовий аналітик автоматично відкриває свій растровий ввід / вивід, і це локальні операції.
whuber

1
Inlistце приємне рішення (+1). Мені вдалося використовувати conта контролювати використання оперативної пам’яті під час роботи. Він ніколи не перевищував 180 Мб, що ледве перевищує оперативну пам'ять, що використовується лише для запуску ArcMap. Плитка в ArcGIS автоматична - ви навіть не можете керувати нею (якщо ви не програмуєте на інтерфейс C / Fortran). Виявляється, обмеження оперативної пам’яті викликають невелике занепокоєння.
whuber

1
@whuber, conпрацював і для мене, з умовою "Value" >= 41 AND "Value" <= 43. Я б пішов із цим рішенням, але я не впевнений, чи зацікавлять у майбутньому додаткові значення растру. Очевидно, я міг би додати пункт ORдо пункту where, але тоді він починає ускладнюватися. InListвидається найбільш прямим рішенням щодо читабельності та ремонтопридатності.
DoggoDougal

Відповіді:


9

Перший доданий сценарій успішно перекласифікував ваші дані AK NLCD приблизно за 15 хвилин (i7, 12 ГБ оперативної пам’яті). Оскільки початковий набір даних становить майже 7 Гб, можливо, виникають проблеми з пам'яттю. Якщо ви не можете обробити весь набір даних за один фрагмент, спробуйте розділити його за допомогою другого сценарію перед перекласифікацією. Моя рекомендація - взяти невелику підмножину даних (правий клацання миші на растровому шарі в TOC> Дані> Експорт даних> Об'єм (кадр даних) і перевірити перший сценарій. Після набору параметрів для команди перекласифікувати, тоді перейдіть до перекласифікації цілий набір даних або розбивши його. Крім того, спробуйте завантажити 64-бітний продуктовий фоновий геопроцесор для ArcGIS 10.1 SP1, доступний тут .

Сценарій 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 перекваліфікація масивних масивів відбувається дуже швидко.
DavidF

@DavidF Погодився, ймовірно, буде значне поліпшення продуктивності.
Аарон

Дякую за поради, Аарон. Я проведу це, як тільки закінчу чергове вирішення проблеми, яка, здається, вимагає видалення кольорової карти (на яку посилається тут ). Цей метод вимагає також розбиття растру, тому я змушує замислитись, чи не вдалося перекласифікувати оригінал через використання пам'яті або з іншої причини.
DoggoDougal

@torik Немає проблем - я радий віддати свої два центи. Я думаю, що видалити кольорову карту - це не шлях. Швидше я б зосередився на розділенні даних або 64-бітній обробці фону.
Аарон

@Aaron, маючи на увазі, що ви надали код для виконання плитки, як ви створили растр підмножини, який використовували для отримання зображених результатів? Я завершив плитку SplitRaster (створивши 100 підмножин всього растрового набору даних) і спробував провести цикл через них, щоб перекласифікувати їх. На жаль, перекласифікація не вдалася, внаслідок чого з'явилося те саме повідомлення "Несподівана помилка".
DoggoDougal

4

whuber прокоментував використання логічних засобів для вираження цієї рекласифікації . Після невеликого копання я виявив, що InList , як частина набору інструментів Logical Math Spatial Analyst, задовольнив мою потребу.

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 Молодці та чудове рішення. З цікавості, скільки часу займала обробка?
Аарон

@Aaron, обробка всього Аляски займає 13 хвилин і 23,4 секунди. Зразок підмножина , який є одним з 100 однакового розміру підмножин , створених SplitRaster_management, займає 7,04 секунди.
DoggoDougal

Цікаво, приблизно однакові часи обробки між двома методами (тобто при припущенні, що ми працювали у подібних системах).
Аарон

У мене є Intel Core 2 Duo E6850 @ 3 Ghz, 4 Гб оперативної пам’яті, працює 64-розрядна Windows 7. Незабаром проведу аналіз хронології вашого рішення. Я затримався з Arc 10.0 на даний момент, інакше я би дослідив 64-бітну обробку фону.
DoggoDougal

1

Я використовував набір даних, згаданий у оригінальній публікації, з версією arcmap 10.4 dev. Перекласифікація не вдається, коли вихідний растр є сіткою, оскільки кількість перекласифікованих комірок переповнює те, що може бути збережено в полі COUNT сітки ПДВ. Коли вихідний растр є fgdb, він успішно виконується для мене приблизно за 11 хвилин на старшій чотирьохядерній машині під керуванням Windows 8. Растрові формати без сітки повинні працювати, оскільки вони використовують плаваючі значення подвійної точності для поля підрахунку. Я думаю, ви повинні мати таку саму поведінку з версіями 10.2 або 10.3. Ми будемо досліджувати, використовуючи інший формат растру для виводу за замовчуванням для Reclassify.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.