AnsweredAssumed Answered

faster script for making polygon from points

Question asked by lmwood on Mar 12, 2013
Latest reply on Mar 12, 2013 by lmwood
I am just curious if any one has any ideas on how this may perform faster as some of these tables can get quite large and at the rate I am going it is not looking good: about 700 recs/hr

1) I have an input .csv file that has four xy or lat lon points per record (Make a copy into gdb for joining to shapefile after conversion)
2) Open and plot 4 points into a feature class
3) Create Min bounding geometry for shapefile
4) append to shapefile so all record geometries in the end are stored into one shapefile.
5) join attributes from table in gdb back to shapefile by oids.

Any input appreciated... originally this was an "ave" script and it is much faster so I am going to take a look at that next for ideas.

import sys, os, csv, datetime, time, string, traceback, arcpy from os.path import splitdrive scriptPath = sys.path[0] (drive,tail) = splitdrive(scriptPath)  # arcpy environments and liscences from arcpy import env from import * arcpy.CheckOutExtension("spatial") arcpy.CheckOutExtension("management") arcpy.env.overwriteOutput = True   # Set the XY Domain to  #   xmin of -180 #   ymin of -90 #   xmax of 180 #   ymax of 90 arcpy.env.XYDomain ="-180 -90 180 90" arcpy.SpatialReference= spRef = "D:/ArcGIS/Desktop10.0/Coordinate Systems/" +\                                     "Geographic Coordinate Systems/World/WGS 1984.prj"   if __name__ == '__main__':          ##Steps to create polygon shapefile from 4 or 2 points hm....     ## 1) get list of 4 points and store in an array by x,y     print drive, tail     arcpy.env.workspace = scriptPath          outFolder = scriptPath     gdb = os.path.join(scriptPath,"temp.gdb")     pointFC = "sample1Test.shp"     csvFile = os.path.join(scriptPath,'test.csv')          #arcpy.CreateFeatureclass_management(outFolder, pointFC, "POINT", "","","","")     #Input table to database     arcpy.TableToTable_conversion(csvFile, gdb, "vegtable")       fieldNames = ['"UL_LON"','"UL_LAT"','"LL_LON"','"LL_LAT"','"UR_LON"','"UR_LAT"','"LR_LON"','"LR_LAT"','"PHOTO_ID"']          print fieldNames[0]     print csvFile     inFile = open(csvFile, "r")     #inFile = open("D:/CreateShape/temp.gdb/vegtable", "r")     headerLine = inFile.readline()     valueList = headerLine.strip().split(",")     print valueList     latIndex = valueList.index(fieldNames[0])     lonIndex = valueList.index(fieldNames[1])     llLatIndex = valueList.index(fieldNames[2])     llLonIndex = valueList.index(fieldNames[3])     urLatIndex = valueList.index(fieldNames[4])     urLonIndex = valueList.index(fieldNames[5])     lrLatIndex = valueList.index(fieldNames[6])     lrLonIndex = valueList.index(fieldNames[7])     photoId = fieldNames[8]     feats = arcpy.ListFeatureClasses()     try:         for feat in feats:             print feat             arcpy.Delete_management(feat)         arcpy.env.workspace = gdb         for feat in feats:             print feat             arcpy.Delete_management(feat)     except:         print "Couldnt be deleted"               #Read each line in the csv file     starttime = time.time()     localtime = time.asctime( time.localtime(time.time()) )     i = 0     #cursor = arcpy.InsertCursor(pointFC)     for line in inFile.readlines():         #print line         fields = line.split(",")         #print fields[0]                  points = "points%s.shp" %(i)         print points         arcpy.CreateFeatureclass_management(outFolder, points, "POINT", "","","","")         #arcpy.MakeFeatureLayer_management()         cursor = arcpy.InsertCursor(points)                  field = line.split(",")         ## 2) create points and append or merge points together in one feature class         latValue = field[latIndex]         lonValue = field[lonIndex]         #print "first point: (%s,%s)" %(latValue,lonValue)         point = arcpy.CreateObject("Point")         point.X = latValue         point.Y = lonValue         feature = cursor.newRow()         feature.shape = point         cursor.insertRow(feature)          lat2Val=field[llLatIndex]         lon2Val = field[llLonIndex]         #print "Second point: (%s)" %lat2Val,lon2Val         point = arcpy.CreateObject("Point")         point.X = lat2Val         point.Y = lon2Val         feature = cursor.newRow()         feature.shape = point         cursor.insertRow(feature)                  lat3Val=field[urLatIndex]         lon3Val = field[urLonIndex]         #print "Third point: (%s)" %lat3Val,lon3Val         point = arcpy.CreateObject("Point")         point.X = lat3Val         point.Y = lon3Val         feature = cursor.newRow()         feature.shape = point         cursor.insertRow(feature)          lat4Val=field[lrLatIndex]         lon4Val = field[lrLonIndex]         #print "Fourth point: (%s)" %lat4Val,lon4Val         point = arcpy.CreateObject("Point")         point.X = lat4Val         point.Y = lon4Val         feature = cursor.newRow()         feature.shape = point         cursor.insertRow(feature)         shpGdb = "%s/temp.gdb/box%s" %(scriptPath, i)         allMerged = "%s/temp.gdb/merged2" %(scriptPath)                  ## 3) perfom minimum bounding box tool by rectangle :)         arcpy.MinimumBoundingGeometry_management(points,shpGdb,"RECTANGLE_BY_AREA", "ALL")         #arcpy.AddField_management(shpGdb, str(photoId), "TEXT", "", "", 25)         #expression = ("\"%s\"") %(field[0])         #arcpy.CalculateField_management(shpGdb, str(photoId), expression, "PYTHON")                  if i == 0:                          arcpy.CopyFeatures_management(shpGdb, allMerged)                                  if i >0:             try:                 arcpy.Append_management(shpGdb,allMerged)                 print "appended?"             except:                 print arcpy.GetMessages()         arcpy.Delete_management(shpGdb)         arcpy.Delete_management(points)                                           i+=1      #arcpy.AddJoin_management(allMerged,"OBJECTID","vegetable", "OBJECTID")     arcpy.JoinField_management(allMerged, "OBJECTID", "vegtable", "OBJECTID")        inFile.close()     endtime = time.time()     totaltime = endtime-starttime     print "\nScript took " + str(totaltime/60) + " minutes to run"