Hey,
I'm trying to add new rows into empty polygon feature.
this is the code:
try:
cur = arcpy.da.InsertCursor(outshp, ["Id" , 'Floor_area'])
file = open(csvfile)
reader = csv.reader(file)
line = next(reader)
cnt = 0
for line in reader:
new_row = [line[0]]
points = []
for i in line[1:]:
p = i.split(',')
point = arcpy.Point(p[0], p[1])
points.append(point)
arr = arcpy.Array(points)
polygn = arcpy.Polygon(arr)
new_row.append(polygn)
cur.insertRow(new_row)
cnt += 1
del cur
except:
traceback.print_exc()
del cur
sadly, I'm getting this error:
Traceback (most recent call last): File "<ipython-input-8-44580ffd528c>", line 21, in <module> cur.insertRow(new_row) TypeError: value #1 - unsupported type: Polygon
Solved! Go to Solution.
Thank to some of the advices here the error has been resolved, but the feature don't includes coordinates and doesn't appear on the map... i can't really understand why.
this is all of the code:
import csv
import arcpy
import traceback
#Create Polygon layer from csv table
csvfile = r'C:\Geography\Spatial Python\final\Final_Ex\Buildings_alternative_2.csv'
outpath = r'C:\geography\Spatial Python\final'
outshp = 'test.shp'
outshp = arcpy.CreateFeatureclass_management (
outpath, outshp, geometry_type='POLYGON',
spatial_reference=arcpy.SpatialReference(4326))
arcpy.AddField_management (outshp, 'Floor_area', "LONG")
arcpy.AddField_management (outshp, 'SHAPE@', "DOUBLE")
try:
cur = arcpy.da.InsertCursor(outshp, ["Id" , 'Floor_area', 'SHAPE@'])
file = open(csvfile)
reader = csv.reader(file)
line = next(reader)
cnt = 1
for line in reader:
new_row = [cnt, line[0]]
points = []
for i in line[1:]:
p = i.split(',')
point = arcpy.Point(p[0], p[1])
points.append(point)
arr = arcpy.Array(points)
polygon = arcpy.Polygon(arr)
new_row.append(polygon)
cur.insertRow(new_row)
cnt += 1
del cur
except:
traceback.print_exc()
del cur
the table includes the 'floor area' field but not the spatial data.
Could you post some sample rows from the CSV?
It's hard to get the full picture of what's happening with this screenshot. It would help if you could post the raw text of a few rows (with header row).
From what I can see here, column A is your "Id" field? Is there a variable number of point coordinate columns? Also, I see you're creating a "SHAPE@" field in the shapefile. That's not how that's intended to work. It's what's called a field token. It's not a field name that actually exists.
InsertCursor—ArcMap | Documentation (arcgis.com)
Here's some updated code but I'm not certain it will solve your problem.
import csv
import arcpy
import traceback
#Create Polygon layer from csv table
csvfile = r'C:\Geography\Spatial Python\final\Final_Ex\Buildings_alternative_2.csv'
outpath = r'C:\geography\Spatial Python\final'
outshp = 'test.shp'
try:
outshp = arcpy.CreateFeatureclass_management(
outpath, outshp, geometry_type='POLYGON',
spatial_reference=arcpy.SpatialReference(4326)
)
arcpy.AddField_management (outshp, 'Id', "TEXT")
arcpy.AddField_management (outshp, 'Floor_area', "DOUBLE")
with open(csvfile, "r") as csv_reader:
with arcpy.da.InsertCursor(outshp, ["Id", "Floor_area", 'SHAPE@']) as cur:
for csv_line in csv_reader:
polygon_points = []
for point in line[1:]:
x, y = point.split(",")
point_geometry = arcpy.Point(x, y)
polygon_points.append(point_geometry)
polygon_geometry = arcpy.Polygon(arcpy.Array(polygon_points))
polygon_geometry_sqft = polygon_geometry.getArea(units="SQUAREFEET")
cur.insertRow((csv_line[0], polygon_geometry_sqft, polygon_geometry))
except:
traceback.print_exc()
Try grabbing a single row of point coordinates from your CSV and hard coding them into your script (no CSV looping). Use those values to try inserting a single record into the shapefile. Start small to troubleshoot.
thease are the first 2 rows, the coloumns are from left to right:
180 | 178168.85730000027,642304.1140000001 | 178228.20880000014,642355.0789000001 | 178319.57019999996,642248.6835999992 | 178260.21879999992,642197.7185999993 | 178168.85730000027,642304.1140000001 |
180 | 178303.8627000004,642163.7553000003 | 178358.5828999998,642219.6634999998 | 178458.8058000002,642121.5704999994 | 178404.08559999987,642065.6622000001 | 178303.8627000004,642163.7553000003 |
Column A is Floor area and the rest are coodinates (x,y in every cell). the Id added automatically to the table, i'm not sure how but i can see that on arcGis pro. The variable for the id it "cnt".
there are varaibles for the coordinates and i'm looping on them here:
for p in line[1:]: #looping the coordinates in every line
pnt = p.split(',') #split x and y coordinates
point = arcpy.Point(pnt[0], pnt[1]) #create a point feature
points.append(point) #add to the point list
arr = arcpy.Array(points)
polygon = arcpy.Polygon(arr)
new_row.append(polygon)
cur.insertRow(new_row)
cnt += 1
del cur
I'm not familiar with the commands you wrote in the code, but the table i get is partial and i get this error:
File "<ipython-input-26-e60a0c54162d>", line 17, in <module>
arcpy.AddField_management (outshp, 'Id', "TEXT")
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\management.py", line 4337, in AddField
raise e
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\management.py", line 4334, in AddField
retval = convertArcObjectToPythonObject(gp.AddField_management(*gp_fixargs((in_table, field_name, field_type, field_precision, field_scale, field_length, field_alias, field_is_nullable, field_is_required, field_domain), True)))
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\geoprocessing\_base.py", line 511, in <lambda>
return lambda *args: val(*gp_fixargs(args, True))
arcgisscripting.ExecuteError: Failed to execute. Parameters are not valid.
ERROR 000012: Id already exists
Failed to execute (AddField).
Turns out that the problem was with the projection.
thanks for the help.
this is the code that works:
import csv
import arcpy
import traceback
#Create polygon feature from csv file
csvfile = r'C:\Geography\Spatial Python\final\Final_Ex\Buildings_alternative_2.csv'
outpath = r'C:\geography\Spatial Python\final'
outshp = 'build.shp'
outshp = arcpy.CreateFeatureclass_management (
outpath, outshp, geometry_type='POLYGON',
spatial_reference=arcpy.SpatialReference(2039))
arcpy.AddField_management (outshp, 'Floor_area', "LONG") #add field for Floor area
try:
cur = arcpy.da.InsertCursor(outshp, ['Id', 'Floor_area', 'SHAPE@'])
f = open(csvfile)
reader = csv.reader(f)
lne = next(reader)
cnt = 1
for line in reader: #looping lines in the csv file
new_row = [cnt, line[0]] # index of the row and the floor area field
points = []
for p in line[1:]: #looping the coordinates in every line
pnt = p.split(',') #split x and y coordinates
point = arcpy.Point(float(pnt[0]), float(pnt[1])) #create a point feature
points.append(point) #add to the point list
arr = arcpy.Array(points)
polygon = arcpy.Polygon(arr)
new_row.append(polygon)
cur.insertRow(new_row)
cnt += 1
del cur