Skip to content

# Geometry Requirements

## Error codes for geometric errors

as defined in the CityGML Quality Interoperability Experiment, chapter 7.5.

Note

The requirements were renamed in CityDoctor to be more human readable. The were renamed according to the error codes.

All the geometric errors are in the "GE" domain. Also, since the geometric validation is performed at 3 different levels (based on the primitives), the requirements also contain the level:

- Ring: R
- Polygon: P
- Shell: S

Error codes follow the same system as the requirements mentioned fundamentals. A violation of each respective data quality requirement should result in an error which must be reported with an error code according to the requirement ID. For each error code, extra information can (and should) be returned. For instance: if a ring is not closed (GE_R_NOT_CLOSED) then the ID of the ring (e.g., its position (first, second..) in the polygon) should be returned; if a polygon is not planar (GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE) then the ID of the polygon and the max. deviation from the reference plane should be returned; or if a shell is not 'watertight' (GE_S_NOT_CLOSED) then the location of the hole(s) should be returned.

## Vertex Requirement

Vertices A and B are the same if the euclidean distance between them is smaller than (minVertexDistance). It is also used to check whether a point is touching an edge. If a point is within minVertexDistance distance to an edge it is considered touching. This parameter is used in multiple checks with the same value:

- R_GE_R_CONSECUTIVE_POINTS_SAME
- R_GE_R_NOT_CLOSED
- R_GE_R_SELF_INTERSECTION
- R_GE_P_INTERIOR_DISCONNECTED

The following requirements are defined for the three respective geometric levels (adopted from Ledoux (2013)):

## Linear Ring

Requirement ID | Description | Error code | Known checks
--- | --- | --- | ---
R_GE_R_TOO_FEW_POINTS | too few points | GE_R_TOO_FEW_POINTS | C_GE_R_TOO_FEW_POINTS
R_GE_R_CONSECUTIVE_POINTS_SAME | 2 consecutive points are the same | GE_R_CONCECUTIVE_POINTS_SAME | C_GE_R_CONCECUTIVE_POINTS_SAME, C_GE_R_DUPLICATE_POINT
R_GE_R_NOT_CLOSED | first-last points are not the same | GE_R_NOT_CLOSED | C_GE_R_NOT_CLOSED
R_GE_R_SELF_INTERSECTION | self-intersects, i.e., a bowtie | GE_R_SELF_INTERSECTION | C_GE_R_SELF_INTERSECTION, C_GE_R_DUPLICATE_POINT
R_GE_R_COLLAPSED_TO_LINE | Currently not in use as it is redundant with R_GE_R_SELF_INTERSECTION is point or line | GE_R_COLLAPSED_TO_LINE | C_GE_R_COLLAPSED_TO_LINE
R_GE_R_ALL | Container for: R_GE_R_TOO_FEW_POINTS, R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION | -- | --

## Polygon

Requirement ID | Description | Error code | Known checks
--- | --- | --- | ---
R_GE_P_INTERSECTING_RINGS | 2+ rings intersect | GE_P_INTERSECTING_RINGS | C_GE_P_INTERSECTING_RINGS
R_GE_P_NON_PLANAR | Non planar polygon, both distance and normal deviation | GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE, GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION | C_GE_P_NON_PLANAR
R_GE_P_INTERIOR_DISCONNECTED | interior is not connected | GE_P_INTERIOR_DISCONNECTED | C_GE_P_INTERIOR_DISCONNECTED
R_GE_P_HOLE_OUTSIDE | 1 or more interior rings are located outside the exterior ring | GE_P_HOLE_OUTSIDE | C_GE_P_HOLE_OUTSIDE
R_GE_P_INNER_RINGS_NESTED | interior ring is located inside other | GE_P_INNER_RINGS_NESTED | C_GE_P_INNER_RINGS_NESTED
R_GE_P_ORIENTATION_RINGS_SAME | exterior and interior rings have same orientation | GE_P_ORIENTATION_RINGS_SAME | C_GE_P_ORIENTATION_RINGS_SAME
R_GE_P_ALL | Container for: R_GE_P_INTERSECTING_RINGS, R_GE_P_NON_PLANAR, R_GE_P_INTERIOR_DISCONNECTED, R_GE_P_HOLE_OUTSIDE, R_GE_P_INNER_RINGS_NESTED, R_GE_P_ORIENTATION_RINGS_SAME, R_GE_R_ALL | -- | --

## Solid / Shell

