概念问题:缓冲区分析大小取决于文件类型



启发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")

这是最后一个让我悲伤的部分,我知道我一定错过了一些显而易见的东西。

有几种不同的方法可以处理逻辑如何在这个过程中流动,进行实验看看是否可以找到其他方法来解决它可能会很有用。然而,以下是我对代码哪里出错以及如何改进的建议。


  1. 通常,描述性变量名称越多越好。当然,distdesc的键入时间比d要长,但您使用d来处理我在脚本中看到的三个独特的东西,这导致了最后一个for循环中的一些问题。

  2. 在最后一个循环中,您循环使用allfic而不是allfc,但这只是一个拼写错误。但即使你解决了这个问题。。。

  3. 您正在循环使用for fc in allfc两次。这意味着您将一直循环使用allfc,并从中得出d是循环中最后一个要素类的Describe对象。假设它是一条折线。然后从一开始再次循环allfcd.shapeType == "Polyline"为true(即使循环中的第一个要素类实际上是多边形(。因此,循环尽职尽责地将d设置为300 Meters,然后执行Buffer操作。循环然后转到第二个要素类,但d现在是一个字符串(300 Meters(,而不是一个Describe对象,因此对于列表中的其他要素类将永远无法正常工作。

  4. 当检查它是否是多点时,应该使用elif("else-if"(而不是else。实际上,您可以只使用if——如果您在else领域,您只希望跳过要素类,因此可以忽略它。

  5. 最后: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")

最新更新