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.