如何解决概念问题:可变的缓冲区分析大小取决于文件类型吗?
启发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
领土内,则只希望跳过要素类,以便将其忽略。 -
最后:
fc
中的每个allfc
将通过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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。