One of the Spatial Analyst tools we often use in ArcGIS is the “Extract Values to Points” tool. This allows us to take a point file (well locations in our case) and attach a value (elevations) from a raster image (a DEM) to each point.
Today I was running it for the first time against an Image Service we recently published and I received a warning message,”WARNING 000957: Skipping feature(s) because of NULL or EMPTY geometry”. But the script seemed to run and the final results said “Succeeded” so I thought it was probably fine. But as I double-checked, I realized the results were wonky.
Turns out that I had two records with Null geometry in my point file of 397 records. These two records threw the above error but actually had a value in the [Rastervalu] field. Turns out all 397 records had values. These two records were consecutive–let’s say the 100th and 101st records in my shapefile. What happened is record 100 got the value for record 102, record 101 get the value for 103, record 102 (which has valid geometry) had the value for 104. This pattern, each record having the value for the record 2 place after it, continued until record 396 which had the value for record 397. Record 397 also had the value for 397. So the final three records all had the value for the final record.
What I would have expected would be for the two records with Null Geometry to have null values in the [Rastervalu] field and the rest of the records to have the correct values. Despite the warning, it is very misleading for all the records to end up with a value.
I have a simplified example below. I made a point shapefile with four records. The first, third, and fourth records have valid geometries; the second has Null geometry. The second record ends up with the value for the third record. The third record, has the value for the fourth. The fourth record being the last record, ends up with the last valid value, which was its own.
The results that I would have hoped for would be for the third record to have a Null value.
The way I envision what is occurring behind the scenes is this: the process makes a list (more of a stack in programming terms) of result values as it processed the points but just assumes that every record will return a value so it does not track which value goes with which shape.
When it reached the two null geometries, it threw an error but continued on. It did not add a value for these records to the stack of values–when it comes across records with valid geometry but do not intersect the raster it adds a psuedo-null value of (-9999) to the stack. After it processed all the records it had 395 values in the stack. It then went, one-by-one through the stack and populated the records in the output shapefile, the first record got the first value in the stack, the second record got the second value, the 100th record got the 100th value (which came from the location of the 102nd record) and so on. At the end, the final two records received the last valid value.
This final behavior–using the last valid value–corresponds a bit to a behavior we’ve seen with ArcObjects in general. When iterating through a table, if a field is Null for a specific row, the value from the last non-Null value for that field is often returned.
I’m in the process of submitting a bug to ESRI. I’m not sure if this existed prior to ArcGIS 10.0 (I’m guessing it did) or if it occurs in other processes (I’m guessing it does). I did find out that the “Extract Multi Values to Points” works as expected. I’m guessing it is because unlike the “Extract Values to Points” which creates a new shapefile, this tool appends fields to the existing shapefile and presumably processes records one-by-one without putting the results in a virtual stack. The “Extract Multi Values to Points” tool also does not throw any warnings.