Зональная статистика 2 приводит к фатальной ошибке. Есть ли альтернатива?

Aug 19 2020

Недавно я переключился на использование дополнительного инструмента «зональная статистика как таблица 2» вместо обычной «зональной статистики», потому что у меня есть перекрывающиеся полигоны, с которыми зональная статистика не работает. Тем не менее, я уже несколько раз пытался запустить зональную статистику 2, и после многих часов работы в ночное время он обнаружил фатальную ошибку и не завершился. Я не знаю, как решить эту проблему. Я пытаюсь вычислить среднюю высоту в пределах более чем 100 000 буферных полигонов, и мне нужно будет сделать это несколько раз с другими растровыми слоями. Есть ли альтернатива или способ заставить инструмент выполнить команду?

Ответы

2 FelixIP Aug 19 2020 at 06:59

Чтобы решить эту проблему, вам нужно разделить полигоны на группы без перекрытия. Это называется раскраской графа .

Чтобы скрипт работал ниже, а) установите пакет networkx и б) запустите:

PolygonNeighbors("POLYGONS", "neighbours", area_overlap="AREA_OVERLAP")

Сценарий:

'''
creates non-adjacent groups of polygons
'''
import arcpy
import networkx as nx
infc = arcpy.GetParameterAsText(0)
table = arcpy.GetParameterAsText(1)

sourceList=[f.name for f in arcpy.ListFields(table)]
FTO=sourceList[1:3]
fromto=arcpy.da.TableToNumPyArray(table,FTO)
try:arcpy.AddField_management(infc, "COLOR","Short")
except:pass
G=nx.Graph()
G.add_edges_from(fromto)

allGroups=sorted(nx.connected_components(G), key = len, reverse=True)

arcpy.AddMessage("%i connected groups found" %len(allGroups))
D={}
for item in allGroups:
    arcpy.AddMessage(len(item))
    subG=G.subgraph(item)
    d = nx.coloring.greedy_color(subG, strategy=nx.coloring.strategy_largest_first)
    D.update(d)
    with arcpy.da.UpdateCursor(infc,("OID@","COLOR")) as cursor:
        for row in cursor:
            if row[0] not in item:continue
            row[1]=D[row[0]]+1
            cursor.updateRow(row)
arcpy.AddMessage("Done")

добавит и заполнит поле «ЦВЕТ» числами в диапазоне (1..4). Это теоретический диапазон, ожидайте чего-то большего, в зависимости от степени перекрытия. Я бы сказал, что в худшем случае - 7 цветов. Вы можете жестко закодировать входной класс объектов (infc) и таблицу смежности (table), если не хотите назначать скрипт инструменту с двумя параметрами.

Обратите внимание, что скрипт пропускает островные полигоны, это приведет к значению None или 0 в поле COLOR в зависимости от источника класса пространственных объектов:

У вас есть несколько вариантов дальнейших действий:

  1. вручную определите n слоев из ПОЛИГОНОВ, используя запросы определения, например, «COLOR» = 1, запустите зональную статистику для каждого. Результаты слияния.
  2. Напишите сценарий или разработайте модель для автоматизации вышеуказанных задач.

Я подозреваю, что это именно то, что zonal statistics 2 делает за кулисами, не знаю, почему это не удается, если только вы не испортили объем обработки и настройки среды размера ячейки или не использовали разные проекции на растре и буферах.