【问题标题】:Join .dbf to .shp -Then Calculate Fields Script - ERROR handling, script quits on no join将 .dbf 加入 .shp -然后计算字段脚本 - 错误处理,脚本在未加入时退出
【发布时间】:2011-12-05 11:04:23
【问题描述】:

我创建了一个简单的脚本来将 .dbf 连接到 .shp,然后计算一些字段。该脚本运行良好,但如果由于某种原因没有加入,我会收到以下错误,该错误会在尝试将 .dbf 的其余部分加入我的工作目录中的 .shp 之前关闭脚本。如何让脚本忽略未加入的 .shps,并继续处理目录中的其余 .shps?

第 20 行,在 gp.CalculateField_management("parcs", "APN2", "[TAX.PARCEL_ID]") ExecuteError: ERROR 999999: 执行函数时出错。使用了无效的 SQL 语句。 使用了无效的 SQL 语句。

这是脚本:

# Create the geoprocessor object
gp = arcgisscripting.create(9.3)
gp.OverWriteOutput = True

# Set the workspace. List all of the folders within
gp.Workspace = "C:\JoinCalculateBatch"
fcs = gp.ListWorkspaces("*","Folder")

for fc in fcs:
    print fc
    gp.MakeFeatureLayer(fc + "\\Parcels.shp", "parcs")  
    joinTable = (fc + "\\TAX.dbf")
    gp.AddJoin_management("parcs", "APN", joinTable, "PARCEL_NUM")  
    gp.CalculateField_management("parcs", "APN2", "[TAX.PARCEL_ID]")  
    gp.CalculateField_management("parcs", "SIT_FULL_S", "[TAX.SITADDRESS]") 

【问题讨论】:

    标签: python join error-handling arcgis


    【解决方案1】:

    您可以尝试下面的代码,该代码将简单地忽略您加入或计算字段函数期间的任何错误,并继续循环的下一次迭代。如果您正在编写“一次性”脚本,您可能会侥幸成功,但是如果您打算在将来使用该脚本或打算与其他人共享它,您应该弄清楚为什么 [TAX.PARCEL_ID] 参数会抛出 SQL错误并修复它。

    话虽如此,如果没有看到您的表格和 shapefile,就很难确定究竟是什么导致了您的错误。将 Parcels.shp 和 Tax.dbf 提取到 ArcMap 中,加入它们,然后尝试使用计算字段工具查看参数是否正确,这可能会对您有所帮助。

    for fc in fcs:
        print fc
        gp.MakeFeatureLayer(fc + "\\Parcels.shp", "parcs")  
        joinTable = (fc + "\\TAX.dbf")
    
        try:
            gp.AddJoin_management("parcs", "APN", joinTable, "PARCEL_NUM")  
            gp.CalculateField_management("parcs", "APN2", "[TAX.PARCEL_ID]")  
            gp.CalculateField_management("parcs", "SIT_FULL_S", "[TAX.SITADDRESS]")
        except:
            print 'Join or Calculate Field did not work for %s.' % (fc)
    

    您可能想尝试以下直接来自docs 的语法。

    gp.CalculateField_management("parcs", "APN2", "!TAX.PARCEL_ID!", "PYTHON")
    

    【讨论】:

    • 捕获所有异常通常是一个非常糟糕的主意,即使对于一次性脚本也是如此。捕获特定异常会好得多。否则,调试你的问题会变得很头疼……
    • 感谢您的帮助,我现在将捕获所有异常。
    【解决方案2】:

    我无法访问装有 ArcGIS 的 windows 机器,所以我无法对此进行测试,但一般来说,你 catch an exception and decide what to do with it... 例如

    # Create the geoprocessor object
    gp = arcgisscripting.create(9.3)
    gp.OverWriteOutput = True
    
    # Set the workspace. List all of the folders within
    gp.Workspace = "C:\JoinCalculateBatch"
    fcs = gp.ListWorkspaces("*","Folder")
    
    for fc in fcs:
        print fc
        gp.MakeFeatureLayer(fc + "\\Parcels.shp", "parcs")  
        joinTable = (fc + "\\TAX.dbf")
        try:
            gp.AddJoin_management("parcs", "APN", joinTable, "PARCEL_NUM")  
            gp.CalculateField_management("parcs", "APN2", "[TAX.PARCEL_ID]")  
            gp.CalculateField_management("parcs", "SIT_FULL_S", "[TAX.SITADDRESS]") 
        except ExecuteError:
            print 'Could not join', fc
    

    我上面写的完全行不通。 ExecuteError 不是一个正常的 python 错误,它是一些 ArcGIS 特定的错误模块。你可能需要这样的东西:

    except gp.ExecuteError:
        ...
    

    但是,我对 Arc 不够熟悉,无法在这方面为您提供帮助...

    【讨论】:

    • 感谢您的帮助,我应该知道这一点。
    【解决方案3】:

    您可以访问 arcpy (arcGIS 10) 吗?

    我知道在 arcGIS 10 中,arcGIS 工具箱中有一个 Join_Field 工具,您可以使用它基于某种类型的唯一 ID 字段将 dbf 的所有字段连接到 shp。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多