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.
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
I'm finding the code very hard to read without indentation.
Sorry, had trouble copying the code/
here it is:
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
you don't provide a value for your "Id" just for the polygon..
i rewrote it:
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 = [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)
polygn = arcpy.Polygon(arr)
new_row.append(polygn)
cur.insertRow(new_row)
cnt += 1
del cur
except:
traceback.print_exc()
del cur
but when I do provide value for Id get another error:
Traceback (most recent call last):
File "<ipython-input-9-a3290e7f669b>", line 21, in <module>
cur.insertRow(new_row)
TypeError: sequence size must match size of the row
check the examples in InsertCursor—ArcGIS Pro | Documentation
example 3 is what you are providing... just a shape, but you need to provide an Id value since you specified it in your fields
["Id" , 'Floor_area']
Code formatting ... the Community Version - Esri Community will help with that and provide line numbers
First, I recommend using a with statement for opening files and cursors so they get closed automatically when exiting (with or without an error). Second, it looks like you're trying to insert a row with polygon geometry (shape) without specifying a shape field when you open the cursor. If Floor_area is just that, a double field representing the area measurement of a polygon, that's what you need to insert.
try:
cnt = 0
with open(file, "r") as csv_reader:
with arcpy.da.InsertCursor(outshp, ["Id", "Floor_area"]) 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))
cnt += 1
except:
traceback.print_exc()
If you do want to insert the polygon shape, you'll need to include "SHAPE@" in the fields and add the polygon_geometry into the values for insertRow().
Thanks.
'Floor area' field is actully not a geometry field, so I edite it:
try:
cnt = 0
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))
cnt += 1
except:
traceback.print_exc()
but now i get this:
Traceback (most recent call last):
File "<ipython-input-40-433ebdb7888e>", line 12, in <module>
polygon_geometry_sqft = polygon_geometry.getArea(units="SQUAREFEET")
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\arcobjects\arcobjects.py", line 1609, in getArea
return convertArcObjectToPythonObject(self._arc_object.GetArea(*gp_fixargs((method, units))))
TypeError: Invalid geometry type for method
If you add SHAPE@ to the InsertCursor, you'll also need to include a value for that when you call insertRow(). Line 13 should be
cur.insertRow((csv_line[0], polygon_geometry_sqft, polygon_geometry))
As for the TypeError: Invalid geometry type for method, make sure the points in your CSV make a valid polygon. Alternatively, just leave out Floor_area completely, then calculate that field after you've inserted all the new features.