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.
OrRubinstein_0-1626280643737.png
Could you post some sample rows from the CSV?
OrRubinstein_0-1626280969553.png
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