0

I'm trying to add new features to a layer based on geometries created from a list of WKTs. The code I have so far:

  • Creates a polygon layer and sets the projection (NAD83)
  • Creates a geometry object (polygon) from using a well-known text (WKT) value, while using the same projection
  • Inserts the geometry into the polygon layer in the SHAPE* field
fc = "Test"
fc_path = gdbfile + "\\Test"
arcpy.CreateFeatureclass_management(gdbfile, fc, "POLYGON", "", "DISABLED", "DISABLED", "", "", "0", "0", "0")
arcpy.management.DefineProjection(fc_path, "GEOGCS['GCS_North_American_1983',DATUM['D_North_American_1983',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
with arcpy.da.InsertCursor(fc_path, ["SHAPE@"]) as cur:
 for rowValue in polygonIncidents:
 shape_insert = arcpy.FromWKT(rowValue["wkts"][0], arcpy.SpatialReference(4269))
 cur.insertRow([shape_insert])

Everything is working as intended up until the row is inserted. The shape insert object has the expected coordinates for the polygon (blue pins below), but when the row is inserted it ends up as a line in the layer (black line below):

enter image description here

If I copy the geometry objects to a new layer using arcpy.Copy_management, everything works as intended - however I need a solution for an existing layer.

The issue seems to be happening somewhere in the insert cursor. Is there a reason the current code is not working? Is there another way to insert rows into an existing layer?

Vince
20.5k16 gold badges49 silver badges65 bronze badges
asked Nov 18, 2022 at 17:02

2 Answers 2

3

You should always specify the SpatialReference at the time of feature class creation, because the Esri spatial reference encompasses much more than just the coordinate reference -- It also imparts resolution and tolerance information appropriate to that coordinate reference. The default SR just assumes Cartesian meters, so just applying the coordinate reference afterward preserves the default "millimeter" XY Units, which collapses the vertices to a 0.001 degree grid (vice the 0.000000001 degree resolution initially set with a geographic coordinate reference).

Also, you should always retrieve the SpatialReference from the target feature class to apply to the arcpy.FromWKT() helper function (or any other Geometry constructor), so that the spatial reference isn't silently transformed when the row is actually inserted.


arcpy.CreateFeatureclass_management(
 gdbfile, fc, "POLYGON", 
 spatial_reference=arcpy.SpatialReference(4269))
sr = arcpy.Describe(os.path.join(gdbfile,fc)).spatialReference
...
 shape_insert = arcpy.FromWKT(rowValue["wkts"][0], sr)

See the Understanding Coordinate Management in the Geodatabase whitepaper for details on the characteristics of a SpatialReference.

answered Nov 18, 2022 at 17:10
0
0

Seeing that only geometries are being created, and not attributed, when inserted into a new feature class, a simpler way to approach this would be to create a Python list of geometries and then just copy them all into a new feature class at the end:

fc = "Test"
fc_path = gdbfile + "\\Test"
SR = arcpy.SpatialReference(4269)
geoms = [
 arcpy.FromWKT(rowValue["wkts"][0], SR)
 for rowValue
 in polygonIncidents
]
arcpy.management.CopyFeatures(geoms, fc_path)
answered Nov 20, 2022 at 19:59

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.