Requirement ID | Description | Error code | Known checks
--- | --- | --- | ---
R_GE_S_TOO_FEW_POLYGONS | <4 polygons | GE_S_TOO_FEW_POLYGONS | C_GE_S_TOO_FEW_POLYGONS
R_GE_S_NOT_CLOSED | there is 1+ hole(s) on the surface | GE_S_NOT_CLOSED | C_GE_S_NOT_CLOSED
R_GE_S_NON_MANIFOLD_VERTEX | Each shell must be simple | GE_S_NON_MANIFOLD_VERTEX | C_GE_S_NON_MANIFOLD_VERTEX
R_GE_S_NON_MANIFOLD_EDGE | Each edge of a shell should have exactly 2 incident polygons. | GE_S_NON_MANIFOLD_EDGE | C_GE_S_NON_MANIFOLD_EDGE
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS | 1+ polygons not connected to main shell | GE_S_MULTIPLE_CONNECTED_COMPONENTS | C_GE_S_MULTIPLE_CONNECTED_COMPONENTS
R_GE_S_SELF_INTERSECTION | Solid self intersects | GE_S_SELF_INTERSECTION | C_GE_S_SELF_INTERSECTION
R_GE_S_POLYGON_WRONG_ORIENTATION | orientation of a polygon not correct | GE_S_POLYGON_WRONG_ORIENTATION | C_GE_S_POLYGON_WRONG_ORIENTATION
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION | normals all pointing in wrong direction | GE_S_ALL_POLYGONS_WRONG_ORIENTATION | C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION
R_GE_S_ALL | Container for: R_GE_S_TOO_FEW_POLYGONS, R_GE_S_NOT_CLOSED, R_GE_S_NON_MANIFOLD_VERTEX, R_GE_S_NON_MANIFOLD_EDGE, R_GE_S_MULTIPLE_CONNECTED_COMPONENTS, R_GE_S_SELF_INTERSECTION, R_GE_S_POLYGON_WRONG_ORIENTATION, R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION | -- | --

## Parameter Overview

Name | Description | Used in | Unit
--- | --- | --- | ---
minVertexDistance | The minimum distance between two points before they are considered the same point | R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION, R_GE_P_INTERIOR_DISCONNECTED | Meter
type | Planar check type, can be distance, angle, both sein | R_GE_P_NON_PLANAR | -
distanceTolerance | Distance from the regression plane before a point is considered not in plane | R_GE_P_NON_PLANAR | Meter
angleTolerance | Difference in normal vectors before a plane is not considered planar | R_GE_P_NON_PLANAR | Radiant

## Dependency tree

This is the order the checks will be executed. If one of the depending checks is not executed or has reported an error the following check will not be executed.

graph TD; X0001[R_SC_SCHEMA_VALIDATION] R0001[R_GE_R_TOO_FEW_POINTS] R0002[R_GE_R_CONSECUTIVE_POINTS_SAME] R0003[R_GE_R_NOT_CLOSED] R0004[R_GE_R_SELF_INTERSECTION] P0001[R_GE_P_INTERSECTING_RINGS] P0002[R_GE_P_NON_PLANAR] P0003[R_GE_P_INTERIOR_DISCONNECTED] P0004[R_GE_P_HOLE_OUTSIDE] P0005[R_GE_P_INNER_RINGS_NESTED] P0006[R_GE_P_ORIENTATION_RINGS_SAME] S0001[R_GE_S_TOO_FEW_POLYGONS] S0002[R_GE_S_NOT_CLOSED] S0003[R_GE_S_NON_MANIFOLD_VERTEX] S0004[R_GE_S_NON_MANIFOLD_EDGE] S0005[R_GE_S_MULTIPLE_CONNECTED_COMPONENTS] S0006[R_GE_S_SELF_INTERSECTION] S0007[R_GE_S_POLYGON_WRONG_ORIENTATION] S0008[R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION] X0001-->R0003; R0003-->R0001; R0001-->R0002; R0002-->R0004; R0004-->P0002; P0002-->P0006; P0006-->P0003; P0006-->P0004; P0006-->P0005; P0004-->P0001; P0005-->P0001; P0001-->S0001; P0003-->S0001; S0001-->S0002; S0001-->S0004; S0001-->S0003; S0001-->S0005; S0002-->S0007; S0004-->S0007; S0007-->S0006; S0003-->S0006; S0005-->S0006; S0006-->S0008;

## Multisurface and Solid geometry

In order to simplify the definition of a validation plan, two requirement will be introduced in addition to the CityGML QIE: valid MultiSurface and valid Solid geometry. These requirements are just a collection of the linear ring, polygon and shell requirements. No extra check is required.

Requirement ID | Description | Dependencies | Error code | Known checks
--- | --- | --- | --- | ---
R_GE_MS | valid multisurface geometry | R_SC-SCHEMA-VALIDATION, R_GE_P_ALL | -- | --
R_GE_SO | valid solid geometry | R_SC-SCHEMA-VALIDATION, R_GE_S_ALL | -- | --