Присоединение .dbf к .shp -Тогда сценарий вычисления полей - PullRequest
2 голосов
/ 11 октября 2011

Я создал простой скрипт для соединения .dbf с .shp, а затем вычислил несколько полей.Сценарий работает отлично, но если по какой-то причине нет соединения, я получаю следующую ошибку, которая завершает работу сценария, прежде чем пытаться соединить остальные .dbf с .shp в моем рабочем каталоге.Как я могу сказать сценарию игнорировать .shps, которые не присоединяются, и продолжать работать с остальными .shps в каталоге?

строка 20, в gp.CalculateField_management ("parcs"," APN2 "," [TAX.PARCEL_ID] ") ExecuteError: ОШИБКА 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]") 

Ответы [ 3 ]

0 голосов
/ 12 октября 2011

Вы можете попробовать приведенный ниже код, который будет просто игнорировать любую ошибку во время выполнения функций Join или Calculation the Field и переходить к следующей итерации цикла. Это может сойти с рук, если вы пишете «одноразовый» сценарий, однако, если вы собираетесь использовать сценарий в будущем или хотите поделиться им с другими, вам следует выяснить, почему параметр [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)

Возможно, вы захотите попробовать приведенный ниже синтаксис, исходящий непосредственно из документов .

gp.CalculateField_management("parcs", "APN2", "!TAX.PARCEL_ID!", "PYTHON")
0 голосов
/ 06 января 2012

Есть ли у вас доступ к arcpy (arcGIS 10)?

Я знаю, что в arcGIS 10 в ArcGIS Toolbox есть инструмент Join_Field, с помощью которого вы можете присоединить все поля dbf к shp на основе поля уникального идентификатора некоторого типа.

0 голосов
/ 11 октября 2011

У меня нет доступа к машине Windows с ArcGIS, поэтому я не могу проверить это, но, вообще говоря, вы ловите исключение и решаете, что с ним делать ... Например

# 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, чтобы иметь возможность помочь вам в этом вопросе ...

...