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.
# 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)
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)
Runtime error Traceback (most recent call last): File "<string>", line 32, in <module> AttributeError: DescribeData: Method extent does not exist
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])
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?
query = '{0} = {1}'.format(arcpy.AddFieldDelimiters(points,'VISITID'),i)
eucDist.save('dist_%s.tif' %i)
# oid field and list of id's ids = list(r.getValue(field) for r in arcpy.SearchCursor(points))
Is it absolutely necessary to have an individual raster for each point?
Is there any alternative, more efficient way?
import arcpy arcpy.CheckOutExtension('Spatial') from arcpy.sa import * # set output workspace arcpy.env.workspace = r'C:\TEMP\Output_Rasters' arcpy.env.overwriteOutput = True # your points points = r'C:\TEMP\Stream_points.shp' # oid field and list of id's ids = list(r.visitID for r in arcpy.SearchCursor(points)) # 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,'visitID'),i) arcpy.SelectLayerByAttribute_management(lyr, 'NEW_SELECTION', query) eucDist = EucDistance(lyr, 100, 10) eucDist.save('dist_%s' %i) print 'Created Euclidean Distance raster for point ID: %s' %i print 'Done'
Aangemelde leden kunnen berichten plaatsen, updates volgen en meer. Nieuw hier? Registreer een gratis account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.