将列表位置作为参数送入arcpy.SymDiff_analysis函数

时间:2019-03-13 15:13:36

标签: python arcpy

python的新手。 我有两个要素数据集,分别具有5个要素类的输入要素(NewDemoFC)和更新要素(ExistingFC)。一组包含已删除的功能,另一组包含所有活动的功能。目的是比较这两个对象,以及将已删除要素(来自NewDemoFC)与活动要素(来自ExistingFC)重叠的位置进行比较,删除重叠的活动要素(来自ExistingFC)并输出新的要素类。

我想使用while函数,并且能够从列表中为输入要素和更新要素参数提供特定位置。还希望保持相同的名称和输出要素类名称的顺序。

尝试使用多个文件作为SymDiff_analysis工具来获取具有多个文件的数据集的以下模型的结果不适用于多个FC作为输入,除非您将每个要素类添加为行项,指定输入,输出和任何中间临时文件。对于具有100个奇特要素类的数据集,这是不切实际的。

enter image description here

代码不正确

# 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

我得到的错误是

  
    
      

回溯(最近通话最近):         在OnFileRun中,文件“ C:\ Python27 \ ArcGIS10.5 \ Lib \ site-packages \ pythonwin \ pywin \ framework \ intpyapp.py”,第345行           scriptutils.RunScript(None,None,showDlg)         在RunScript中,文件“ C:\ Python27 \ ArcGIS10.5 \ Lib \ site-packages \ pythonwin \ pywin \ framework \ scriptutils.py”,第353行           del 主要文件       AttributeError:文件       5       [u'Demo_New_UTILITYPOINT',u'Demo_New_ROADPOINT',u'Demo_New_AIRPORTSIGN',u'Demo_New_AIRPORTCONTROLPOINT',u'Demo_New_AIRFIELDLIGHT']       5       [u'UtilityPoint',u'RoadPoint',u'AirportSign',u'AirportControlPoint',u'AirfieldLight']       追溯(最近一次通话):         在RunScript中,文件“ C:\ Python27 \ ArcGIS10.5 \ Lib \ site-packages \ pythonwin \ pywin \ framework \ scriptutils.py”,第326行           exec codeObject位于主要中。 dict         文件“ T:\ Data \ GOAA \ eALPUpdates \ Point_2-SymmetricalDifferenceOnly.py”,第41行,在           arcpy.SymDiff_analysis(NewDemoFC [i],ExistingFC [i],E_PointFeatures_ActiveOnly [i],“ ALL”,“ 0.01 Feet”)       IndexError:列表索引超出范围       [Dbg] >>>

    
  

1 个答案:

答案 0 :(得分:0)

您要做的是使用一个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)

此代码可能比 更为冗长,但是这样做意味着您可以避免一遍又一遍地更改全局env变量-这是一项冒险的业务,因为它引起的错误确实很困难有时可以诊断-并且使您的代码可重用。还要注意,它消除了使用“手动”计数器(i)的需要。希望能帮助到你!我建议先在测试数据上测试代码。