2011-10-11 52 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。