# Geometrieanforderungen

## Fehlercodes for geometrische Fehler
Die Fehlercodes wurden übernommen aus dem [CityGML Quality Interoperability Experiment, chapter 7.5](http://mail.opengeospatial.org/lists/lt.php?id=fR4CDVYeAlJfHwhTCwA).

!!! note
	Die Anforderungen wurden in CityDoctor umbenannt um einen auch von Menschen zu verstehenden Begriff, analog zu den Fehlercodes, darzustellen.

Alle geometrischen Fehler sind in dem "GE" Definitionsbereich. Da geometrische Validierung basierend auf den Primitiven auf drei verschiedenen Ebenen ausgeführt wird enthält jede Anforderung eine Ebene:

* Ring: R
* Polygon: P
* Hülle (Shell): S

Fehlercodes folgen dem selben Namensschema wie die Anforderungen, siehe auch [Grundbegriffe](basic.md). Jede Verletzung einer Anforderung muss in einem Fehler enden, der einen entsprechenden Fehlercode beinhaltet.
Jeder Fehler kann (und sollte) zusätzliche Informationen beinhalten (z.B. Wenn ein Ring nicht geschlossen ist, dann sollte die ID des Rings mitgegeben werden).

## Vertex (Punkt) Anforderungen

Zwei Punkte A und B sind gleich wenn die Euclidische-Distanz zwischen den beiden Punkten kleiner als eine definierte Größe ist (*minVertexDistance*). Diese definierte Größe findet auch in vielen Anforderungen wieder Anwendung, zum Beispiel berührt ein Punkt eine Kante wenn der Abstand des Punktes kleiner ist als *minVertexDistance*. In den folgenden Anforderungen wird die Größe verwendet:

*  R_GE_R_CONSECUTIVE_POINTS_SAME
*  R_GE_R_NOT_CLOSED
*  R_GE_R_SELF_INTERSECTION
*  R_GE_P_INTERIOR_DISCONNECTED

Die folgenden Anforderungen wurden auf den drei geometrischen Ebenen definiert [(nach Ledoux (2013))]( https://doi.org/10.1111/mice.12043):

## Linear Ring

| Anforderungs ID | Beschreibung | Fehlercode | Bekannte Prüfungen |
| --------------- | ------------ | ---------- |-------------------- |
| [R_GE_R_TOO_FEW_POINTS](R_GE_R_TOO_FEW_POINTS.md)| Zu wenig Punkte in einem Ring | GE_R_TOO_FEW_POINTS | C_GE_R_TOO_FEW_POINTS |
| [R_GE_R_CONSECUTIVE_POINTS_SAME](R_GE_R_CONSECUTIVE_POINTS_SAME.md)| 2 aufeinanderfolgende Punkte sind gleich | GE_R_CONCECUTIVE_POINTS_SAME | C_GE_R_CONCECUTIVE_POINTS_SAME, C_GE_R_DUPLICATE_POINT |
| [R_GE_R_NOT_CLOSED](R_GE_R_NOT_CLOSED.md)| Der erste und letzte Punkt sind nicht gleich | GE_R_NOT_CLOSED | C_GE_R_NOT_CLOSED |
| [R_GE_R_SELF_INTERSECTION](R_GE_R_SELF_INTERSECTION.md)| Selbstverschneidung z.B. eine Schleife | GE_R_SELF_INTERSECTION | C_GE_R_SELF_INTERSECTION, C_GE_R_DUPLICATE_POINT |
| [R_GE_R_COLLAPSED_TO_LINE](R_GE_R_COLLAPSED_TO_LINE.md)|  **Momentan nicht in Benutzung, da redundant mit R_GE_R_SELF_INTERSECTION**<br/> Ring ist ein Punkt oder eine Linie  | GE_R_COLLAPSED_TO_LINE | C_GE_R_COLLAPSED_TO_LINE |
| R_GE_R_ALL | Container für: R_GE_R_TOO_FEW_POINTS, R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION | -- | -- |

## Polygon

| Anforderungs ID | Beschreibung | Fehlercode | Bekannte Prüfungen |
| --------------- | ------------ | ---------- |-------------------- |
| [R_GE_P_INTERSECTING_RINGS](R_GE_P_INTERSECTING_RINGS.md) | 2+ Ringe schneiden sich | GE_P_INTERSECTING_RINGS | C_GE_P_INTERSECTING_RINGS |
| [R_GE_P_NON_PLANAR](R_GE_P_NON_PLANAR.md) | Nicht planares Polygon, sowohl Distanz als auch Flächennormale Abweichungen | GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE, GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION | C_GE_P_NON_PLANAR |
| [R_GE_P_INTERIOR_DISCONNECTED](R_GE_P_INTERIOR_DISCONNECTED.md) | Innenfläche ist nicht verbunden | GE_P_INTERIOR_DISCONNECTED | C_GE_P_INTERIOR_DISCONNECTED |
| [R_GE_P_HOLE_OUTSIDE](R_GE_P_HOLE_OUTSIDE.md) | 1+ inneren Ringe ist komplett außerhalb des Polygons | GE_P_HOLE_OUTSIDE | C_GE_P_HOLE_OUTSIDE |
| [R_GE_P_INNER_RINGS_NESTED](R_GE_P_INNER_RINGS_NESTED.md) | Innerer Ring ist komplett innerhalb eines anderen inneren Rings | GE_P_INNER_RINGS_NESTED | C_GE_P_INNER_RINGS_NESTED |
| [R_GE_P_ORIENTATION_RINGS_SAME](R_GE_P_ORIENTATION_RINGS_SAME.md) | Äußerer Ring und innerer Ring haben die selbe Orientation | GE_P_ORIENTATION_RINGS_SAME | C_GE_P_ORIENTATION_RINGS_SAME |
| R_GE_P_ALL | Container für: 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 / Hülle (Shell)

| Anforderungs ID | Beschreibung | Fehlercode | Bekannte Prüfungen |
| --------------- | ------------ | ---------- |-------------------- |
| [R_GE_S_TOO_FEW_POLYGONS](R_GE_S_TOO_FEW_POLYGONS.md) | <4 Polygone | GE_S_TOO_FEW_POLYGONS | C_GE_S_TOO_FEW_POLYGONS |
| [R_GE_S_NOT_CLOSED](R_GE_S_NOT_CLOSED.md) | Die Hülle ist nicht wasserdicht / hat 1+ Löcher | GE_S_NOT_CLOSED | C_GE_S_NOT_CLOSED |
| [R_GE_S_NON_MANIFOLD_VERTEX](R_GE_S_NON_MANIFOLD_VERTEX.md) | Jedes Polygon, das an einem Punkt anliegt muss über Kanten mit den Anderen verbunden sein | GE_S_NON_MANIFOLD_VERTEX | C_GE_S_NON_MANIFOLD_VERTEX |
| [R_GE_S_NON_MANIFOLD_EDGE](R_GE_S_NON_MANIFOLD_EDGE.md) | An jeder Kante dürfen nur 2 Polygon anliegen | GE_S_NON_MANIFOLD_EDGE | C_GE_S_NON_MANIFOLD_EDGE |
| [R_GE_S_MULTIPLE_CONNECTED_COMPONENTS](R_GE_S_MULTIPLE_CONNECTED_COMPONENTS.md) | Alle Polygone müssen über Punkte und Kanten verbunden sein | GE_S_MULTIPLE_CONNECTED_COMPONENTS | C_GE_S_MULTIPLE_CONNECTED_COMPONENTS |
| [R_GE_S_SELF_INTERSECTION](R_GE_S_SELF_INTERSECTION.md) | Die Hülle selbstverschneidet sich | GE_S_SELF_INTERSECTION | C_GE_S_SELF_INTERSECTION |
| [R_GE_S_POLYGON_WRONG_ORIENTATION](R_GE_S_POLYGON_WRONG_ORIENTATION.md) | Die Orientierung eines Polygons ist falsch | GE_S_POLYGON_WRONG_ORIENTATION | C_GE_S_POLYGON_WRONG_ORIENTATION |
| [R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION](R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION.md) | Alle Polygone zeigen in die falsche Richtung | GE_S_ALL_POLYGONS_WRONG_ORIENTATION | C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION |
| R_GE_S_ALL | Container für: 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 Überblick

| Name | Beschreibung | Verwendet in | Einheit |
| ---- | ------------ | ------------ | ------- |
| minVertexDistance | Minimale Abstand zwischen zwei Punkten bevor sie als der selbe Punkt angesehen werden | R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION, R_GE_P_INTERIOR_DISCONNECTED | Meter |
| type | Planaritätsprüfungsart, kann *distance*, *angle*, *both* sein | R_GE_P_NON_PLANAR | - |
| distanceTolerance | Maximale Distanz eines Punktes von der Ausgleichsebene eines Polygons bevor es als Fehler angesehen wird | R_GE_P_NON_PLANAR | Meter |
| angleTolerance | Maximale Differenz im Winkel von angrenzenden Dreiecken einer Triangulierung bevor ein Polygon nicht mehr als Planar angesehen wird | R_GE_P_NON_PLANAR | Radiant |

## Abhängigkeitsbaum

Dies ist die Reihenfolge in der die Prüfungen ausgeführt werden. Wenn eine abhängige Prüfung einen Fehler geworfen hat oder nicht ausgeführt wurde, so wird die darauffolgende Prüfung auch nicht ausgeführt.

``` mermaid
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 und Solid Geometrie
Um die Definition eines Validierungsplans zu vereinfachen werden zwei neue Anfoderungen zusätzlich eingeführt. Diese Anforderungen dienen lediglich zur Gruppierung von den vorhandenen Anforderungen und benötigen keine zusätzlichen Prüfungen.

| Anforderungs ID | Beschreibung | Abhängigkeiten | Fehlercode | Bekannte Prüfungen |
| --------------- | ------------ | -------------- | ---------- |-------------------- |
| [R_GE_MS](R_GE_MS.md) | Valide Multisurface-Geometrie | R_SC-SCHEMA-VALIDATION, R_GE_P_ALL | -- | -- |
| [R_GE_SO](R_GE_SO.md) | Valide Hüllengeometrie | R_SC-SCHEMA-VALIDATION, R_GE_S_ALL | -- | -- |