2011-10-11 49 views
2

我创建了一个简单的脚本来将.dbf加入.shp,然后计算几个字段。该脚本效果很好,但如果由于某种原因没有连接,我会遇到以下错误,它会在尝试将剩余的.dbf添加到我的工作目录中的.shp连接之前关闭该脚本。我如何告诉脚本忽略不加入的.shps,并继续处理目录中剩余的.shps?使用错误执行function.An无效SQL语句:将.dbf加入.shp - 然后计算字段脚本 - 错误处理,脚本退出时没有加入

线20,在 gp.CalculateField_management( “PARCS”, “APN2”, “[TAX.PARCEL_ID]”) ExecuteError:ERROR 999999。 使用了无效的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]") 

回答

0

我没有访问到Windows机器使用ArcGIS,所以我不能对此进行测试,但总体来讲,你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: 
    ... 

不过,我没有足够弧形熟悉,能够帮助您在这方面...

+0

感谢您的帮助,我应该知道这一点。 –

0

你可以试试下面的代码,这将根本在加入或计算字段函数期间忽略任何错误,并继续下一次迭代。如果您正在编写“一次性”脚本,则可能会忽略此操作,但是如果您打算在将来使用该脚本或打算与其他人共享该脚本,则应该弄清楚为什么[TAX.PARCEL_ID]参数会引发SQL错误并修理它。

这样说,没有看到你的表和形状文件,很难确定究竟是什么导致你的错误。将您的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") 
+0

捕捉所有异常通常是一个非常糟糕的主意,即使是一次性脚本。捕捉特定的异常要好得多。否则,调试你的问题将成为一个真正的头痛...... –

+0

感谢您的帮助,我现在只是捕捉所有例外。 –

0

你有权访问arcpy(arcGIS 10)吗?

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