Geometry validation on tables containing ST_Geometry columns
Geometry validation is provided by the ST_Geometry type through the st_shapelib (Oracle) and st_geometry libraries. Once a table is created, data is validated when records are inserted or updated.
There are two main ways to insert data into spatial tables:
- Using accessor functions and applications built using these functions
- Using ArcGIS API and applications built using these API
Accessor functions are defined by each spatial type implementation and may use different methods to validate geometry data. ESRI ST_Geometry accessor functions and ArcGIS API use the ESRI shape library to validate geometry data. Third-party spatial types have their own accessor functions and use their own shape verification rules. Therefore, for shape verification rules for spatial types such as SDO_Geometry, PostGIS geometry, and Microsoft SQL Server geometry or geography, read the Oracle, PostGIS, or SQL Server documentation respectively.
The following rules apply to the ESRI shape library and, consequently, ESRI API and ST_Geometry accessor functions.
Validation rules for point shapes
-
The area and length of points are set to 0.0.
-
A single point's envelope is equal to the point's x,y values.
- The envelope of a multipart point shape is set to the minimum bounding box.
Validation rules for simple lines or linestrings
- Sequential duplicate points are deleted.
- Each part must have at least two distinct points.
- Each part may not intersect itself. The start and end points can be the same, but the resulting ring is not treated as an area shape.
- Parts may touch each other at the end points.
- The length is the sum of all the parts.
Validation rules for lines or spaghetti strings
- Lines can intersect themselves.
- Each part must have at least two distinct points.
- Sequential duplicate points are deleted.
- The length is the sum of all the parts.
Validation rules and operations for area shapes
- Duplicate sequential occurrences of a coordinate point are deleted.
- Dangles are deleted.
- Line segments are verified to be closed (z-coordinates at start and end points must also be the same) and don't cross.
- For area shapes with holes, holes must reside wholly inside the outer boundary. ArcSDE eliminates any holes that are outside the outer boundary.
- A hole that touches an outer boundary at a single common point is converted into an inversion of the area shape.
- Multiple holes that touch at common points are combined into a single hole.
- Multipart area shapes cannot overlap. However, two parts may touch at a point.
- Multipart area shapes cannot share a common boundary. Common boundaries are dissolved.
- If two rings have a common boundary, they are merged into one ring.
- The total geometry perimeter, including the boundaries of all holes in donut polygons, is calculated and stored as the length of the geometry.
- The area is calculated.
- The envelope is calculated.
- The points of an area shape are stored
counterclockwise although the ArcSDE software can return points in
either direction. If you generate an area shape that contains
clockwise coordinates, ArcSDE changes the rotation to ensure that
the coordinate list follows a counterclockwise
direction.
In this example, the starting point is a and the correct coordinate description is a,b,c,d,a.
- An area shape can have inversions, which are empty spaces inside the area shape that touch the outer boundary.
- Inverted area shapes have an interior ring that touches the outer boundary. These are not considered donut polygons.
- When an area shape has a donut hole, the outer boundary is listed first. The points of the holes are stored in opposite direction of the outer boundary.
In the following figure, the outer boundary is described as a,b,c,d,a, and the hole is described as e,f,g,h,e. In the coordinate list, the area shape is stored as a,b,c,d,a,e,f,g, h,e.
- If two holes touch at one point, they are treated as one hole, not two.
In this example, the two inner areas are a single hole because they share a common point, g.
- The combination of area shapes and area shapes with holes can become fairly complex as shown in the next graphic. The outer boundary is a lake with an island. There is a small lake on the island.
It is possible to represent these features as one, two, or three shapes. You could store each feature separately. The larger lake is a donut polygon. The boundary of the large lake is the outer boundary while the island is the boundary of the single donut hole. The island is also a donut polygon. The boundary of the island is the outer boundary while the small lake is the hole. The small lake is a single area shape.
If the lakes are the important features, one shape with a hole represents the big lake, while a second shape represents the small lake. You could also use a multipart area shape to represent the feature. The first shape part is the big lake with a donut hole representing the island. The second part is the small lake.
- Nil shapes act as placeholders; a way to have an attribute row without a corresponding geometry. One example that would result in a nil shape is a request for the intersection of two nonintersecting areas.
Because areas A and B do not touch, the result of an intersection query produces an empty geometry.
- Shapes have dimensions. A shape with only x,y-coordinates is considered two-dimensional. A shape that has z-coordinates or measures is three-dimensional. A shape can also have a nil measure.
Spatial reference ID
If you try to insert a value that has coordinates that are outside the bounds of the spatial reference ID (SRID) provided and with which the table was created, the INSERT statement fails with a message similar to the ones listed here:
DBMS | Error message |
---|---|
Oracle | ERROR at line 1: ORA-20004: Error generating shape from text (-112) ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 42 ORA-06512: at "SDE.ST_POLYGON", line 69 ORA-06512: at line 1 |
PostgreSQL | ERROR: ESRI: error generating shape [-112]: |
Informix | SQL Error (-937): Coordinates out of bounds in ST_PolyFromText. |
DB2 | GSE3416N Coordinate out of bounds |