微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

概念问题:可变的缓冲区分析大小取决于文件类型吗?

如何解决概念问题:可变的缓冲区分析大小取决于文件类型吗?

启发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对象出来。假设这是一条折线。然后,您从头开始再次遍历allfc,并且d.shapeType == "Polyline"为true(即使循环中的第一个要素类实际上是多边形)。因此,循环将d设置为300 Meters,然后执行Buffer操作。循环然后转到第二要素类,但是d现在是字符串(300 Meters)而不是Describe对象,因此对于列表中的其余要素类将无法正常工作。

  4. 在检查它是否是多点时,应使用elif(如果不是,则使用{else if“)而不是else。实际上,您可以只使用if,但是-如果您在else领土内,则只希望跳过要素类,以便将其忽略。

  5. 最后: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 举报,一经查实,本站将立刻删除。