启发Python新手?我正在尝试对一组文件执行大量的缓冲区分析。我正在努力使它,以便选择多段线和多点文件作为缓冲区。到目前为止,我已经准备好了文件并对其进行了描述,这样我就知道该选择哪一个了,但对于如何告诉python只获取多段线和多点,我有什么见解吗?
import arcpy
arcpy.env.overwriteOutput = True
path = "Insert file folder path names here"
arcpy.env.workspace = z = path
allfc = []
for a,b,c in arcpy.da.Walk(x):
for d in c:
allfc.append(a+'/'+d)
print allfc
for fc in allfc:
d = arcpy.Describe(fc)
print "n" + "n"
print d.basename
print d.shapeType
print "n"
for fc in allfic:
if d.shapeType == "Polyline":
d = "300 Meters"
else d.shapeType == "Multipoint":
d = "500 Meters"
arcpy.Buffer_analysis(fc, fc+"_BUF", d, "FULL", "ROUND", "ALL")
这是最后一个让我悲伤的部分,我知道我一定错过了一些显而易见的东西。
有几种不同的方法可以处理逻辑如何在这个过程中流动,进行实验看看是否可以找到其他方法来解决它可能会很有用。然而,以下是我对代码哪里出错以及如何改进的建议。
-
通常,描述性变量名称越多越好。当然,
dist
或desc
的键入时间比d
要长,但您使用d
来处理我在脚本中看到的三个独特的东西,这导致了最后一个for
循环中的一些问题。 -
在最后一个循环中,您循环使用
allfic
而不是allfc
,但这只是一个拼写错误。但即使你解决了这个问题。。。 -
您正在循环使用
for fc in allfc
两次。这意味着您将一直循环使用allfc
,并从中得出d
是循环中最后一个要素类的Describe
对象。假设它是一条折线。然后从一开始再次循环allfc
,d.shapeType == "Polyline"
为true(即使循环中的第一个要素类实际上是多边形(。因此,循环尽职尽责地将d
设置为300 Meters
,然后执行Buffer操作。循环然后转到第二个要素类,但d
现在是一个字符串(300 Meters
(,而不是一个Describe对象,因此对于列表中的其他要素类将永远无法正常工作。 -
当检查它是否是多点时,应该使用
elif
("else-if"(而不是else
。实际上,您可以只使用if
——如果您在else
领域,您只希望跳过要素类,因此可以忽略它。 -
最后:
allfc
中的每个fc
都将通过Buffer
工具发送。(只有多段线和多点可以设置缓冲区距离,但每个要素类都会尝试该操作。如果它是多边形而不是多段线,它只会使用上次循环的距离!(因此,您也需要将该操作放入条件中。
for fc in allfc:
# describe the feature class
d = arcpy.Describe(fc)
print "n" + "n"
print d.basename
print d.shapeType
print "n"
# determine what buffer distance should be
if d.shapeType == "Polyline":
dist = "300 Meters"
if d.shapeType == "Multipoint":
dist = "500 Meters"
# buffer the feature class only if it is the correct shapeType
if d.shapeType == "Polyline" or d.shapeType == "Multipoint":
arcpy.Buffer_analysis(fc, fc+"_BUF", dist, "FULL", "ROUND", "ALL")