Friday, 11 March 2016

python - ArcGIS problem accessing fields attribute table


I encounter a strange problem. I have a simple shapefile to which I added some fields and then populated them.


Now I want to access those fields from a script to run some buffer operations. I want to do this per line segment so I execute a Select_analysis. The tool runs without throwing an exception but not all fields are present in the newly generated shapefile, namely only those from before I added the fields.


For testing purposes I tried to access the fields also with a SearchCursor-method, which returns none. Strange enough when the shape is used within ArcGIS directly everything works fine (Select_analysis, calculating on the newly added fields,...).


Any idea what is going on? Every hint is very much appreciated!


EDIT: I'm using ArcGIS 9.3.1. on WindowsXP. I believe posting the script isn't of much help as the problem seems to be with the ESRI software. But I do it anyway, maybe someone does spot something strange.



 # ---------------------------------------------------------------------------
# zonering_leggerV2.py
# docu still to come...
# ---------------------------------------------------------------------------

# Import system modules
import sys, string, os
from GeoSql import ArcSql
import GIS_tools as gt


# Create the Geoprocessor object
# Geoprocessor-object (ArcMap 9.1 and older)
try:
import win32com.client
gp = win32com.client.Dispatch('esriGeoprocessing.GpDispatch.1')

# Geoprocessor-object (ArcMap 9.2 and newer)
except:
import arcgisscripting
gp = arcgisscripting.create(9.3)



try:
# global gp stettings
gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx")
gp.OverWriteOutput = 1
gp.CheckOutExtension("Spatial")
msg = gp.getMessage(2)
gp.addmessage(msg)


except:
msg = gp.getmessages()
print msg
gp.addmessage(msg)



def buff(source, dest, field_name_zone, side, type_end):


# Process: Buffer (2)...
try:
gp.Buffer_analysis(source, dest, field_name_zone, side, type_end, "NONE", "")
msg = gp.getmessage(2)
print msg, '\n'
except:
msg = gp.getmessages()
print msg, '\n'




def merge(zone_l, zone_r, out_data):
# Process: Merge...
merge_str = "%s;%s" % (zone_l, zone_r)
try:
gp.Merge_management(merge_str, out_data)
msg = gp.getmessage(s)
print msg, '\n'
except:
msg = gp.getmessages()

print msg, '\n'



#------------------------------------------------------------------------------------------------------------
# --> programme parameters

type_end = 'FLAT'
field_name_zone = {'KR': 'KERN_R',
'KL':'KERN_L',

'BR':'BINNEN_R',
'BL': 'BINNEN_L',
'f_name_zone_new': 'code_zone',
'KERN': "_KZ",
'B_BINNENKANT': "_BBI",
'B_BUITENKANT': "_BBU"}

#------------------------------------------------------------------------------------------------------------
#--> file declarations and data gathering


dir_base = "D:\\opdrachten\\legger\\dijkvakken\\"
dir_gp_tmp = dir_base + "gp_tmp\\"

vakken_shp = "%sbijlmerring_042012.shp" % dir_base

column = "PKM_NAME"
#vakken = gt.get_data_from_table(vakken_shp, fields = [column])
vakken = ["A2035-001"]
invalid =('-')


for vak_name in vakken:
if invalid in vak_name:
vak_name_mutat = vak_name.replace(invalid, '_')


selected_vak = "%s%s.shp" % (dir_gp_tmp, vak_name_mutat)

# Local variables...
buffer_KL = "%s%s_%s.shp" % (dir_gp_tmp, vak_name_mutat, field_name_zone['KL'])
buffer_KR = "%s%s_%s.shp" % (dir_gp_tmp, vak_name_mutat, field_name_zone['KR'])

buffer_BR = "%s%s_%s.shp" % (dir_gp_tmp, vak_name_mutat, field_name_zone['BR'])
buffer_BL = "%s%s_%s.shp" % (dir_gp_tmp, vak_name_mutat, field_name_zone['BL'])
#buffer_shapes = [buffer_KL, buffer_KR, buffer_BR, buffer_KL]


dat_zones ={'kern_l': (buffer_KL, field_name_zone['KL'], "LEFT"),
'kern_r': (buffer_KR, field_name_zone['KR'], "RIGHT"),
'binnen_l': (buffer_BL, field_name_zone['BL'], "LEFT"),
'binnen_r': (buffer_BR, field_name_zone['BR'], "RIGHT")}


merge_kern = "%s%s_mergeKern.shp" % (dir_gp_tmp, vak_name_mutat)
merge_binnen = "%s%s_mergeBinnen.shp" % (dir_gp_tmp, vak_name_mutat)

dissolve_kern = "%s%s_dissolveKern.shp" % (dir_gp_tmp, vak_name_mutat)

erase_out = "%s%s_erase.shp" % (dir_gp_tmp, vak_name_mutat)

result_tmp = "%s%s_zones.shp" % (dir_gp_tmp, vak_name_mutat)

sql = ArcSql(column, [vak_name]).statement()

print sql

# Process: Select...
try:
gp.Select_analysis(vakken_shp, selected_vak, sql)
msg =gp.getmessage(2)
print msg, '\n'
except:
msg =gp.getmessages()
print msg




for i in dat_zones.itervalues():
buff(selected_vak, i[0], i[1], i[2], type_end)

merge(dat_zones['kern_l'][0], dat_zones['kern_r'][0], merge_kern)

try:
gp.Dissolve_management (merge_kern, dissolve_kern, column)

msg =gp.getmessage(2)
print msg, '\n'
except:
msg = gp.getmessages()
print msg, '\n'

gt.add_field(dissolve_kern, field_name_zone['f_name_zone_new'], 'TEXT', length_txt='10')
gt.update_fields(dissolve_kern, sql, [field_name_zone['f_name_zone_new']], [field_name_zone['KERN']])

for f in [dat_zones['binnen_l'][0], dat_zones['binnen_r'][0]]:

gt.add_field(f, field_name_zone['f_name_zone_new'], 'TEXT', length_txt='10')
if '_L' in f:
gt.update_fields(f, sql, [field_name_zone['f_name_zone_new']], [field_name_zone['B_BINNENKANT']])
elif '_R' in f:
gt.update_fields(f, sql, [field_name_zone['f_name_zone_new']], [field_name_zone['B_BUITENKANT']])
else:
'error at update field binnenzone...!\n'
sys.exit()



merge(dat_zones['binnen_l'][0], dat_zones['binnen_r'][0], merge_binnen)

try:
gp.erase(merge_binnen, dissolve_kern, erase_out)
msg = gp.getmessage(2)
print msg, '\n'
except:
msg = gp.getmessages()
print msg, '\n'


merge(erase_out, dissolve_kern, result_tmp)


No comments:

Post a Comment