python的新手。 我有两个要素数据集,分别具有5个要素类的输入要素(NewDemoFC)和更新要素(ExistingFC)。一组包含已删除的功能,另一组包含所有活动的功能。目的是比较这两个对象,以及将已删除要素(来自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
我得到的错误是
回溯(最近通话最近): 在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] >>>
答案 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)的需要。希望能帮助到你!我建议先在测试数据上测试代码。