Null/Empty Geometry in Python

7230
18
08-16-2016 07:05 AM
LeeGodfrey1
New Contributor

I have a series of Feature Classes ( Polyline/arc type) that have no Geometry associated with them. They have been converted through multiple different systems ( Mid Miff, Cable Cad ( custom viewer) and now GDB)  and it was lost along the way. This is just part of the process unfortunately, and has been identified with this old set of data for years.

If I load the feature class into ArcMap and zoom to layer, nothing is visible, they have shape length of zero, going to individual ones displays nothing, as expected of having no Geometry and no shape length.
However, I can add a Double field for XCoord and YCoord, and using Calculate Geometry I can get the coordinate values for the midpoint of the line. Which allows me to then export the data out to a table, and then using display XY Coordinates I can see the locations with the associated attributes. This is the end goal of what I want, and manually in ArcMap it works.

My issues is that I have hundreds of these, and I am attempting to automate the process using Python.

I have attempted to get midpoint using: Midpoint = Feature.shape.positionAlongLine(0.50,True).firstPoint    however this does not work because it states that I have Null or Empty geometry.

The below works, in that it will at least read the features, but it still returns values of None for the coordinates ( even though when I manually try in ArcMap I get values)

            fields = ["SHAPE@XY","X","Y"]

            with  arcpy.da.UpdateCursor(path,fields) as cursor:
               for row in cursor:
                   x,y = row[0]
                    print("{},{}".format(x,y))
                   row[1] = x
                   row[2] = y
                   cursor.updateRow(row)

I am wondering if anyone has had any success with dealing with Null/Empty Geometries in Python coding.

Thank you anyone for your assistance

I have attached a sample of the data below in a zipped GDB.

0 Kudos
18 Replies
DanPatterson_Retired
MVP Emeritus

try Shape@ if they are polyline or polygons (and I think even points), the centroid of the geometry will be returned IF it can be returned

0 Kudos
LeeGodfrey1
New Contributor

I have tried Shape@XY, it will successfully read each line of the feature,

but it is still unable to assign the coordinate to it. When I use calculate

geometry manually in ArcMap it will assign it to them, so it does exist

somewhere, but unfortunately Shape@ does not pick them up. thank you though.

0 Kudos
JakeSkinner
Esri Esteemed Contributor

Hi Lee,

Have you tried the add XY Coordinates tool?

0 Kudos
LeeGodfrey1
New Contributor

I have tried Add XY Coordinates, it does not work because they are

polylines unfortunately. Thank you though.

0 Kudos
XanderBakker
Esri Esteemed Contributor

In case that you select a feature (from the attribute table) and you can zoom at, and it shows the selection in the map, but not the feature itself, you may want to check if the Spatial Index is valid. At least this has happened to me, when using an Enterprise geodatabase (Oracle in this case). 

Is it possible to attache a small sample of the data to run some tests?

0 Kudos
LeeGodfrey1
New Contributor

Hello Xander,

I did some checks with spatial index in trying to validate it but had no changes. I have attached a GDB that is some of the original data that I haven't done any tests on.

- Lee

0 Kudos
XanderBakker
Esri Esteemed Contributor

I just started an edit session and I notice that the geometries I have tested consist of two points and have the same start and end point:

That yields the SHAPE_Length is 0 and in some operations the geometry will not be considered valid. 

If I run this code:

fc = r'D:\Xander\GeoNet\XYvalues\gdb\ESRIForumSampleDataSet_Lee.gdb\POLE_arc'
with arcpy.da.SearchCursor(fc, ('SHAPE@')) as curs:
    for row in curs:
        polyline = row[0]
        print polyline.firstPoint.X, polyline.firstPoint.Y, polyline.lastPoint.X, polyline.lastPoint.Y, polyline.length

It will yield, X and Y of the firstPoint, X and Y of the lastPoint and the length of the line:

272575.775391 741323.871826 272575.775391 741323.871826 0.0
272542.675415 741357.241821 272542.675415 741357.241821 0.0
272536.0354 741340.311829 272536.0354 741340.311829 0.0
272460.255432 741441.681824 272460.255432 741441.681824 0.0
272364.155396 741540.721802 272364.155396 741540.721802 0.0

You can see start and end are the same and the length is 0.

RebeccaStrauch__GISP
MVP Emeritus

Sounds to me like those are points...not lines.

Same start/end with length..poly.    Same start/end no length...point.   

   From my coverage "daze"  

0 Kudos
LeeGodfrey1
New Contributor

That's great, thank you. I hadn't thought to look for just the first point in the line as all the other work in these datasets was set for the midpoint. Very helpful 🙂

0 Kudos