Положение списка подачи в качестве параметра функции arcpy.SymDiff_analysis - PullRequest
0 голосов
/ 13 марта 2019

Впервые на питоне.У меня есть два набора классов объектов: функции ввода (NewDemoFC) и функции обновления (ExistingFC) по 5 классов объектов в каждом.Один набор содержит снесенные функции, другой набор содержит все активные функции.Цель состоит в том, чтобы сравнить два и везде, где уничтоженные объекты (из NewDemoFC) перекрываются с активным объектом (из ExistingFC), удалить перекрывающиеся активные объекты (из ExistingFC) и вывести новый класс объектов.

Я хочуиспользовать функцию while и иметь возможность вводить определенную позицию из списка как для входных объектов, так и для обновления параметров объектов.Также хотелось бы сохранить те же имена и порядок имен выходных классов объектов.

Попытка получить результаты приведенной ниже модели для набора данных с несколькими файлами, поскольку инструмент SymDiff_analysis не работает более чем на одном FCв качестве входных данных, если вы не добавите каждый класс пространственных объектов в качестве отдельной позиции, указав входные, выходные и промежуточные временные файлы.Это не практично для набора данных со 100 нечетными классами объектов.

введите описание изображения здесь

КОД КАК ПОД

# Import arcpy module
import arcpy

# Set environment to generate new input feature class list and count 
arcpy.env.workspace = "T:\eALP_Update.gdb\Point_DemoNew"
NewDemoFC = arcpy.ListFeatureClasses()
NewDemoFCCount = len(NewDemoFC)

# Set environment to generate existing feature class list
arcpy.env.workspace = "T:\eALP_Update.gdb\Point_InputExisting"
ExistingFC = arcpy.ListFeatureClasses()

E_PointFeatures_ActiveOnly =  []

i = 0
#arcpy.env.workspace = "T:\eALP_Update.gdb\Point_ActiveExisting"

while i < NewDemoFCCount:

    # Process: Symmetrical Difference (2)
    arcpy.SymDiff_analysis(NewDemoFC[i], ExistingFC[i], E_PointFeatures_ActiveOnly[i], "ALL", "0.01 Feet")
    i = i + 1

ОШИБКА IПОЛУЧИТЬ КАК ПОД

Traceback (последний вызов был последним): файл "C: \ Python27 \ ArcGIS10.5 \ Lib \ site-packages \ pythonwin \ pywin \ framework \"intpyapp.py ", строка 345, в файле OnFileRun scriptutils.RunScript (нет, отсутствует, showDlg), файл" C: \ Python27 \ ArcGIS10.5 \ Lib \ site-packages \ pythonwin \ pywin \ framework \ scriptutils.py ", строка 353В RunScript del main . file AttributeError: file 5u'Demo_New_AIRFIELDLIGHT '] 5 [u'UtilityPoint', u'RoadPoint ', u'AirportSign', u'AirportControlPoint ', u'AirfieldLight'] Traceback (последний вызов был последним): файл "C: \ Python27 \ ArcGIS10.5\ Lib \ site-packages \ pythonwin \ pywin \ framework \ scriptutils.py ", строка 326, в исполняемом коде RunScript exObject в maв . dict Файл "T: \ Data \ GOAA \ eALPUpdates \ Point_2-SymmetricalDifferenceOnly.py", строка 41, в arcpy.SymDiff_analysis (NewDemoFC [i], ExistingFC [i], E_PointFeatures_Active)i], "ALL", "0.01 Feet") IndexError: индекс списка вне диапазона [Dbg] >>>

1 Ответ

0 голосов
/ 19 марта 2019

То, что вы хотите сделать, - это использовать цикл for, который выполняет итерацию по каждому классу пространственных объектов, чтобы избежать нечетного процесса индексации, который происходит внутри вашего вызова arcpy.SymDiff.Например, использование i для индексации E_PointFeatures_ActiveOnly (пустой список) в качестве пути вывода не будет работать.Чтобы сделать это так, как вы хотите, вам нужно динамически генерировать имена файлов.При этом убедитесь, что выходная папка пуста, чтобы избежать конфликтов имен.Код, который у вас есть, также дублирует все для каждой папки, поэтому мы можем определить функции для его устранения, чтобы вы могли легко использовать его повторно.Наконец, вы действительно хотите избежать многократного изменения глобальных переменных, таких как arcpy.env.workspace - приведенная ниже функция для этого действительно многословна, но, поскольку это функция, вам нужно сделать это только один раз!Я предполагаю, что у вас есть доступ к версии arcgis> = 10.1. Следующий код является длинным и непроверенным, но я думаю, что он должен сработать:

import arcpy

arcpy.env.workspace = "T:\eALP_Update.gdb\Point_ActiveExisting"

def getFCs(folderOne, folderTwo):
  """Get feature classes from two folders"""
  from os.path import join
  x = []
  y = []
  folders = [folderOne, folderTwo]
  for folder in folders:
    for paths, directory, filenames in arcpy.da.Walk(
             folder,
             topdown=True,
             followlinks=False,
             datatype='FeatureClass',
             type='ALL'):
      for file in filenames:
        if folder == folder[0]:
          x.append(join(directory, file))
        else:
          y.append(join(directory, file))
  return x, y

def batchSymDiff(inFolder, updateFolder, joinAttr, clusterTolerance):
  """Performs SymDiff analysis for every feature in a set of folders"""
  inFeatures, updateFeatures = getFCs(inFolder, updateFolder)
  for fc1, fc2 in zip(inFeatures, updateFeatures):
    output = fc2.replace(".shp", "_sym.shp") # this naming pattern assumes ".shp" ending
    arcpy.SymDiff_analysis(fc1, fc2, output, joinAttr, clusterTolerance)

# set variables for batch process
inFolder = "T:\eALP_Update.gdb\Point_DemoNew"
updateFolder = "T:\eALP_Update.gdb\Point_InputExisting"
joinAttr = "ALL"
clusterTolerance = "0.01"

# execute batchSymDiff
batchSymDiff(inFolder, updateFolder, joinAttr, clusterTolerance)

Этот код, вероятно, более многословен, чем должен иметь значение , но, делая это таким образом, вы можете избежать многократного изменения глобальных переменных - рискованный бизнес, так как ошибки, которые он вызывает, иногда очень трудно диагностировать - и это делает ваш код многократно используемым.Также обратите внимание, что это устраняет необходимость использования «ручного» счетчика (i).Надеюсь, поможет!Я предлагаю сначала протестировать код на тестовых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...