Python 馈送列表位置作为arcpy.SymDiff_分析函数的参数

Python 馈送列表位置作为arcpy.SymDiff_分析函数的参数,python,arcpy,Python,Arcpy,python新手。 我有两个要素数据集,输入要素(NewDemoFC)和更新要素(ExistingFC),每个都有5个要素类。一组包含已拆除的要素,另一组包含所有活动要素。目的是比较这两个要素,并在拆除的要素(来自NewDemoFC)与活动要素(来自现有FC)重叠的地方,删除重叠的活动要素(来自现有FC)并输出新要素类 我想使用while函数,并且能够从列表中为输入特性和更新特性参数提供特定位置。还希望保持输出要素类名称的相同名称和顺序 对于具有多个文件作为SymDiff_分析工具的数据集,尝试

python新手。 我有两个要素数据集,输入要素(NewDemoFC)和更新要素(ExistingFC),每个都有5个要素类。一组包含已拆除的要素,另一组包含所有活动要素。目的是比较这两个要素,并在拆除的要素(来自NewDemoFC)与活动要素(来自现有FC)重叠的地方,删除重叠的活动要素(来自现有FC)并输出新要素类

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

对于具有多个文件作为SymDiff_分析工具的数据集,尝试实现以下模型的结果无法在多个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
#导入arcpy模块
导入arcpy
#设置环境以生成新的输入要素类列表和计数
arcpy.env.workspace=“T:\eALP\u Update.gdb\Point\u DemoNew”
NewDemoFC=arcpy.ListFeatureClasses()
NewDemoFCCount=len(NewDemoFC)
#设置环境以生成现有要素类列表
arcpy.env.workspace=“T:\eALP\u Update.gdb\Point\u InputExisting”
ExistingFC=arcpy.ListFeatureClasses()
E_PointFeatures_ActiveOnly=[]
i=0
#arcpy.env.workspace=“T:\eALP\u Update.gdb\Point\u ActiveExisting”
而我
我得到的错误如下

# 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行 RunScript(无,无,showDlg) RunScript中的文件“C:\Python27\ArcGIS10.5\Lib\site packages\pythonwin\pywin\framework\scriptutils.py”,第353行 delmain文件 AttributeError:文件 5. [u'Demo\u New\u UTILITYPOINT',u'Demo\u New\u ROADPOINT',u'Demo\u New\u AIRPORTSIGN',u'Demo\u New\u AIRPORTCONTROLPOINT',u'Demo\u airpieldlight'] 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行 main中的exec code对象dict 文件“T:\Data\GOAA\eALPUpdates\Point_2-SymmetricalDifferenceOnly.py”,第41行,中 arcpy.SymDiff_分析(新Demofc[i]、现有FC[i]、E_PointFeatures[u ActiveOnly[i]、“全部”、“0.01英尺”) 索引器:列表索引超出范围 [Dbg]>>>


您要做的是使用一个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)的需要。希望有帮助!我建议首先在测试数据上测试代码