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)
Best Answer
Could you double check the shape file in arcmap, give "open attribute table". Are you seeing all the columns you have added and populated. Because, i have disabled the visibility of few columns through properties -> Fields tab. When I manually tried to create buffer, in the "field" selection, the invisible fields are not available..
So, i guess your problem may be because of this..