Solved! Go to Solution.
eucDist.save('dist_%s.tif' %i)
query = '{0} = {1}'.format(arcpy.AddFieldDelimiters(points,'VISITID'),i)
More important than this is the processing time issue. Is there a way I could batch process subsets of my points file and run them simultanously outside of ArcGIS with a Python programme?
One last idea,
how should I change this line
Code:
query = '{0} = {1}'.format(arcpy.AddFieldDelimiters(points,'VISITID'),i)
to change VISITID to the field selected via the tool dialogue box?
query = '{0} = {1}'.format(arcpy.AddFieldDelimiters(points,field),i)
import arcpy, itertools arcpy.env.workspace = r'C:\TEMP\Points_divided' arcpy.env.overwriteOutput = True points = r'C:\TEMP\Address_points.shp' oid = arcpy.AddFieldDelimiters(points, arcpy.Describe(points).oidFieldName) ids = list(r[0] for r in arcpy.da.SearchCursor(points,['OID@'])) sql_dict = {} num = 1000 #splits by every 1000 mini = 0 for key, group in itertools.groupby(ids, lambda k: k//num): maxi = int(max(group)) sql_dict[key] = [mini, maxi] mini += num # Make feature layer lyr = arcpy.MakeFeatureLayer_management(points, 'points_lyr') for v in sql_dict.values(): query = '{0} >= {1} AND {2} <= {3}'.format(oid, v[0], oid, v[1]) print query arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query) arcpy.CopyFeatures_management(lyr, 'points_%s.shp' %int(v[1] +1)) print 'Created points_%s.shp' %int(v[1] + 1) print 'done'
import arcpy from datetime import datetime as d startTime = d.now() arcpy.CheckOutExtension('Spatial') from arcpy.sa import * # set output workspace arcpy.env.workspace = r'C:\TEMP\Output_Rasters' arcpy.env.overwriteOutput = True arcpy.env.nodata = 'NONE' arcpy.env.pyramid = 'PYRAMIDS' # your points points = r'C:\TEMP\Stream_points.shp' # clean up for raster in arcpy.ListRasters('dist_*'): arcpy.Delete_management(raster) # oid field and list of id's field = 'VISITID' ids = list(r[0] for r in arcpy.da.SearchCursor(points,[field])) # loop through table to make a distance raster for each point # EucDIstance(points, max_distance, cell_size) <-- parameters lyr = arcpy.MakeFeatureLayer_management(points, 'points_lyr') for i in ids: query = '{0} = {1}'.format(arcpy.AddFieldDelimiters(points,field),i) arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query) temp_buff = 'buff_%s.shp' %i arcpy.Buffer_analysis(lyr, temp_buff, '120 METERS') extent = arcpy.Describe(temp_buff).extent arcpy.env.extent = extent eucDist = EucDistance(lyr, 100, 10) eucDist.save('dist_%s' %i) arcpy.Delete_management(temp_buff) print 'Created Euclidean Distance raster for point ID: %s' %i print 'Done' print '(Elapsed time: %s)' %(str(d.now() - startTime)[:-3])
Runtime error Traceback (most recent call last): File "<string>", line 32, in <module> AttributeError: DescribeData: Method extent does not exist
Executing: DistanceFromEachPoint C:\TEMP\Points_divided\points_1000.shp C:\TEMP\Points_divided\rasters 100 FEET 10 Start Time: Fri Aug 09 09:36:16 2013 Running script DistanceFromEachPoint... count: 1000 points... buff_dist: 120.0 created euclidean distance template Created ascii templates... processed point ID: 0 processed point ID: 1 processed point ID: 2 processed point ID: 3 .... .... processed point ID: 998 processed point ID: 999 converting ascii files to raster...this may take a while Complete (Elapsed time: 1:05:26.909) Completed script DistanceFromEachPoint... Succeeded at Fri Aug 09 10:41:43 2013 (Elapsed Time: 1 hours 5 minutes 26 seconds)
''' Euclidean distance for individual points- This tool was written for cases where the user wants Euclidean distance rasters for each point in a feature class. This is useful when the neighborhoods will overlap. Written by: Caleb Mackey Date: 8/8/2013 ''' import arcpy, os, shutil, sys arcpy.CheckOutExtension('Spatial') from arcpy.sa import * from datetime import datetime as d startTime = d.now() try: odir = os.path.dirname(__file__) except: odir = os.getcwd() def Message(msg): print str(msg) arcpy.AddMessage(str(msg)) def bufferPointExtent(point_lyr, field, value, distance, units): query = '''{0} = {1}'''.format(field, value) arcpy.SelectLayerByAttribute_management(point_lyr, 'NEW_SELECTION', query) temp_buff = r'in_memory\buff' arcpy.Buffer_analysis(point_lyr, temp_buff, '{0} {1}'.format(distance, units)) ext = arcpy.Describe(temp_buff).extent arcpy.Delete_management(temp_buff) return ext def DistanceFromEachPoint(points, outws, distance, units, cellsize, *args): ''' Params points: points feature class outws: output workspace for euclidean distance rasters distance: distance for euclidean distance tool (units are same as points) i.e. 100 units: linear units (used for buffer) i.e. Feet or Meters ''' # set output workspace arcpy.env.workspace = outws arcpy.env.overwriteOutput = True arcpy.env.nodata = 'NONE' arcpy.env.pyramid = 'PYRAMIDS' SR = arcpy.Describe(points).spatialReference arcpy.env.outputCoordinateSystem = SR ws = os.path.join(odir,'ascii') if not os.path.exists(ws): os.makedirs(ws) # oid field and list of id's oid = arcpy.AddFieldDelimiters(points,arcpy.Describe(points).OIDFieldName) ids = list(r[0] for r in arcpy.da.SearchCursor(points, ['OID@'])) # Make feature and count points lyr = arcpy.MakeFeatureLayer_management(points, 'points_lyr') count = int(arcpy.arcpy.GetCount_management(lyr).getOutput(0)) Message('count: %s points...' %count) # generate template ascii file/prj file buff_dist = float(distance) + (float(cellsize)*2) buff_ext = bufferPointExtent(lyr, oid, min(ids), buff_dist, units) arcpy.env.extent = buff_ext query = '''{0} = {1}'''.format(oid, min(ids)) arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query) sample = EucDistance(lyr, distance, cellsize) eucDist = os.path.join(odir, 'eucDist_tmplt') if arcpy.Exists(eucDist): arcpy.Delete_management(eucDist) sample.save(eucDist) Message('created euclidean distance template') arcpy.env.extent = None # if this is NOT set to none, will cause no selected features # templates ascii = os.path.join(ws, 'ascii_template.txt') arcpy.RasterToASCII_conversion(eucDist, ascii) arcpy.Delete_management(eucDist) prj = ascii[:-4] + '.prj' Message('Created ascii templates...') # Get ascii lines lines = open(ascii,'r').readlines() # Create ascii raster for each point for i in ids: ext = bufferPointExtent(lyr, oid, i, distance, units) if ext: lines[2] = 'xllcorner %s\n' %str(float(str(ext.lowerLeft).split()[0]) - (float(cellsize)*2)) lines[3] = 'yllcorner %s\n' %str(float(str(ext.lowerLeft).split()[1]) - (float(cellsize)*2)) copy = os.path.join(ws, 'tmp_%s.txt' %i) prj_copy = shutil.copy(prj, copy[:-4] + '.prj') with open(copy, 'w') as w: w.writelines(lines) Message('processed point ID: %s' %i) # ascii to raster Message('converting ascii files to raster...this may take a while') arcpy.env.workspace = ws for txt in arcpy.ListFiles('tmp*.txt'): number = int(''.join(n for n in txt if n.isdigit())) out = os.path.join(outws, 'dist_%s' %number) if arcpy.Exists(out): arcpy.Delete_management(out) arcpy.ASCIIToRaster_conversion(txt, out) arcpy.DefineProjection_management(out, SR) arcpy.Delete_management(txt) arcpy.Delete_management(txt[:-4] + '.prj') # delete templates and ascii folder for txt in arcpy.ListFiles('ascii_*'): arcpy.Delete_management(txt) os.rmdir(ws) Message('Complete (Elapsed time: %s)' %(str(d.now() - startTime)[:-3])) if __name__ == '__main__': try: # always try to run as script tool first, otherwise, exception will allow stand alone params # Get params argv = tuple(arcpy.GetParameterAsText(i) for i in range(arcpy.GetArgumentCount())) DistanceFromEachPoint(*argv) except: arcpy.AddMessage('Script Tool failed') arcpy.AddError(arcpy.GetMessages(2)) # stand alone points = r'C:\TEMP\Stream_points.shp' work = r'C:\TEMP\Output_Rasters\ascii_test\Rasters' # run it DistanceFromEachPoint(points, work, 100, 'Feet', 10)
# ascii to raster Message('converting ascii files to raster...this may take a while') arcpy.env.workspace = ws for txt in arcpy.ListFiles('tmp*.txt'): number = int(''.join(n for n in txt if n.isdigit())) out = os.path.join(outws, 'dist_%s' %number) if arcpy.Exists(out): arcpy.Delete_management(out) arcpy.ASCIIToRaster_conversion(txt, out) arcpy.DefineProjection_management(out, SR) arcpy.Delete_management(txt) arcpy.Delete_management(txt[:-4] + '.prj') # delete templates and ascii folder for txt in arcpy.ListFiles('ascii_*'): arcpy.Delete_management(txt) os.rmdir(ws)
I actually only need the ascii file as I can read this into R where I am doing my analysis.
One more note...The lines highlighted in blue may need to be changed to + instead of - depending on the units...I had to subtract 2 cell sizes to make sure it was centered.