as defined in[CityGML Quality Interoperability Experiment, chapter 3](http://mail.opengeospatial.org/lists/lt.php?id=fR4CDVYeAlJfHwhTCwA)
**Validierung**
**Validation**
> Prozess des validierens einer CityGML Datei nach spezifizierten Anforderungen. Eine valide Datei entspricht allen Anforderungen.
> Process of validating a CityGML data set against a specified set of requirements. A valid data set is conformant to these requirements.
**Anforderungen**
**Requirements**
> Regeln und Einschränkungen, die die Datenstruktur eindeutig definieren. Anforderungen können von dem CityGML Standard Dokument abgleitet werden oder gesondert, als Anforderung an den CityGML Standard, definiert werden um Mehrdeutigkeiten des Standards zu verhindern oder zusätzliche nutzerabhängige Anforderungen zu definieren.
> Rules and restrictions to define data structure and content unambiguously. Requirements can be derived from the CityGML Standard document or be defined separately as refinement of the CityGML standard to avoid ambiguities of the standard and/or specify further requirements (user/application dependent).
**Prüfung**
**Check**
> Algorithmic implementation to check if a requirement is met in a validation software.
> Algorithmische Implementation um eine Anforderung innerhalb eines Validerungsprogramms zu prüfen.
**Error**
> Result of a check in case of non-conformance.
**Fehler**
**Validation plan**
> Ergebnis einer Prüfung im Falle einer Nichtkonformität von Anforderungen.
> Structured list of requirements, usually depending on use case.
**Validierungsplan**
### Additional defintions
> Strukturierte Liste von Anforderungen, überlicherweise angepasst an den konkreten Fall.
**XSD valid**
> A CityGML is conform to the schema or XSD valid if it validates against the CityGML XML schema.
### Zusätzliche Defintionen:
**XSD valide**
> Eine CityGML Datei XSD valide wenn sie dem CityGML XML Schema entspricht.
Die Fehlercodes wurden übernommen aus dem[CityGML Quality Interoperability Experiment, chapter 7.5](http://mail.opengeospatial.org/lists/lt.php?id=fR4CDVYeAlJfHwhTCwA).
as defined in the[CityGML Quality Interoperability Experiment, chapter 7.5](http://mail.opengeospatial.org/lists/lt.php?id=fR4CDVYeAlJfHwhTCwA).
!!! note
!!! note
Die Anforderungen wurden in CityDoctor umbenannt um einen auch von Menschen zu verstehenden Begriff, analog zu den Fehlercodes, darzustellen.
The requirements were renamed in CityDoctor to be more human readable. The were renamed according to the error codes.
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:
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
* Ring: R
* Polygon: P
* Polygon: P
*Hülle (Shell): S
* 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.
Error codes follow the same system as the requirements mentioned [fundamentals](basic.md). A violation of each respective data quality requirement should result in an error which must
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).
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 (Punkt) Anforderungen
## Vertex Requirement
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:
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_CONSECUTIVE_POINTS_SAME
* R_GE_R_NOT_CLOSED
* R_GE_R_NOT_CLOSED
* R_GE_R_SELF_INTERSECTION
* R_GE_R_SELF_INTERSECTION
* R_GE_P_INTERIOR_DISCONNECTED
* 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):
The following requirements are defined for the three respective geometric levels [(adopted from Ledoux (2013))](https://doi.org/10.1111/mice.12043):
| [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_TOO_FEW_POINTS](R_GE_R_TOO_FEW_POINTS.md)| too few points | 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_CONSECUTIVE_POINTS_SAME](R_GE_R_CONSECUTIVE_POINTS_SAME.md)| 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](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_NOT_CLOSED](R_GE_R_NOT_CLOSED.md)| first-last points are not the same | 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_COLLAPSED_TO_LINE](R_GE_R_COLLAPSED_TO_LINE.md)| **Currently not in use as it is redundant with R_GE_R_SELF_INTERSECTION**<br/>is point or line | GE_R_COLLAPSED_TO_LINE | C_GE_R_COLLAPSED_TO_LINE |
| [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_NON_PLANAR](R_GE_P_NON_PLANAR.md) | 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](R_GE_P_INTERIOR_DISCONNECTED.md) | Innenfläche ist nicht verbunden | GE_P_INTERIOR_DISCONNECTED | C_GE_P_INTERIOR_DISCONNECTED |
| [R_GE_P_INTERIOR_DISCONNECTED](R_GE_P_INTERIOR_DISCONNECTED.md) | interior is not connected | 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_HOLE_OUTSIDE](R_GE_P_HOLE_OUTSIDE.md) | 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](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_INNER_RINGS_NESTED](R_GE_P_INNER_RINGS_NESTED.md) | interior ring is located inside other | 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_ORIENTATION_RINGS_SAME](R_GE_P_ORIENTATION_RINGS_SAME.md) | exterior and interior rings have same orientation | GE_P_ORIENTATION_RINGS_SAME | C_GE_P_ORIENTATION_RINGS_SAME |
| [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_NOT_CLOSED](R_GE_S_NOT_CLOSED.md) | there is 1+ hole(s) on the surface | 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_VERTEX](R_GE_S_NON_MANIFOLD_VERTEX.md) | Each shell must be simple | 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_NON_MANIFOLD_EDGE](R_GE_S_NON_MANIFOLD_EDGE.md) | 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](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_MULTIPLE_CONNECTED_COMPONENTS](R_GE_S_MULTIPLE_CONNECTED_COMPONENTS.md) | 1+ polygons not connected to main shell | 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_POLYGON_WRONG_ORIENTATION](R_GE_S_POLYGON_WRONG_ORIENTATION.md) | orientation of a polygon not correct | 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_POLYGONS_WRONG_ORIENTATION](R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION.md) | normals all pointing in wrong direction | GE_S_ALL_POLYGONS_WRONG_ORIENTATION | C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION |
| 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 |
| 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 | Planaritätsprüfungsart, kann*distance*, *angle*, *both* sein | R_GE_P_NON_PLANAR | - |
| type | Planar check type, can be*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 |
| distanceTolerance | Distance from the regression plane before a point is considered not in plane | 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 |
| angleTolerance | Difference in normal vectors before a plane is not considered planar | R_GE_P_NON_PLANAR | Radiant |
## Abhängigkeitsbaum
## 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.
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.
```mermaid
```mermaid
graph TD;
graph TD;
...
@@ -125,9 +131,9 @@ graph TD;
...
@@ -125,9 +131,9 @@ graph TD;
```
```
## Multisurface und Solid Geometrie
## 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.
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.
**Entwicklung eines Systems zur automatisierten Reparatur virtueller Stadtmodelle**
** Development of a automatic repair system for virtual city models**
CityDoctor2 ist eine Qualitätsprüfungssoftware für 3D Stadtmodelle im CityGML format. CityDoctor kann CityGML 1/2 Dokumente einlesen und seit Version 3.12 kann auch eingeschränkt CityGML 3 gelesen werden. Alle Prüfergebnisse können in xml oder pdf Form ausgegeben werden. Zusätzlich implementiert CityDoctor die [QualityADE](https://transfer.hft-stuttgart.de/gitlab/citydoctor/qualityade)um Prüfergebnisse direkt in CityGML zu speichern.
CityDoctor2 is a quality check software for 3D city models in CityGML format. CityDoctor can read CityGML 1/2 documents and since version 3.12 can also read CityGML 3 with restrictions. All check results can be output in xml or pdf form. Additionally CityDoctor implements the [QualityADE](https://transfer.hft-stuttgart.de/gitlab/citydoctor/qualityade)to save test results directly into CityGML.
![examplePicture](img/checked.png)
![examplePicture](img/checked.png)
# Lizenzen / Versionen
# Licence / Versions
### CityDoctorValidation
### CityDoctorValidation
The validation part of CityDoctor is freely available and [open source](https://transfer.hft-stuttgart.de/gitlab/citydoctor/citydoctor2)
Der Validierungsteil von CityDoctor ist frei verfügbar und [OpenSource](https://transfer.hft-stuttgart.de/gitlab/citydoctor/citydoctor2)
### CityDoctorGUI
### CityDoctorGUI
The graphical interface is free but not open source (see [Installation](requiredSoftware.md))
Die grafische Oberfläche ist frei aber nicht OpenSource (siehe [Installation](requiredSoftware.md))
### CityDoctorHealer
### CityDoctorHealer
Der Teil zuständig für die Reparatur ist nur in Absprache mit uns zu erhalten.
The part responsible for the repair can be obtained only in consultation with us.
Ab Version 3.13.0 wurde ein Repository auf dem Transferportal der Hochschule erstellt, das fortan als Ablageort für fertige Releases verwendet wird:
Starting with version 3.13.0, a repository was created on the university's transferportal, which will henceforth be used as a repository for finished releases:
Die Versionen sind dort unterteilt zwischen CityDoctorValidation und CityDoctorGUI und unter diesen Ordnern gibt es die entsprechenden Versionsordner.
The versions are divided there between CityDoctorValidation and CityDoctorGUI and under these folders there are the corresponding version folders.
### Releaseversionen
### Release Versions
Für jede CityDoctor Variante (CityDoctorValidation oder CityDoctorGUI) werden vier verschiedene Versionen zum Download bereitgestellt.
For each CityDoctor variant (CityDoctorValidation or CityDoctorGUI) four different versions are provided for download.
Es werden in verschiedenen Versionen Java Runtimes der Liberica Distribution mitgeliefert.
Java runtimes of the Liberica distribution are included in different versions.
| Version | Beschreibung |
| Version | Description |
| ------- | ------------ |
| ------- | ------------ |
| CityDoctor*-no-runtime.zip | Diese Version beinhaltet keine Runtime für Java. Falls auf Ihrem PC schon ein Java der Version 17 installiert ist (siehe [Java](requiredSoftware.md#java)), dann ist diese Version zu bevorzugen.
| CityDoctor*-no-runtime.zip | This version does not include a runtime for Java. If you already have a Java version 17 installed on your PC use this. See [Java](requiredSoftware.md#java) |
| CityDoctor*-win.zip | Beinhaltet eine Windows Java Runtime zum ausführen von CityDoctor, kein Java muss installiert sein. |
| CityDoctor*-win.zip | Includes a Windows Java Runtime to run CityDoctor, no Java needs to be installed. |
| CityDoctor*-lin.zip | Beinhaltet eine Linux Java Runtime zum ausführen von CityDoctor |
| CityDoctor*-lin.zip | Includes a Linux Java Runtime to run CityDoctor |
| CityDoctor*-mac.zip | Beinhaltet eine Mac Java Runtime zum ausführen von CityDoctor |
| CityDoctor*-mac.zip | Includes a Mac Java Runtime to run CityDoctor |
## Versionen bis 3.12.x
## Versions until 3.12.x
CityDoctor kann von verschiedenen Seiten heruntergeladen werden. Die aktuellste Stelle ist ein[gitlab Repository](https://gitlab.com/volkercoors/CiD4Sim/-/tree/master/CityDoctorExtension). Alternativ werden Releases auch auf der[CityDoctor Homepage der BHT](https://projekt.bht-berlin.de/citydoctor2/downloads/) gelistet. Es gibt dabei immer zwei Versionen:
CityDoctor can be downloaded from various sites. The most recent place is a[gitlab repository](https://gitlab.com/volkercoors/CiD4Sim/-/tree/master/CityDoctorExtension). Alternatively, releases are also listed on the[CityDoctor homepage of the BHT](https://projekt.bht-berlin.de/citydoctor2/downloads/). There are always two versions:
***CityDoctorGUI-3.x.x.zip:**Das ist die grafische Oberfläche inklusive der Prüfungen. Geeignet für den Endnutzer auf einem Desktop PC.
***CityDoctorGUI-3.x.x.zip:**This is the graphical interface including the checks. Suitable for the end user on a desktop PC.
***CityDoctorValidation-3.x.x.zip:**Das ist die Batch-Version die für die Integration in Servern oder anderen bestehenden Systemen geeignet ist und hat keine grafische Oberfläche sondern arbeitet Dateibasiert als Prozess.
***CityDoctorValidation-3.x.x.zip:**This is the batch version suitable for integration into servers or other existing systems and has no graphical interface but works file-based as a process.
!!! note
!!! note
Es gibt manchmal Spezialversionen die Testweise erstellt worden sind um verschiedene Auslieferungsmöglichkeiten zu testen. Bsp: CityDoctorGUI-x.x.x-win.zip beinhaltet die JavaFX Bibliotheken sodass eine Java Umgebung ohne JavaFX auch verwendet werden kann.
There are sometimes specialversions that have been created for testing different delivery options. Example: CityDoctorGUI-x.x.x-win.zip contains the JavaFX libraries so that a Java environment without JavaFX can also be used.
### Java
### Java
Vor der CityDoctor Version 3.12.x wird Java 8 entweder als JDK oder als JRE benötigt. Ab der Version 3.12.x wird Java 17 benötigt.
Before CityDoctor version 3.12.x Java 8 is required either as JDK or as JRE. From version 3.12.x Java 17 is required.
!!! warning
!!! warning
Es wichtig, dass die installierte Java Version die JavaFX Bibliotheken mit einschließt. Diese werden für die grafische Oberfläche benötigt.
It is important that the installed Java version includes the JavaFX libraries. These are needed for the graphical user interface.
[Die Liberica JRE oder JDK](https://bell-sw.com/libericajdk/) hat sich für einen Einsatz mit CityDoctor bewährt.
[The Liberica JRE oder JDK](https://bell-sw.com/libericajdk/) has proven itself for use with CityDoctor.
!!! note
!!! note
Die Liberica Distribution ist zu 100% frei und OpenSource.
The Liberica distribution is 100% free and open source.
!!! note
!!! note
Für die Entwicklung mit CityDoctor wird eine JDK benötigt.
For the development with CityDoctor a JDK is required.
# Anforderungen und Prüfungen für die Validierung von CityGML-Modellen
# Anforderungen und Prüfungen für die Validierung von CityGML-Modellen
Die Anforderungen sind die Grundbausteine für ein Validierungsplan um CityGML-Modelle zu validieren. Für Namenskonventionen und Definitionen, siehe [Grundbegriffe](basic.md).
The requirements are the basic building blocks for a validation plan to validate CityGML models. For naming conventions and definitions, see [fundamentals](basic.md).
Eine Anforderung kann durch einen oder mehrere Prüfungen validiert werden. Eine Prüfung validiert ein oder mehrere Anforderungen bei einem Modell. Jede Prüfung kann Vorbedingungen haben. Wenn diese Vorbedingungen nicht erfüllt sind wird die Prüfung nicht ausgeführt.
A requirement can be validated by one or more checks. A check validates one or more requirements on a model. Each check can have preconditions. If these preconditions are not met, the check is not executed.
In der oberen Leiste sind folgende Schaltflächen in Reihenfolge:
In the upper bar the following buttons are in order:
***Laden:**Öffnet den Dialog zum laden einer CityGML Datei
***Load:**Opens the dialog for loading a CityGML file
***Prüfen:** Öffnet den Dialog zum prüfen einer geladenen CityGML
***Validation:** Opens the dialog to check a loaded CityGML
***Prüfberichte:** Öffnet den Dialog zum schreiben eines Prüfprotokolls in xml oder pdf Form
***Validation results:** Opens the dialog for writing a test protocol in xml or pdf form
***Gitternetz:** Zeigt/Versteckt das Gitternetz anstatt gefüllter Polygone
***Grid:** Shows/hides the grid instead of filled polygons
***Rückseiten:** Zeigt/Versteckt Rückseiten von Polygonen
***Backsides:** Shows/hides backs of polygons
***Globale Ansicht:** Lädt alle Elemente einer CityGML in die Ansicht
***Global View:** Loads allelements of a CityGML into the view
***LODs:**Schaltet einzelne LODs von der Ansicht an oder aus
***LODs:**Turns individual LODs on or off from the view
***Speichern:** Speichert eine CityGML Datei zurück, falls die Datei geprüft wurde wird die QualityADE mitgeschrieben.
***Save:** Saves a CityGML file back, if the file was checked the QualityADE is written too.
***About:**Öffnet den Dialog mit Informationen zu dem Projekt CityDoctor2
***About:**Opens the dialog with information about the project CityDoctor2
***Ansichten:** Wechselt verschiedene Ansichten. Für die Prüfung gibt es nur eine.
***View:** Switches different views. There is only one for the validation part.
***Sprache:** Hier kann die Sprache eingestellt werden (Deutsch/Englisch)
***Language:** Here you can set the language (German/English)
!!! warning
!!! warning
Das Anzeigen der Globalen Ansicht kann bei großen CityGML Dateien (> 100mb je nach System) zu abstürzen führen. Das Anzeigen kann kurz dauern.
Displaying the Global View can cause crashes with large CityGML files (> 100mb depending on the system). The display may take a short time.
## Laden
## Load
Über die Schaltfläche Laden wird der Dialog zum laden einer CityGML Datei geöffnet.
The Load button opens the dialog for loading a CityGML file.
![open](img/open.png)
![open](img/open.png)
In der Datei Leiste kann ein Dateipfad eingetragen werden oder über die Schaltfläche **Auswählen** ausgewählt werden.
In the file bar a file path can be entered or selected via the **Select** button.
Außerdem können weitere Einstellungen für das Lesen der Datei angegeben werden.
In addition, other settings for reading the file can be specified.
***NumberOfRoundingPlaces:**Auf wie viele Nachkommastellen werden die eingelesenen Werte gerundet.
***NumberOfRoundingPlaces:**To how many decimal places are the read-in values rounded?
***XML-Validierung:**Führt eine XML Validierung durch. Fehler werden dabei direkt beim einlesen festgestellt und das Einlesen wird abgebrochen.
***XML-Validierung:**Performs an XML validation. Errors are detected directly during the import and the import is aborted.
***Speicherverbrauch:** Spart RAM um größere Dateien in der GUI zu ermöglichen. Kostet geringfügig Performance bei der Prüfung.
***Low Memory Consumption Mode :** Saves RAM to allow larger files in the GUI. Slight performance costs during the validation process.
Beim Laden wird der Fortschritt ungefähr durch den Ladebalken repräsentiert.
When loading, the progress is approximately represented by the loading bar.
!!! note
!!! note
Dateien können auch direkt per Drag and Drop vom Dateimanager in die GUI gezogen werden ohne den Laden Dialog zu verwenden. Dabei werden die Default Werte angenommen (8 Nachkommastellen, keine XML-Validierung)
Files can also be dragged and dropped directly from the file manager into the GUI without using the load dialog. The default values are assumed (8 decimal places, no XML validation).
Nach dem Laden einer CityGML Datei werden die Elemente in den einzelnen Tabs angezeigt. Durch auswählen eines Elements wird das in der Ansicht angezeigt.
After loading a CityGML file, the elements are displayed in the individual tabs. Selecting an element will display it in the view.
![loadedFile](img/interfaceLoad.png)
![loadedFile](img/interfaceLoad.png)
!!! note
!!! note
Durch Auswählen des obersten Elements eines Reiters werden alle Elemente innerhalb diese Reiters angezeigt. Wie obige Warnung schon besagt, gilt auch hier, dass größere Datenmengen zu Abstürzen führen.
By selecting the top element of a tab, allelements within this tab are displayed. As the above warning states, larger amounts of data will cause crashes.
## Prüfen
## Validation
![checkDialog](img/checkDialog.png)
![checkDialog](img/checkDialog.png)
Im Prüfdialog kann der Validierungsplan angepasst werden. Hier werden neben den Verfügbaren Prüfungen auch die globalen Parameter angezeigt.
The validation plan can be customized in the check dialog. In addition to the available checks, the global parameters are also displayed here.
Verändert können die Parameter mit einem Doppelklick in die Wert Spalte. Die Einheit ist dabei fest.
The parameters can be changed with a double click in the value column. The unit is fixed.
!!! note
!!! note
Der Parameter numberOfRoundingPlaces kann nicht verändert werden. Er wurde beim Laden der Datei festgelegt.
The numberOfRoundingPlaces parameter cannot be changed. It was set when the file was loaded.
Falls Prüfungen nicht ausgeführt werden sollen können sie in der Spalte Aktiv deaktiviert werden.
If checks should not be executed, they can be deactivated in the Active column.
!!! warning
!!! warning
Wenn Prüfungen deaktiviert wurden die andere aktiven Prüfungen aber als Abhängigkeit benötigen werden sie bei der Prüfung wieder aktiviert um die Stabilität zu gewährleisten. Siehe [Anforderungen](requirements.md).
If checks are disabled but other active checks need them as dependencies, they will be re-enabled during the check to ensure stability. See [Requirements](requirements.md).
In dem Feld Schematron Datei kann ein Pfad zu einer Schematron Datei eingetragen werden. In dieser Datei können flexible Regeln für die semantischen Anforderungen festgelegt werden. Siehe [Semantische Prüfungen](semantic.md)
In the Schematron file field, a path to a Schematron file can be entered. In this file flexible rules for the semantic requirements can be defined. See [Semantic Requirements](semantic.md)
Über die beiden Schaltflächen oben rechts kann der Prüfplan gespeichert und geladen werden.
The test plan can be saved and loaded via the two buttons at the top right.
Nach der Prüfung werden fehlerhafte Elemente rot und fehlerfreie Elemente grün eingefärbt. Bei der Auswahl eines Elements das fehler beinhaltet werden die Fehler in dem unteren Tab **Fehler** angezeigt. Dort kann der Fehler ausgewählt werden um ihn in CityDoctor anzuzeigen und weitere Informationen zu erhalten.
After the check, elements with errors are colored red and elements without errors are colored green. When selecting an element that contains errors, the errors are displayed in the lower tab **Errors**. There you can select the error to display it in CityDoctor and get more information.
![checked](img/checked.png)
![checked](img/checked.png)
Die Elemente können mit dem Dropdown-Menü gefiltert werden um nur fehlerhafte Elemente anzuzeigen.
The elements can be filtered with the dropdown menu to show only faulty elements.
## Prüfberichte
## Validation reports
In diesem Dialog gibt es nochmal eine Übersicht über die Fehler in Bildform und die Möglichkeit einen xml oder pdf Bericht zu schreiben.
In this dialog there is again an overview of the errors in image form and the possibility to write an xml or pdf report.
der Validierungsplan für CityDoctor wird in [YAML](https://de.wikipedia.org/wiki/YAML) angegeben.
the validation plan for CityDoctor is specified in [YAML](https://de.wikipedia.org/wiki/YAML).
Für die Version 3.12.x sieht ein Beispiel so aus:
For version 3.12.x and later, an example looks like this:
``` {.yaml .annotate}
``` {.yaml .annotate}
globalParameters:
globalParameters:
numberOfRoundingPlaces: 8
numberOfRoundingPlaces: 8
...
@@ -69,8 +69,8 @@ requirements:
...
@@ -69,8 +69,8 @@ requirements:
enabled: false
enabled: false
```
```
1.Der Parameter `useStreaming` ist ein Schalter um eine Datei Stück für Stück einzulesen anstelle erst die komplette Datei zu lesen bevor die Prüfung stattfindet. Mit dieser Einstellung können auch Dateien > 2GB ohne große RAM Anforderungen geprüft werden.
1.The parameter `useStreaming` is a switch to read a file piece by piece instead of reading the complete file before the check takes place. With this setting also files > 2GB can be checked without large RAM requirements.
In dem Validierungsplan finden sich die selben Einstellungen wieder, die in der grafischen Oberfläche auch aufgelistet sind.
In the validation plan you will find the same settings that are listed in the graphical user interface.
Unter requirements sind alle Anforderungen gelistet die geprüft werden sollen. Dabei sind die semantischen Prüfungen standardmäßig deaktiviert.
All requirements that are to be checked are listed under requirements. The semantic checks are deactivated by default.
{"config":{"lang":["de"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"CityDoctor2","text":"<p>Entwicklung eines Systems zur automatisierten Reparatur virtueller Stadtmodelle </p> <p>CityDoctor2 ist eine Qualit\u00e4tspr\u00fcfungssoftware f\u00fcr 3D Stadtmodelle im CityGML format. CityDoctor kann CityGML 1/2 Dokumente einlesen und seit Version 3.12 kann auch eingeschr\u00e4nkt CityGML 3 gelesen werden. Alle Pr\u00fcfergebnisse k\u00f6nnen in xml oder pdf Form ausgegeben werden. Zus\u00e4tzlich implementiert CityDoctor die QualityADE um Pr\u00fcfergebnisse direkt in CityGML zu speichern.</p> <p></p>"},{"location":"#lizenzen-versionen","title":"Lizenzen / Versionen","text":""},{"location":"#citydoctorvalidation","title":"CityDoctorValidation","text":"<p>Der Validierungsteil von CityDoctor ist frei verf\u00fcgbar und OpenSource</p>"},{"location":"#citydoctorgui","title":"CityDoctorGUI","text":"<p>Die grafische Oberfl\u00e4che ist frei aber nicht OpenSource (siehe Installation)</p>"},{"location":"#citydoctorhealer","title":"CityDoctorHealer","text":"<p>Der Teil zust\u00e4ndig f\u00fcr die Reparatur ist nur in Absprache mit uns zu erhalten. Mail an: </p>"},{"location":"#projekt","title":"Projekt","text":"<p>Projektlaufzeit: 01.11.2018 - 31.12.2021</p>"},{"location":"#partner","title":"Partner","text":"<p>Projektverantwortliche: Prof. Dr. Margitta Pries</p> <p>Verbundpartner: Prof. Dr.-Ing. Volker Coors</p> <p>Kooperationspartner: 3DIS GmbH 3dpartzz GmbH con terra GmbH Geoplex GIS GmbH Mark Wewetzer M.O.S.S. Computer Grafik Systeme GmbH Steinbeis - Transferzentrum Virtual City Systems</p> <p>Assoziative Partner: Landesamt f\u00fcr Geoinformation und Landentwicklung Baden-W\u00fcrttemberg </p> <p>Mittelgeber: Bundesministerium f\u00fcr Bildung und Forschung </p> <p>Projekttr\u00e4ger: VDI Technologiezentrum </p> <p></p>"},{"location":"R_GE_MS/","title":"R_GE_MS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_MS_0001</p>"},{"location":"R_GE_P_HOLE_OUTSIDE/","title":"R_GE_P_HOLE_OUTSIDE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0004</p>"},{"location":"R_GE_P_INNER_RINGS_NESTED/","title":"R_GE_P_INNER_RINGS_NESTED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0005</p>"},{"location":"R_GE_P_INTERIOR_DISCONNECTED/","title":"R_GE_P_INTERIOR_DISCONNECTED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0003 </p>"},{"location":"R_GE_P_INTERSECTING_RINGS/","title":"R_GE_P_INTERSECTING_RINGS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0001</p>"},{"location":"R_GE_P_NON_PLANAR/","title":"R_GE_P_NON_PLANAR","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0002 </p>"},{"location":"R_GE_P_ORIENTATION_RINGS_SAME/","title":"R_GE_P_ORIENTATION_RINGS_SAME","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0006 </p>"},{"location":"R_GE_R_COLLAPSED_TO_LINE/","title":"R_GE_R_COLLAPSED_TO_LINE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0005</p>"},{"location":"R_GE_R_CONSECUTIVE_POINTS_SAME/","title":"R_GE_R_CONSECUTIVE_POINTS_SAME","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0002</p>"},{"location":"R_GE_R_NOT_CLOSED/","title":"R_GE_R_NOT_CLOSED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0003</p>"},{"location":"R_GE_R_SELF_INTERSECTION/","title":"R_GE_R_SELF_INTERSECTION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0004</p>"},{"location":"R_GE_R_TOO_FEW_POINTS/","title":"R_GE_R_TOO_FEW_POINTS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0001</p>"},{"location":"R_GE_SO/","title":"R_GE_SO","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0009</p>"},{"location":"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION/","title":"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0008</p>"},{"location":"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS/","title":"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0005</p>"},{"location":"R_GE_S_NON_MANIFOLD_EDGE/","title":"R_GE_S_NON_MANIFOLD_EDGE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0004</p>"},{"location":"R_GE_S_NON_MANIFOLD_VERTEX/","title":"R_GE_S_NON_MANIFOLD_VERTEX","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0003</p>"},{"location":"R_GE_S_NOT_CLOSED/","title":"R_GE_S_NOT_CLOSED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0002</p>"},{"location":"R_GE_S_POLYGON_WRONG_ORIENTATION/","title":"R_GE_S_POLYGON_WRONG_ORIENTATION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0007</p>"},{"location":"R_GE_S_SELF_INTERSECTION/","title":"R_GE_S_SELF_INTERSECTION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0006</p>"},{"location":"R_GE_S_TOO_FEW_POLYGONS/","title":"R_GE_S_TOO_FEW_POLYGONS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0001</p>"},{"location":"basic/","title":"Validierung von 3D Stadtmodellen in CityGML","text":""},{"location":"basic/#begriffe-und-definitionen","title":"Begriffe und Definitionen","text":"<p>nach CityGML Quality Interoperability Experiment, chapter 3</p> <p>Validierung</p> <p>Prozess des validierens einer CityGML Datei nach spezifizierten Anforderungen. Eine valide Datei entspricht allen Anforderungen.</p> <p>Anforderungen</p> <p>Regeln und Einschr\u00e4nkungen, die die Datenstruktur eindeutig definieren. Anforderungen k\u00f6nnen von dem CityGML Standard Dokument abgleitet werden oder gesondert, als Anforderung an den CityGML Standard, definiert werden um Mehrdeutigkeiten des Standards zu verhindern oder zus\u00e4tzliche nutzerabh\u00e4ngige Anforderungen zu definieren.</p> <p>Pr\u00fcfung</p> <p>Algorithmische Implementation um eine Anforderung innerhalb eines Validerungsprogramms zu pr\u00fcfen.</p> <p>Fehler</p> <p>Ergebnis einer Pr\u00fcfung im Falle einer Nichtkonformit\u00e4t von Anforderungen.</p> <p>Validierungsplan</p> <p>Strukturierte Liste von Anforderungen, \u00fcberlicherweise angepasst an den konkreten Fall.</p>"},{"location":"basic/#zusatzliche-defintionen","title":"Zus\u00e4tzliche Defintionen:","text":"<p>XSD valide</p> <p>Eine CityGML Datei XSD valide wenn sie dem CityGML XML Schema entspricht.</p>"},{"location":"firstRun/","title":"Erster Start","text":""},{"location":"firstRun/#start","title":"Start","text":"<p>Nach dem entpacken der Zip Datei sollte je nach Version (GUI oder Batch) eine Struktur \u00e4hnlich diesem Bild rauskommen (Beispiel CityDoctorGUI): </p> <p>Um CityDoctor zu starten kann die start.bat verwendet werden.</p> <p>Die .bat Datei enth\u00e4lt dabei nur den Befehl:</p> <pre><code>java -classpath libs/*;plugins/*;CityDoctorGUI-3.12.0.jar de.hft.stuttgart.citydoctor2.gui.MainWindow\n</code></pre> <p>Note</p> <p>Der Befehl hat sich \u00fcber die Versionshistorie von CityDoctor ver\u00e4ndert.</p> <p>F\u00fcr die Batch Version ist der Befehl analog und kann entsprechend f\u00fcr andere Betriebsysteme angepasst werden.</p> <p>Note</p> <p>F\u00fcr Linux oder Mac kann dieser Befehl auch verwendet werden, es muss nur das \";\" durch \":\" ersetzt werden. Der Rest bleibt gleich.</p>"},{"location":"geometric/","title":"Geometrieanforderungen","text":""},{"location":"geometric/#fehlercodes-for-geometrische-fehler","title":"Fehlercodes for geometrische Fehler","text":"<p>Die Fehlercodes wurden \u00fcbernommen aus dem CityGML Quality Interoperability Experiment, chapter 7.5.</p> <p>Note</p> <p>Die Anforderungen wurden in CityDoctor umbenannt um einen auch von Menschen zu verstehenden Begriff, analog zu den Fehlercodes, darzustellen.</p> <p>Alle geometrischen Fehler sind in dem \"GE\" Definitionsbereich. Da geometrische Validierung basierend auf den Primitiven auf drei verschiedenen Ebenen ausgef\u00fchrt wird enth\u00e4lt jede Anforderung eine Ebene:</p> <ul> <li>Ring: R</li> <li>Polygon: P</li> <li>H\u00fclle (Shell): S</li> </ul> <p>Fehlercodes folgen dem selben Namensschema wie die Anforderungen, siehe auch Grundbegriffe. Jede Verletzung einer Anforderung muss in einem Fehler enden, der einen entsprechenden Fehlercode beinhaltet. Jeder Fehler kann (und sollte) zus\u00e4tzliche Informationen beinhalten (z.B. Wenn ein Ring nicht geschlossen ist, dann sollte die ID des Rings mitgegeben werden).</p>"},{"location":"geometric/#vertex-punkt-anforderungen","title":"Vertex (Punkt) Anforderungen","text":"<p>Zwei Punkte A und B sind gleich wenn die Euclidische-Distanz zwischen den beiden Punkten kleiner als eine definierte Gr\u00f6\u00dfe ist (minVertexDistance). Diese definierte Gr\u00f6\u00dfe findet auch in vielen Anforderungen wieder Anwendung, zum Beispiel ber\u00fchrt ein Punkt eine Kante wenn der Abstand des Punktes kleiner ist als minVertexDistance. In den folgenden Anforderungen wird die Gr\u00f6\u00dfe verwendet:</p> <ul> <li>R_GE_R_CONSECUTIVE_POINTS_SAME</li> <li>R_GE_R_NOT_CLOSED</li> <li>R_GE_R_SELF_INTERSECTION</li> <li>R_GE_P_INTERIOR_DISCONNECTED</li> </ul> <p>Die folgenden Anforderungen wurden auf den drei geometrischen Ebenen definiert (nach Ledoux (2013)):</p>"},{"location":"geometric/#linear-ring","title":"Linear Ring","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_R_TOO_FEW_POINTS Zu wenig Punkte in einem Ring GE_R_TOO_FEW_POINTS C_GE_R_TOO_FEW_POINTS R_GE_R_CONSECUTIVE_POINTS_SAME 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 Der erste und letzte Punkt sind nicht gleich GE_R_NOT_CLOSED C_GE_R_NOT_CLOSED R_GE_R_SELF_INTERSECTION 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 Momentan nicht in Benutzung, da redundant mit R_GE_R_SELF_INTERSECTION Ring ist ein Punkt oder eine Linie GE_R_COLLAPSED_TO_LINE C_GE_R_COLLAPSED_TO_LINE R_GE_R_ALL Container f\u00fcr: R_GE_R_TOO_FEW_POINTS, R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION -- --"},{"location":"geometric/#polygon","title":"Polygon","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_P_INTERSECTING_RINGS 2+ Ringe schneiden sich GE_P_INTERSECTING_RINGS C_GE_P_INTERSECTING_RINGS R_GE_P_NON_PLANAR Nicht planares Polygon, sowohl Distanz als auch Fl\u00e4chennormale 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 Innenfl\u00e4che ist nicht verbunden GE_P_INTERIOR_DISCONNECTED C_GE_P_INTERIOR_DISCONNECTED R_GE_P_HOLE_OUTSIDE 1+ inneren Ringe ist komplett au\u00dferhalb des Polygons GE_P_HOLE_OUTSIDE C_GE_P_HOLE_OUTSIDE R_GE_P_INNER_RINGS_NESTED 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 \u00c4u\u00dferer 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\u00fcr: 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 -- --"},{"location":"geometric/#solid-hulle-shell","title":"Solid / H\u00fclle (Shell)","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_S_TOO_FEW_POLYGONS <4 Polygone GE_S_TOO_FEW_POLYGONS C_GE_S_TOO_FEW_POLYGONS R_GE_S_NOT_CLOSED Die H\u00fclle ist nicht wasserdicht / hat 1+ L\u00f6cher GE_S_NOT_CLOSED C_GE_S_NOT_CLOSED R_GE_S_NON_MANIFOLD_VERTEX Jedes Polygon, das an einem Punkt anliegt muss \u00fcber Kanten mit den Anderen verbunden sein GE_S_NON_MANIFOLD_VERTEX C_GE_S_NON_MANIFOLD_VERTEX R_GE_S_NON_MANIFOLD_EDGE An jeder Kante d\u00fcrfen nur 2 Polygon anliegen GE_S_NON_MANIFOLD_EDGE C_GE_S_NON_MANIFOLD_EDGE R_GE_S_MULTIPLE_CONNECTED_COMPONENTS Alle Polygone m\u00fcssen \u00fcber Punkte und Kanten verbunden sein GE_S_MULTIPLE_CONNECTED_COMPONENTS C_GE_S_MULTIPLE_CONNECTED_COMPONENTS R_GE_S_SELF_INTERSECTION Die H\u00fclle selbstverschneidet sich GE_S_SELF_INTERSECTION C_GE_S_SELF_INTERSECTION R_GE_S_POLYGON_WRONG_ORIENTATION Die Orientierung eines Polygons ist falsch GE_S_POLYGON_WRONG_ORIENTATION C_GE_S_POLYGON_WRONG_ORIENTATION R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION 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\u00fcr: 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 -- --"},{"location":"geometric/#parameter-uberblick","title":"Parameter \u00dcberblick","text":"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\u00e4tspr\u00fcfungsart, 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"},{"location":"geometric/#abhangigkeitsbaum","title":"Abh\u00e4ngigkeitsbaum","text":"<p>Dies ist die Reihenfolge in der die Pr\u00fcfungen ausgef\u00fchrt werden. Wenn eine abh\u00e4ngige Pr\u00fcfung einen Fehler geworfen hat oder nicht ausgef\u00fchrt wurde, so wird die darauffolgende Pr\u00fcfung auch nicht ausgef\u00fchrt.</p> <pre><code>graph TD;\n X0001[R_SC_SCHEMA_VALIDATION]\n R0001[R_GE_R_TOO_FEW_POINTS]\n R0002[R_GE_R_CONSECUTIVE_POINTS_SAME]\n R0003[R_GE_R_NOT_CLOSED]\n R0004[R_GE_R_SELF_INTERSECTION]\n P0001[R_GE_P_INTERSECTING_RINGS]\n P0002[R_GE_P_NON_PLANAR]\n P0003[R_GE_P_INTERIOR_DISCONNECTED]\n P0004[R_GE_P_HOLE_OUTSIDE]\n P0005[R_GE_P_INNER_RINGS_NESTED]\n P0006[R_GE_P_ORIENTATION_RINGS_SAME]\n\n S0001[R_GE_S_TOO_FEW_POLYGONS]\n S0002[R_GE_S_NOT_CLOSED]\n S0003[R_GE_S_NON_MANIFOLD_VERTEX]\n S0004[R_GE_S_NON_MANIFOLD_EDGE]\n S0005[R_GE_S_MULTIPLE_CONNECTED_COMPONENTS]\n S0006[R_GE_S_SELF_INTERSECTION]\n S0007[R_GE_S_POLYGON_WRONG_ORIENTATION]\n S0008[R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION]\n\n X0001-->R0003;\n R0003-->R0001;\n R0001-->R0002;\n R0002-->R0004;\n R0004-->P0002;\n P0002-->P0006;\n P0006-->P0003;\n P0006-->P0004;\n P0006-->P0005;\n P0004-->P0001;\n P0005-->P0001;\n P0001-->S0001;\n P0003-->S0001;\n S0001-->S0002;\n S0001-->S0004;\n S0001-->S0003;\n S0001-->S0005;\n S0002-->S0007;\n S0004-->S0007;\n S0007-->S0006;\n S0003-->S0006;\n S0005-->S0006;\n S0006-->S0008; \n</code></pre>"},{"location":"geometric/#multisurface-und-solid-geometrie","title":"Multisurface und Solid Geometrie","text":"<p>Um die Definition eines Validierungsplans zu vereinfachen werden zwei neue Anfoderungen zus\u00e4tzlich eingef\u00fchrt. Diese Anforderungen dienen lediglich zur Gruppierung von den vorhandenen Anforderungen und ben\u00f6tigen keine zus\u00e4tzlichen Pr\u00fcfungen.</p> Anforderungs ID Beschreibung Abh\u00e4ngigkeiten Fehlercode Bekannte Pr\u00fcfungen R_GE_MS Valide Multisurface-Geometrie R_SC-SCHEMA-VALIDATION, R_GE_P_ALL -- -- R_GE_SO Valide H\u00fcllengeometrie R_SC-SCHEMA-VALIDATION, R_GE_S_ALL -- --"},{"location":"requiredSoftware/","title":"Ben\u00f6tigte Software","text":""},{"location":"requiredSoftware/#versionen-ab-3130","title":"Versionen ab 3.13.0","text":"<p>Ab Version 3.13.0 wurde ein Repository auf dem Transferportal der Hochschule erstellt, das fortan als Ablageort f\u00fcr fertige Releases verwendet wird: https://transfer.hft-stuttgart.de/gitlab/citydoctor/citydoctorreleases</p> <p>Die Versionen sind dort unterteilt zwischen CityDoctorValidation und CityDoctorGUI und unter diesen Ordnern gibt es die entsprechenden Versionsordner.</p>"},{"location":"requiredSoftware/#releaseversionen","title":"Releaseversionen","text":"<p>F\u00fcr jede CityDoctor Variante (CityDoctorValidation oder CityDoctorGUI) werden vier verschiedene Versionen zum Download bereitgestellt. Es werden in verschiedenen Versionen Java Runtimes der Liberica Distribution mitgeliefert. </p> Version Beschreibung CityDoctor*-no-runtime.zip Diese Version beinhaltet keine Runtime f\u00fcr Java. Falls auf Ihrem PC schon ein Java der Version 17 installiert ist (siehe Java), dann ist diese Version zu bevorzugen. CityDoctor*-win.zip Beinhaltet eine Windows Java Runtime zum ausf\u00fchren von CityDoctor, kein Java muss installiert sein. CityDoctor*-lin.zip Beinhaltet eine Linux Java Runtime zum ausf\u00fchren von CityDoctor CityDoctor*-mac.zip Beinhaltet eine Mac Java Runtime zum ausf\u00fchren von CityDoctor"},{"location":"requiredSoftware/#versionen-bis-312x","title":"Versionen bis 3.12.x","text":"<p>CityDoctor kann von verschiedenen Seiten heruntergeladen werden. Die aktuellste Stelle ist ein gitlab Repository. Alternativ werden Releases auch auf der CityDoctor Homepage der BHT gelistet. Es gibt dabei immer zwei Versionen:</p> <ul> <li>CityDoctorGUI-3.x.x.zip: Das ist die grafische Oberfl\u00e4che inklusive der Pr\u00fcfungen. Geeignet f\u00fcr den Endnutzer auf einem Desktop PC.</li> <li>CityDoctorValidation-3.x.x.zip: Das ist die Batch-Version die f\u00fcr die Integration in Servern oder anderen bestehenden Systemen geeignet ist und hat keine grafische Oberfl\u00e4che sondern arbeitet Dateibasiert als Prozess.</li> </ul> <p>Note</p> <p>Es gibt manchmal Spezialversionen die Testweise erstellt worden sind um verschiedene Auslieferungsm\u00f6glichkeiten zu testen. Bsp: CityDoctorGUI-x.x.x-win.zip beinhaltet die JavaFX Bibliotheken sodass eine Java Umgebung ohne JavaFX auch verwendet werden kann.</p>"},{"location":"requiredSoftware/#java","title":"Java","text":"<p>Vor der CityDoctor Version 3.12.x wird Java 8 entweder als JDK oder als JRE ben\u00f6tigt. Ab der Version 3.12.x wird Java 17 ben\u00f6tigt.</p> <p>Warning</p> <p>Es wichtig, dass die installierte Java Version die JavaFX Bibliotheken mit einschlie\u00dft. Diese werden f\u00fcr die grafische Oberfl\u00e4che ben\u00f6tigt.</p> <p>Die Liberica JRE oder JDK hat sich f\u00fcr einen Einsatz mit CityDoctor bew\u00e4hrt.</p> <p>Note</p> <p>Die Liberica Distribution ist zu 100% frei und OpenSource.</p> <p>Note</p> <p>F\u00fcr die Entwicklung mit CityDoctor wird eine JDK ben\u00f6tigt.</p>"},{"location":"requirements/","title":"Anforderungen und Pr\u00fcfungen f\u00fcr die Validierung von CityGML-Modellen","text":"<p>Die Anforderungen sind die Grundbausteine f\u00fcr ein Validierungsplan um CityGML-Modelle zu validieren. F\u00fcr Namenskonventionen und Definitionen, siehe Grundbegriffe. </p> <p>Eine Anforderung kann durch einen oder mehrere Pr\u00fcfungen validiert werden. Eine Pr\u00fcfung validiert ein oder mehrere Anforderungen bei einem Modell. Jede Pr\u00fcfung kann Vorbedingungen haben. Wenn diese Vorbedingungen nicht erf\u00fcllt sind wird die Pr\u00fcfung nicht ausgef\u00fchrt.</p> <p>Unterschieden wird dabei zwischen:</p> <ul> <li>Schemaanforderungen</li> <li>Geometrieanforderungen</li> <li>Semantische Anforderungen</li> </ul>"},{"location":"schemaRequirements/","title":"Schemaanforderungen","text":""},{"location":"schemaRequirements/#r_sc_schema_validation","title":"R_SC_SCHEMA_VALIDATION","text":""},{"location":"schemaRequirements/#anforderung","title":"Anforderung","text":"ID R_SC_SCHEMA_VALIDATION Beschreibung Eine grundlengende Anforderung ist, dass jedes CityGML Dokument wohl definiert sein muss und XSD valide ist. Fehlercode SC-SCHEMA-NOT-VALID"},{"location":"schemaRequirements/#prufung","title":"Pr\u00fcfung","text":"ID SC_SCHEMA_VALIDATION Anforderungs ID R_SC_SCHEMA_VALIDATION Vorbedingungen keine Beschreibung Werkzeuge um eine XSD Validierung durchzuf\u00fchren sind verf\u00fcgbar und geben verl\u00e4ssliche Ergebnisse Fehlercode SC_SCHEMA_NOT_VALID"},{"location":"semantic/","title":"Semantische Anforderungen","text":"<p>Die semantischen Anforderungen sind meistens auf Attributbasis. Daraus ergeben sich 3 Fehlerzust\u00e4nde f\u00fcr ein Attribut:</p> <ul> <li>SE_ATTRIBUTE_WRONG_VALUE: Wenn ein Attribut ein falschen Wert hat.</li> <li>SE_ATTRIBUTE_MISSING: Wenn ein Attribut fehlt, aber vorhanden sein sollte.</li> <li>SE_ATTRIBUTE_INVALID: Wenn ein Attribut vorhanden ist aber verboten ist.</li> </ul> <p>Warning</p> <p>SE_ATTRIBUTE_INVALID: ist noch nicht in CityDoctor und der QualityADE umgesetzt ist aber geplant in einer neuen Version zu unterst\u00fctzen.</p>"},{"location":"semantic/#schematron","title":"Schematron","text":"<p>In CityDoctor wurde das XML Validierungssystem Schematron integriert um flexibel Attributpr\u00fcfungen anzupassen und zu unterst\u00fctzen. </p> <p>Hier ist ein Beispiel f\u00fcr eine Schematron Datei die CityDoctor integrieren kann:</p>"},{"location":"semantic/#citydoctor-3130","title":"CityDoctor >= 3.13.0","text":"<pre><code><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\" queryBinding=\"xslt2\">\n <ns prefix=\"gml\" uri=\"http://www.opengis.net/gml\"/>\n <ns prefix=\"bldg\" uri=\"http://www.opengis.net/citygml/building/2.0\"/>\n\n <pattern>\n <rule context=\"//*:Building\">\n <assert test=\"count(descendant::*:lod1Solid) &gt; 0 or count(descendant::*:lod2Solid) &gt; 0 or count(descendant::*:lod3Solid) &gt; 0 or count(descendant::*:lod4Solid) &gt; 0\"><value-of select=\"@gml:id | @id\"/>||||SE_ATTRIBUTE_MISSING||any solid</assert>\n </rule>\n <rule context=\"//*:BuildingPart\">\n <assert test=\"count(*:lod1Solid) = 1 or count(*:lod2Solid) = 1 or count(*:lod3Solid) = 1 or count(*:lod4Solid) = 1\"><value-of select=\"ancestor::*:Building/@*:id\"/>||<value-of select=\"@gml:id | @id\"/>||SE_ATTRIBUTE_MISSING||any solid</assert>\n </rule>\n </pattern>\n</schema> \n\n</code></pre>"},{"location":"semantic/#citydoctor-3130_1","title":"CityDoctor < 3.13.0","text":"<pre><code><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\" queryBinding=\"xslt2\">\n <ns prefix=\"gml\" uri=\"http://www.opengis.net/gml\"/>\n <ns prefix=\"bldg\" uri=\"http://www.opengis.net/citygml/building/2.0\"/>\n\n <pattern>\n <rule context=\"//*:Building\">\n <assert test=\"count(descendant::*:lod1Solid) &gt; 0 or count(descendant::*:lod2Solid) &gt; 0 or count(descendant::*:lod3Solid) &gt; 0 or count(descendant::*:lod4Solid) &gt; 0\"><value-of select=\"@gml:id | @id\"/>||||SE_ATTRIBUTE_MISSING||any solid||false</assert>\n </rule>\n <rule context=\"//*:BuildingPart\">\n <assert test=\"count(*:lod1Solid) = 1 or count(*:lod2Solid) = 1 or count(*:lod3Solid) = 1 or count(*:lod4Solid) = 1\"><value-of select=\"ancestor::*:Building/@*:id\"/>||<value-of select=\"@gml:id | @id\"/>||SE_ATTRIBUTE_MISSING||any solid||false</assert>\n </rule>\n </pattern>\n</schema> \n</code></pre> <p>Diese Datei pr\u00fcft, dass alle Buildings in sich selbst oder in einem ihrer Unterelementen ein Solid beliebigen LODSs vorhanden ist. Au\u00dferdem stellt die Datei sicher, dass jedes BuildingPart ein Solid enth\u00e4lt. Wenn dies nicht der Fall ist wird eine Fehlermeldung ausgegeben. Die Fehlermeldung ist dabei so formattiert, dass CityDoctor sie interpretieren und in das interne Datenmodell einbinden kann.</p>"},{"location":"semantic/#fehlerformat","title":"Fehlerformat","text":"<p>Das Fehlerformat ist ein CSV-Format mit || als Trennzeichen</p> <pre><code>parent id||child id||error code||error type||is generic attribute\n</code></pre> <p>Die Fehlermeldung besteht aus den folgenden Teilen:</p> <ul> <li>Die <code>parent id</code> ist die gml id des obersten Elements z.B. Building oder Bridge. </li> <li>Falls der Fehler in einem Unterelement aufgetreten ist so kann diese ID in dem Feld f\u00fcr die <code>child id</code> eingetragen werden.</li> <li>Im Feld <code>error type</code> ist einer der 3 Fehlertypen einzutragen: <code>SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID</code>.</li> </ul> <p>note Nur in CityDoctor < 3.13.0: * Um ein generisches Attribut mit dem Namen <code>measuredHeight</code> von dem nicht generischen Attribut zu unterscheiden ist im letzten Feld vorgesehen <code>true</code> einzutragen wenn es sich um ein generisches Attribut handelt ansonsten <code>false</code>. </p>"},{"location":"userInterface/","title":"Nutzeroberfl\u00e4che","text":""},{"location":"userInterface/#citydoctor","title":"CityDoctor","text":"<p>In der oberen Leiste sind folgende Schaltfl\u00e4chen in Reihenfolge:</p> <ul> <li>Laden: \u00d6ffnet den Dialog zum laden einer CityGML Datei</li> <li>Pr\u00fcfen: \u00d6ffnet den Dialog zum pr\u00fcfen einer geladenen CityGML</li> <li>Pr\u00fcfberichte: \u00d6ffnet den Dialog zum schreiben eines Pr\u00fcfprotokolls in xml oder pdf Form</li> <li>Gitternetz: Zeigt/Versteckt das Gitternetz anstatt gef\u00fcllter Polygone</li> <li>R\u00fcckseiten: Zeigt/Versteckt R\u00fcckseiten von Polygonen</li> <li>Globale Ansicht: L\u00e4dt alle Elemente einer CityGML in die Ansicht</li> <li>LODs: Schaltet einzelne LODs von der Ansicht an oder aus</li> <li>Speichern: Speichert eine CityGML Datei zur\u00fcck, falls die Datei gepr\u00fcft wurde wird die QualityADE mitgeschrieben.</li> <li>About: \u00d6ffnet den Dialog mit Informationen zu dem Projekt CityDoctor2</li> <li>Ansichten: Wechselt verschiedene Ansichten. F\u00fcr die Pr\u00fcfung gibt es nur eine.</li> <li>Sprache: Hier kann die Sprache eingestellt werden (Deutsch/Englisch)</li> </ul> <p>Warning</p> <p>Das Anzeigen der Globalen Ansicht kann bei gro\u00dfen CityGML Dateien (> 100mb je nach System) zu abst\u00fcrzen f\u00fchren. Das Anzeigen kann kurz dauern.</p>"},{"location":"userInterface/#laden","title":"Laden","text":"<p>\u00dcber die Schaltfl\u00e4che Laden wird der Dialog zum laden einer CityGML Datei ge\u00f6ffnet.</p> <p></p> <p>In der Datei Leiste kann ein Dateipfad eingetragen werden oder \u00fcber die Schaltfl\u00e4che Ausw\u00e4hlen ausgew\u00e4hlt werden.</p> <p>Au\u00dferdem k\u00f6nnen weitere Einstellungen f\u00fcr das Lesen der Datei angegeben werden.</p> <ul> <li>NumberOfRoundingPlaces: Auf wie viele Nachkommastellen werden die eingelesenen Werte gerundet.</li> <li>XML-Validierung: F\u00fchrt eine XML Validierung durch. Fehler werden dabei direkt beim einlesen festgestellt und das Einlesen wird abgebrochen.</li> <li>Speicherverbrauch: Spart RAM um gr\u00f6\u00dfere Dateien in der GUI zu erm\u00f6glichen. Kostet geringf\u00fcgig Performance bei der Pr\u00fcfung.</li> </ul> <p>Beim Laden wird der Fortschritt ungef\u00e4hr durch den Ladebalken repr\u00e4sentiert.</p> <p>Note</p> <p>Dateien k\u00f6nnen auch direkt per Drag and Drop vom Dateimanager in die GUI gezogen werden ohne den Laden Dialog zu verwenden. Dabei werden die Default Werte angenommen (8 Nachkommastellen, keine XML-Validierung)</p> <p>Nach dem Laden einer CityGML Datei werden die Elemente in den einzelnen Tabs angezeigt. Durch ausw\u00e4hlen eines Elements wird das in der Ansicht angezeigt.</p> <p></p> <p>Note</p> <p>Durch Ausw\u00e4hlen des obersten Elements eines Reiters werden alle Elemente innerhalb diese Reiters angezeigt. Wie obige Warnung schon besagt, gilt auch hier, dass gr\u00f6\u00dfere Datenmengen zu Abst\u00fcrzen f\u00fchren.</p>"},{"location":"userInterface/#prufen","title":"Pr\u00fcfen","text":"<p>Im Pr\u00fcfdialog kann der Validierungsplan angepasst werden. Hier werden neben den Verf\u00fcgbaren Pr\u00fcfungen auch die globalen Parameter angezeigt.</p> <p>Ver\u00e4ndert k\u00f6nnen die Parameter mit einem Doppelklick in die Wert Spalte. Die Einheit ist dabei fest.</p> <p>Note</p> <p>Der Parameter numberOfRoundingPlaces kann nicht ver\u00e4ndert werden. Er wurde beim Laden der Datei festgelegt.</p> <p>Falls Pr\u00fcfungen nicht ausgef\u00fchrt werden sollen k\u00f6nnen sie in der Spalte Aktiv deaktiviert werden.</p> <p>Warning</p> <p>Wenn Pr\u00fcfungen deaktiviert wurden die andere aktiven Pr\u00fcfungen aber als Abh\u00e4ngigkeit ben\u00f6tigen werden sie bei der Pr\u00fcfung wieder aktiviert um die Stabilit\u00e4t zu gew\u00e4hrleisten. Siehe Anforderungen.</p> <p>In dem Feld Schematron Datei kann ein Pfad zu einer Schematron Datei eingetragen werden. In dieser Datei k\u00f6nnen flexible Regeln f\u00fcr die semantischen Anforderungen festgelegt werden. Siehe Semantische Pr\u00fcfungen</p> <p>\u00dcber die beiden Schaltfl\u00e4chen oben rechts kann der Pr\u00fcfplan gespeichert und geladen werden.</p> <p>Nach der Pr\u00fcfung werden fehlerhafte Elemente rot und fehlerfreie Elemente gr\u00fcn eingef\u00e4rbt. Bei der Auswahl eines Elements das fehler beinhaltet werden die Fehler in dem unteren Tab Fehler angezeigt. Dort kann der Fehler ausgew\u00e4hlt werden um ihn in CityDoctor anzuzeigen und weitere Informationen zu erhalten.</p> <p></p> <p>Die Elemente k\u00f6nnen mit dem Dropdown-Men\u00fc gefiltert werden um nur fehlerhafte Elemente anzuzeigen.</p>"},{"location":"userInterface/#prufberichte","title":"Pr\u00fcfberichte","text":"<p>In diesem Dialog gibt es nochmal eine \u00dcbersicht \u00fcber die Fehler in Bildform und die M\u00f6glichkeit einen xml oder pdf Bericht zu schreiben.</p> <p></p>"},{"location":"validationPlan/","title":"Validierungsplan","text":"<p>der Validierungsplan f\u00fcr CityDoctor wird in YAML angegeben.</p> <p>F\u00fcr die Version 3.12.x sieht ein Beispiel so aus:</p> <pre><code>globalParameters:\n numberOfRoundingPlaces: 8\n # in m\n minVertexDistance: 0.0001\n schematronPath: 'checkForSolid.xml'\nuseStreaming: true # (1)!\nrequirements:\n R_GE_R_TOO_FEW_POINTS:\n enabled: true\n R_GE_R_NOT_CLOSED:\n enabled: true\n R_GE_R_CONSECUTIVE_POINTS_SAME:\n enabled: true\n R_GE_R_SELF_INTERSECTION:\n enabled: true\n R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:\n enabled: true\n R_GE_P_INTERIOR_DISCONNECTED:\n enabled: true\n R_GE_P_INTERSECTING_RINGS:\n enabled: true\n R_GE_P_NON_PLANAR:\n enabled: true\n parameters:\n # one of (\"distance\", \"angle\", \"both\")\n type: distance\n # in m\n distanceTolerance: 0.01\n # in degree\n angleTolerance: 1\n R_GE_P_HOLE_OUTSIDE:\n enabled: true\n R_GE_P_ORIENTATION_RINGS_SAME:\n enabled: true\n R_GE_P_INNER_RINGS_NESTED:\n enabled: true\n R_GE_S_TOO_FEW_POLYGONS:\n enabled: true\n R_GE_S_NOT_CLOSED:\n enabled: true\n R_GE_S_NON_MANIFOLD_EDGE:\n enabled: true\n R_GE_S_POLYGON_WRONG_ORIENTATION:\n enabled: true\n R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:\n enabled: true\n R_GE_S_NON_MANIFOLD_VERTEX:\n enabled: true\n R_GE_S_SELF_INTERSECTION:\n enabled: true\n R_SE_BS_IS_WALL:\n enabled: false\n parameters:\n lowerAngle: '45'\n upperAngle: '135'\n R_SE_BS_IS_FLOOR:\n enabled: false\n R_SE_BS_GROUND_UNFRAGMENTED:\n enabled: false\n R_SE_BS_IS_GROUND:\n enabled: false\n R_SE_BS_IS_CEILING:\n enabled: false\n</code></pre> <ol> <li>Der Parameter <code>useStreaming</code> ist ein Schalter um eine Datei St\u00fcck f\u00fcr St\u00fcck einzulesen anstelle erst die komplette Datei zu lesen bevor die Pr\u00fcfung stattfindet. Mit dieser Einstellung k\u00f6nnen auch Dateien > 2GB ohne gro\u00dfe RAM Anforderungen gepr\u00fcft werden.</li> </ol> <p>In dem Validierungsplan finden sich die selben Einstellungen wieder, die in der grafischen Oberfl\u00e4che auch aufgelistet sind.</p> <p>Unter requirements sind alle Anforderungen gelistet die gepr\u00fcft werden sollen. Dabei sind die semantischen Pr\u00fcfungen standardm\u00e4\u00dfig deaktiviert. </p>"}]}
{"config":{"lang":["de"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"CityDoctor2","text":"<p>Entwicklung eines Systems zur automatisierten Reparatur virtueller Stadtmodelle </p> <p>CityDoctor2 ist eine Qualit\u00e4tspr\u00fcfungssoftware f\u00fcr 3D Stadtmodelle im CityGML format. CityDoctor kann CityGML 1/2 Dokumente einlesen und seit Version 3.12 kann auch eingeschr\u00e4nkt CityGML 3 gelesen werden. Alle Pr\u00fcfergebnisse k\u00f6nnen in xml oder pdf Form ausgegeben werden. Zus\u00e4tzlich implementiert CityDoctor die QualityADE um Pr\u00fcfergebnisse direkt in CityGML zu speichern.</p> <p></p>"},{"location":"#lizenzen-versionen","title":"Lizenzen / Versionen","text":""},{"location":"#citydoctorvalidation","title":"CityDoctorValidation","text":"<p>Der Validierungsteil von CityDoctor ist frei verf\u00fcgbar und OpenSource</p>"},{"location":"#citydoctorgui","title":"CityDoctorGUI","text":"<p>Die grafische Oberfl\u00e4che ist frei aber nicht OpenSource (siehe Installation)</p>"},{"location":"#citydoctorhealer","title":"CityDoctorHealer","text":"<p>Der Teil zust\u00e4ndig f\u00fcr die Reparatur ist nur in Absprache mit uns zu erhalten. Mail an: </p>"},{"location":"#projekt","title":"Projekt","text":"<p>Projektlaufzeit: 01.11.2018 - 31.12.2021</p>"},{"location":"#partner","title":"Partner","text":"<p>Projektverantwortliche: Prof. Dr. Margitta Pries</p> <p>Verbundpartner: Prof. Dr.-Ing. Volker Coors</p> <p>Kooperationspartner: 3DIS GmbH 3dpartzz GmbH con terra GmbH Geoplex GIS GmbH Mark Wewetzer M.O.S.S. Computer Grafik Systeme GmbH Steinbeis - Transferzentrum Virtual City Systems</p> <p>Assoziative Partner: Landesamt f\u00fcr Geoinformation und Landentwicklung Baden-W\u00fcrttemberg </p> <p>Mittelgeber: Bundesministerium f\u00fcr Bildung und Forschung </p> <p>Projekttr\u00e4ger: VDI Technologiezentrum </p> <p></p>"},{"location":"R_GE_MS/","title":"R_GE_MS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_MS_0001</p>"},{"location":"R_GE_P_HOLE_OUTSIDE/","title":"R_GE_P_HOLE_OUTSIDE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0004</p>"},{"location":"R_GE_P_INNER_RINGS_NESTED/","title":"R_GE_P_INNER_RINGS_NESTED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0005</p>"},{"location":"R_GE_P_INTERIOR_DISCONNECTED/","title":"R_GE_P_INTERIOR_DISCONNECTED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0003 </p>"},{"location":"R_GE_P_INTERSECTING_RINGS/","title":"R_GE_P_INTERSECTING_RINGS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0001</p>"},{"location":"R_GE_P_NON_PLANAR/","title":"R_GE_P_NON_PLANAR","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0002 </p>"},{"location":"R_GE_P_ORIENTATION_RINGS_SAME/","title":"R_GE_P_ORIENTATION_RINGS_SAME","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_PO_0006 </p>"},{"location":"R_GE_R_COLLAPSED_TO_LINE/","title":"R_GE_R_COLLAPSED_TO_LINE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0005</p>"},{"location":"R_GE_R_CONSECUTIVE_POINTS_SAME/","title":"R_GE_R_CONSECUTIVE_POINTS_SAME","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0002</p>"},{"location":"R_GE_R_NOT_CLOSED/","title":"R_GE_R_NOT_CLOSED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0003</p>"},{"location":"R_GE_R_SELF_INTERSECTION/","title":"R_GE_R_SELF_INTERSECTION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0004</p>"},{"location":"R_GE_R_TOO_FEW_POINTS/","title":"R_GE_R_TOO_FEW_POINTS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_LR_0001</p>"},{"location":"R_GE_SO/","title":"R_GE_SO","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0009</p>"},{"location":"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION/","title":"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0008</p>"},{"location":"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS/","title":"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0005</p>"},{"location":"R_GE_S_NON_MANIFOLD_EDGE/","title":"R_GE_S_NON_MANIFOLD_EDGE","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0004</p>"},{"location":"R_GE_S_NON_MANIFOLD_VERTEX/","title":"R_GE_S_NON_MANIFOLD_VERTEX","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0003</p>"},{"location":"R_GE_S_NOT_CLOSED/","title":"R_GE_S_NOT_CLOSED","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0002</p>"},{"location":"R_GE_S_POLYGON_WRONG_ORIENTATION/","title":"R_GE_S_POLYGON_WRONG_ORIENTATION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0007</p>"},{"location":"R_GE_S_SELF_INTERSECTION/","title":"R_GE_S_SELF_INTERSECTION","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0006</p>"},{"location":"R_GE_S_TOO_FEW_POLYGONS/","title":"R_GE_S_TOO_FEW_POLYGONS","text":"<p>siehe https://gitlab.com/volkercoors/agqual3d/-/wikis/Validierung/Anforderungen/GE_gml_SO_0001</p>"},{"location":"basic/","title":"Validierung von 3D Stadtmodellen in CityGML","text":""},{"location":"basic/#begriffe-und-definitionen","title":"Begriffe und Definitionen","text":"<p>nach CityGML Quality Interoperability Experiment, chapter 3</p> <p>Validierung</p> <p>Prozess des validierens einer CityGML Datei nach spezifizierten Anforderungen. Eine valide Datei entspricht allen Anforderungen.</p> <p>Anforderungen</p> <p>Regeln und Einschr\u00e4nkungen, die die Datenstruktur eindeutig definieren. Anforderungen k\u00f6nnen von dem CityGML Standard Dokument abgleitet werden oder gesondert, als Anforderung an den CityGML Standard, definiert werden um Mehrdeutigkeiten des Standards zu verhindern oder zus\u00e4tzliche nutzerabh\u00e4ngige Anforderungen zu definieren.</p> <p>Pr\u00fcfung</p> <p>Algorithmische Implementation um eine Anforderung innerhalb eines Validerungsprogramms zu pr\u00fcfen.</p> <p>Fehler</p> <p>Ergebnis einer Pr\u00fcfung im Falle einer Nichtkonformit\u00e4t von Anforderungen.</p> <p>Validierungsplan</p> <p>Strukturierte Liste von Anforderungen, \u00fcberlicherweise angepasst an den konkreten Fall.</p>"},{"location":"basic/#zusatzliche-defintionen","title":"Zus\u00e4tzliche Defintionen:","text":"<p>XSD valide</p> <p>Eine CityGML Datei XSD valide wenn sie dem CityGML XML Schema entspricht.</p>"},{"location":"firstRun/","title":"Erster Start","text":""},{"location":"firstRun/#start","title":"Start","text":"<p>Nach dem entpacken der Zip Datei sollte je nach Version (GUI oder Batch) eine Struktur \u00e4hnlich diesem Bild rauskommen (Beispiel CityDoctorGUI): </p> <p>Um CityDoctor zu starten kann die start.bat verwendet werden.</p> <p>Die .bat Datei enth\u00e4lt dabei nur den Befehl:</p> <pre><code>java -classpath app/*;plugins/* de.hft.stuttgart.citydoctor2.gui.CityDoctorGUIStarter\n</code></pre> <p>Note</p> <p>Der Befehl hat sich \u00fcber die Versionshistorie von CityDoctor ver\u00e4ndert.</p> <p>F\u00fcr die Batch Version ist der Befehl analog und kann entsprechend f\u00fcr andere Betriebsysteme angepasst werden.</p> <p>Note</p> <p>F\u00fcr Linux oder Mac kann dieser Befehl auch verwendet werden, es muss nur das \";\" durch \":\" ersetzt werden. Der Rest bleibt gleich.</p>"},{"location":"geometric/","title":"Geometrieanforderungen","text":""},{"location":"geometric/#fehlercodes-for-geometrische-fehler","title":"Fehlercodes for geometrische Fehler","text":"<p>Die Fehlercodes wurden \u00fcbernommen aus dem CityGML Quality Interoperability Experiment, chapter 7.5.</p> <p>Note</p> <p>Die Anforderungen wurden in CityDoctor umbenannt um einen auch von Menschen zu verstehenden Begriff, analog zu den Fehlercodes, darzustellen.</p> <p>Alle geometrischen Fehler sind in dem \"GE\" Definitionsbereich. Da geometrische Validierung basierend auf den Primitiven auf drei verschiedenen Ebenen ausgef\u00fchrt wird enth\u00e4lt jede Anforderung eine Ebene:</p> <ul> <li>Ring: R</li> <li>Polygon: P</li> <li>H\u00fclle (Shell): S</li> </ul> <p>Fehlercodes folgen dem selben Namensschema wie die Anforderungen, siehe auch Grundbegriffe. Jede Verletzung einer Anforderung muss in einem Fehler enden, der einen entsprechenden Fehlercode beinhaltet. Jeder Fehler kann (und sollte) zus\u00e4tzliche Informationen beinhalten (z.B. Wenn ein Ring nicht geschlossen ist, dann sollte die ID des Rings mitgegeben werden).</p>"},{"location":"geometric/#vertex-punkt-anforderungen","title":"Vertex (Punkt) Anforderungen","text":"<p>Zwei Punkte A und B sind gleich wenn die Euclidische-Distanz zwischen den beiden Punkten kleiner als eine definierte Gr\u00f6\u00dfe ist (minVertexDistance). Diese definierte Gr\u00f6\u00dfe findet auch in vielen Anforderungen wieder Anwendung, zum Beispiel ber\u00fchrt ein Punkt eine Kante wenn der Abstand des Punktes kleiner ist als minVertexDistance. In den folgenden Anforderungen wird die Gr\u00f6\u00dfe verwendet:</p> <ul> <li>R_GE_R_CONSECUTIVE_POINTS_SAME</li> <li>R_GE_R_NOT_CLOSED</li> <li>R_GE_R_SELF_INTERSECTION</li> <li>R_GE_P_INTERIOR_DISCONNECTED</li> </ul> <p>Die folgenden Anforderungen wurden auf den drei geometrischen Ebenen definiert (nach Ledoux (2013)):</p>"},{"location":"geometric/#linear-ring","title":"Linear Ring","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_R_TOO_FEW_POINTS Zu wenig Punkte in einem Ring GE_R_TOO_FEW_POINTS C_GE_R_TOO_FEW_POINTS R_GE_R_CONSECUTIVE_POINTS_SAME 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 Der erste und letzte Punkt sind nicht gleich GE_R_NOT_CLOSED C_GE_R_NOT_CLOSED R_GE_R_SELF_INTERSECTION 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 Momentan nicht in Benutzung, da redundant mit R_GE_R_SELF_INTERSECTION Ring ist ein Punkt oder eine Linie GE_R_COLLAPSED_TO_LINE C_GE_R_COLLAPSED_TO_LINE R_GE_R_ALL Container f\u00fcr: R_GE_R_TOO_FEW_POINTS, R_GE_R_CONSECUTIVE_POINTS_SAME, R_GE_R_NOT_CLOSED, R_GE_R_SELF_INTERSECTION -- --"},{"location":"geometric/#polygon","title":"Polygon","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_P_INTERSECTING_RINGS 2+ Ringe schneiden sich GE_P_INTERSECTING_RINGS C_GE_P_INTERSECTING_RINGS R_GE_P_NON_PLANAR Nicht planares Polygon, sowohl Distanz als auch Fl\u00e4chennormale 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 Innenfl\u00e4che ist nicht verbunden GE_P_INTERIOR_DISCONNECTED C_GE_P_INTERIOR_DISCONNECTED R_GE_P_HOLE_OUTSIDE 1+ inneren Ringe ist komplett au\u00dferhalb des Polygons GE_P_HOLE_OUTSIDE C_GE_P_HOLE_OUTSIDE R_GE_P_INNER_RINGS_NESTED 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 \u00c4u\u00dferer 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\u00fcr: 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 -- --"},{"location":"geometric/#solid-hulle-shell","title":"Solid / H\u00fclle (Shell)","text":"Anforderungs ID Beschreibung Fehlercode Bekannte Pr\u00fcfungen R_GE_S_TOO_FEW_POLYGONS <4 Polygone GE_S_TOO_FEW_POLYGONS C_GE_S_TOO_FEW_POLYGONS R_GE_S_NOT_CLOSED Die H\u00fclle ist nicht wasserdicht / hat 1+ L\u00f6cher GE_S_NOT_CLOSED C_GE_S_NOT_CLOSED R_GE_S_NON_MANIFOLD_VERTEX Jedes Polygon, das an einem Punkt anliegt muss \u00fcber Kanten mit den Anderen verbunden sein GE_S_NON_MANIFOLD_VERTEX C_GE_S_NON_MANIFOLD_VERTEX R_GE_S_NON_MANIFOLD_EDGE An jeder Kante d\u00fcrfen nur 2 Polygon anliegen GE_S_NON_MANIFOLD_EDGE C_GE_S_NON_MANIFOLD_EDGE R_GE_S_MULTIPLE_CONNECTED_COMPONENTS Alle Polygone m\u00fcssen \u00fcber Punkte und Kanten verbunden sein GE_S_MULTIPLE_CONNECTED_COMPONENTS C_GE_S_MULTIPLE_CONNECTED_COMPONENTS R_GE_S_SELF_INTERSECTION Die H\u00fclle selbstverschneidet sich GE_S_SELF_INTERSECTION C_GE_S_SELF_INTERSECTION R_GE_S_POLYGON_WRONG_ORIENTATION Die Orientierung eines Polygons ist falsch GE_S_POLYGON_WRONG_ORIENTATION C_GE_S_POLYGON_WRONG_ORIENTATION R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION 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\u00fcr: 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 -- --"},{"location":"geometric/#parameter-uberblick","title":"Parameter \u00dcberblick","text":"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\u00e4tspr\u00fcfungsart, 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"},{"location":"geometric/#abhangigkeitsbaum","title":"Abh\u00e4ngigkeitsbaum","text":"<p>Dies ist die Reihenfolge in der die Pr\u00fcfungen ausgef\u00fchrt werden. Wenn eine abh\u00e4ngige Pr\u00fcfung einen Fehler geworfen hat oder nicht ausgef\u00fchrt wurde, so wird die darauffolgende Pr\u00fcfung auch nicht ausgef\u00fchrt.</p> <pre><code>graph TD;\n X0001[R_SC_SCHEMA_VALIDATION]\n R0001[R_GE_R_TOO_FEW_POINTS]\n R0002[R_GE_R_CONSECUTIVE_POINTS_SAME]\n R0003[R_GE_R_NOT_CLOSED]\n R0004[R_GE_R_SELF_INTERSECTION]\n P0001[R_GE_P_INTERSECTING_RINGS]\n P0002[R_GE_P_NON_PLANAR]\n P0003[R_GE_P_INTERIOR_DISCONNECTED]\n P0004[R_GE_P_HOLE_OUTSIDE]\n P0005[R_GE_P_INNER_RINGS_NESTED]\n P0006[R_GE_P_ORIENTATION_RINGS_SAME]\n\n S0001[R_GE_S_TOO_FEW_POLYGONS]\n S0002[R_GE_S_NOT_CLOSED]\n S0003[R_GE_S_NON_MANIFOLD_VERTEX]\n S0004[R_GE_S_NON_MANIFOLD_EDGE]\n S0005[R_GE_S_MULTIPLE_CONNECTED_COMPONENTS]\n S0006[R_GE_S_SELF_INTERSECTION]\n S0007[R_GE_S_POLYGON_WRONG_ORIENTATION]\n S0008[R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION]\n\n X0001-->R0003;\n R0003-->R0001;\n R0001-->R0002;\n R0002-->R0004;\n R0004-->P0002;\n P0002-->P0006;\n P0006-->P0003;\n P0006-->P0004;\n P0006-->P0005;\n P0004-->P0001;\n P0005-->P0001;\n P0001-->S0001;\n P0003-->S0001;\n S0001-->S0002;\n S0001-->S0004;\n S0001-->S0003;\n S0001-->S0005;\n S0002-->S0007;\n S0004-->S0007;\n S0007-->S0006;\n S0003-->S0006;\n S0005-->S0006;\n S0006-->S0008; \n</code></pre>"},{"location":"geometric/#multisurface-und-solid-geometrie","title":"Multisurface und Solid Geometrie","text":"<p>Um die Definition eines Validierungsplans zu vereinfachen werden zwei neue Anfoderungen zus\u00e4tzlich eingef\u00fchrt. Diese Anforderungen dienen lediglich zur Gruppierung von den vorhandenen Anforderungen und ben\u00f6tigen keine zus\u00e4tzlichen Pr\u00fcfungen.</p> Anforderungs ID Beschreibung Abh\u00e4ngigkeiten Fehlercode Bekannte Pr\u00fcfungen R_GE_MS Valide Multisurface-Geometrie R_SC-SCHEMA-VALIDATION, R_GE_P_ALL -- -- R_GE_SO Valide H\u00fcllengeometrie R_SC-SCHEMA-VALIDATION, R_GE_S_ALL -- --"},{"location":"requiredSoftware/","title":"Ben\u00f6tigte Software","text":""},{"location":"requiredSoftware/#versionen-ab-3130","title":"Versionen ab 3.13.0","text":"<p>Ab Version 3.13.0 wurde ein Repository auf dem Transferportal der Hochschule erstellt, das fortan als Ablageort f\u00fcr fertige Releases verwendet wird: https://transfer.hft-stuttgart.de/gitlab/citydoctor/citydoctorreleases</p> <p>Die Versionen sind dort unterteilt zwischen CityDoctorValidation und CityDoctorGUI und unter diesen Ordnern gibt es die entsprechenden Versionsordner.</p>"},{"location":"requiredSoftware/#releaseversionen","title":"Releaseversionen","text":"<p>F\u00fcr jede CityDoctor Variante (CityDoctorValidation oder CityDoctorGUI) werden vier verschiedene Versionen zum Download bereitgestellt. Es werden in verschiedenen Versionen Java Runtimes der Liberica Distribution mitgeliefert. </p> Version Beschreibung CityDoctor*-no-runtime.zip Diese Version beinhaltet keine Runtime f\u00fcr Java. Falls auf Ihrem PC schon ein Java der Version 17 installiert ist (siehe Java), dann ist diese Version zu bevorzugen. CityDoctor*-win.zip Beinhaltet eine Windows Java Runtime zum ausf\u00fchren von CityDoctor, kein Java muss installiert sein. CityDoctor*-lin.zip Beinhaltet eine Linux Java Runtime zum ausf\u00fchren von CityDoctor CityDoctor*-mac.zip Beinhaltet eine Mac Java Runtime zum ausf\u00fchren von CityDoctor"},{"location":"requiredSoftware/#versionen-bis-312x","title":"Versionen bis 3.12.x","text":"<p>CityDoctor kann von verschiedenen Seiten heruntergeladen werden. Die aktuellste Stelle ist ein gitlab Repository. Alternativ werden Releases auch auf der CityDoctor Homepage der BHT gelistet. Es gibt dabei immer zwei Versionen:</p> <ul> <li>CityDoctorGUI-3.x.x.zip: Das ist die grafische Oberfl\u00e4che inklusive der Pr\u00fcfungen. Geeignet f\u00fcr den Endnutzer auf einem Desktop PC.</li> <li>CityDoctorValidation-3.x.x.zip: Das ist die Batch-Version die f\u00fcr die Integration in Servern oder anderen bestehenden Systemen geeignet ist und hat keine grafische Oberfl\u00e4che sondern arbeitet Dateibasiert als Prozess.</li> </ul> <p>Note</p> <p>Es gibt manchmal Spezialversionen die Testweise erstellt worden sind um verschiedene Auslieferungsm\u00f6glichkeiten zu testen. Bsp: CityDoctorGUI-x.x.x-win.zip beinhaltet die JavaFX Bibliotheken sodass eine Java Umgebung ohne JavaFX auch verwendet werden kann.</p>"},{"location":"requiredSoftware/#java","title":"Java","text":"<p>Vor der CityDoctor Version 3.12.x wird Java 8 entweder als JDK oder als JRE ben\u00f6tigt. Ab der Version 3.12.x wird Java 17 ben\u00f6tigt.</p> <p>Warning</p> <p>Es wichtig, dass die installierte Java Version die JavaFX Bibliotheken mit einschlie\u00dft. Diese werden f\u00fcr die grafische Oberfl\u00e4che ben\u00f6tigt.</p> <p>Die Liberica JRE oder JDK hat sich f\u00fcr einen Einsatz mit CityDoctor bew\u00e4hrt.</p> <p>Note</p> <p>Die Liberica Distribution ist zu 100% frei und OpenSource.</p> <p>Note</p> <p>F\u00fcr die Entwicklung mit CityDoctor wird eine JDK ben\u00f6tigt.</p>"},{"location":"requirements/","title":"Anforderungen und Pr\u00fcfungen f\u00fcr die Validierung von CityGML-Modellen","text":"<p>Die Anforderungen sind die Grundbausteine f\u00fcr ein Validierungsplan um CityGML-Modelle zu validieren. F\u00fcr Namenskonventionen und Definitionen, siehe Grundbegriffe. </p> <p>Eine Anforderung kann durch einen oder mehrere Pr\u00fcfungen validiert werden. Eine Pr\u00fcfung validiert ein oder mehrere Anforderungen bei einem Modell. Jede Pr\u00fcfung kann Vorbedingungen haben. Wenn diese Vorbedingungen nicht erf\u00fcllt sind wird die Pr\u00fcfung nicht ausgef\u00fchrt.</p> <p>Unterschieden wird dabei zwischen:</p> <ul> <li>Schemaanforderungen</li> <li>Geometrieanforderungen</li> <li>Semantische Anforderungen</li> </ul>"},{"location":"schemaRequirements/","title":"Schemaanforderungen","text":""},{"location":"schemaRequirements/#r_sc_schema_validation","title":"R_SC_SCHEMA_VALIDATION","text":""},{"location":"schemaRequirements/#anforderung","title":"Anforderung","text":"ID R_SC_SCHEMA_VALIDATION Beschreibung Eine grundlengende Anforderung ist, dass jedes CityGML Dokument wohl definiert sein muss und XSD valide ist. Fehlercode SC-SCHEMA-NOT-VALID"},{"location":"schemaRequirements/#prufung","title":"Pr\u00fcfung","text":"ID SC_SCHEMA_VALIDATION Anforderungs ID R_SC_SCHEMA_VALIDATION Vorbedingungen keine Beschreibung Werkzeuge um eine XSD Validierung durchzuf\u00fchren sind verf\u00fcgbar und geben verl\u00e4ssliche Ergebnisse Fehlercode SC_SCHEMA_NOT_VALID"},{"location":"semantic/","title":"Semantische Anforderungen","text":"<p>Die semantischen Anforderungen sind meistens auf Attributbasis. Daraus ergeben sich 3 Fehlerzust\u00e4nde f\u00fcr ein Attribut:</p> <ul> <li>SE_ATTRIBUTE_WRONG_VALUE: Wenn ein Attribut ein falschen Wert hat.</li> <li>SE_ATTRIBUTE_MISSING: Wenn ein Attribut fehlt, aber vorhanden sein sollte.</li> <li>SE_ATTRIBUTE_INVALID: Wenn ein Attribut vorhanden ist aber verboten ist.</li> </ul>"},{"location":"semantic/#schematron","title":"Schematron","text":"<p>In CityDoctor wurde das XML Validierungssystem Schematron integriert um flexibel Attributpr\u00fcfungen anzupassen und zu unterst\u00fctzen. </p> <p>Hier ist ein Beispiel f\u00fcr eine Schematron Datei die CityDoctor integrieren kann:</p>"},{"location":"semantic/#citydoctor-3130","title":"CityDoctor >= 3.13.0","text":"<pre><code><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\" queryBinding=\"xslt2\">\n <ns prefix=\"gml\" uri=\"http://www.opengis.net/gml\"/>\n <ns prefix=\"bldg\" uri=\"http://www.opengis.net/citygml/building/2.0\"/>\n\n <pattern>\n <rule context=\"//*:Building\">\n <assert test=\"count(descendant::*:lod1Solid) &gt; 0 or count(descendant::*:lod2Solid) &gt; 0 or count(descendant::*:lod3Solid) &gt; 0 or count(descendant::*:lod4Solid) &gt; 0\"><value-of select=\"@gml:id | @id\"/>||||SE_ATTRIBUTE_MISSING||any solid</assert>\n </rule>\n <rule context=\"//*:BuildingPart\">\n <assert test=\"count(*:lod1Solid) = 1 or count(*:lod2Solid) = 1 or count(*:lod3Solid) = 1 or count(*:lod4Solid) = 1\"><value-of select=\"ancestor::*:Building/@*:id\"/>||<value-of select=\"@gml:id | @id\"/>||SE_ATTRIBUTE_MISSING||any solid</assert>\n </rule>\n </pattern>\n</schema> \n\n</code></pre>"},{"location":"semantic/#citydoctor-3130_1","title":"CityDoctor < 3.13.0","text":"<pre><code><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema xmlns=\"http://purl.oclc.org/dsdl/schematron\" queryBinding=\"xslt2\">\n <ns prefix=\"gml\" uri=\"http://www.opengis.net/gml\"/>\n <ns prefix=\"bldg\" uri=\"http://www.opengis.net/citygml/building/2.0\"/>\n\n <pattern>\n <rule context=\"//*:Building\">\n <assert test=\"count(descendant::*:lod1Solid) &gt; 0 or count(descendant::*:lod2Solid) &gt; 0 or count(descendant::*:lod3Solid) &gt; 0 or count(descendant::*:lod4Solid) &gt; 0\"><value-of select=\"@gml:id | @id\"/>||||SE_ATTRIBUTE_MISSING||any solid||false</assert>\n </rule>\n <rule context=\"//*:BuildingPart\">\n <assert test=\"count(*:lod1Solid) = 1 or count(*:lod2Solid) = 1 or count(*:lod3Solid) = 1 or count(*:lod4Solid) = 1\"><value-of select=\"ancestor::*:Building/@*:id\"/>||<value-of select=\"@gml:id | @id\"/>||SE_ATTRIBUTE_MISSING||any solid||false</assert>\n </rule>\n </pattern>\n</schema> \n</code></pre> <p>Diese Datei pr\u00fcft, dass alle Buildings in sich selbst oder in einem ihrer Unterelementen ein Solid beliebigen LODSs vorhanden ist. Au\u00dferdem stellt die Datei sicher, dass jedes BuildingPart ein Solid enth\u00e4lt. Wenn dies nicht der Fall ist wird eine Fehlermeldung ausgegeben. Die Fehlermeldung ist dabei so formattiert, dass CityDoctor sie interpretieren und in das interne Datenmodell einbinden kann.</p>"},{"location":"semantic/#fehlerformat","title":"Fehlerformat","text":"<p>Das Fehlerformat ist ein CSV-Format mit || als Trennzeichen</p> <pre><code>parent id||child id||error code||error type||is generic attribute\n</code></pre> <p>Die Fehlermeldung besteht aus den folgenden Teilen:</p> <ul> <li>Die <code>parent id</code> ist die gml id des obersten Elements z.B. Building oder Bridge. </li> <li>Falls der Fehler in einem Unterelement aufgetreten ist so kann diese ID in dem Feld f\u00fcr die <code>child id</code> eingetragen werden.</li> <li>Im Feld <code>error type</code> ist einer der 3 Fehlertypen einzutragen: <code>SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID</code>.</li> </ul> <p>note Nur in CityDoctor < 3.13.0: * Um ein generisches Attribut mit dem Namen <code>measuredHeight</code> von dem nicht generischen Attribut zu unterscheiden ist im letzten Feld vorgesehen <code>true</code> einzutragen wenn es sich um ein generisches Attribut handelt ansonsten <code>false</code>. </p>"},{"location":"userInterface/","title":"Nutzeroberfl\u00e4che","text":""},{"location":"userInterface/#citydoctor","title":"CityDoctor","text":"<p>In der oberen Leiste sind folgende Schaltfl\u00e4chen in Reihenfolge:</p> <ul> <li>Laden: \u00d6ffnet den Dialog zum laden einer CityGML Datei</li> <li>Pr\u00fcfen: \u00d6ffnet den Dialog zum pr\u00fcfen einer geladenen CityGML</li> <li>Pr\u00fcfberichte: \u00d6ffnet den Dialog zum schreiben eines Pr\u00fcfprotokolls in xml oder pdf Form</li> <li>Gitternetz: Zeigt/Versteckt das Gitternetz anstatt gef\u00fcllter Polygone</li> <li>R\u00fcckseiten: Zeigt/Versteckt R\u00fcckseiten von Polygonen</li> <li>Globale Ansicht: L\u00e4dt alle Elemente einer CityGML in die Ansicht</li> <li>LODs: Schaltet einzelne LODs von der Ansicht an oder aus</li> <li>Speichern: Speichert eine CityGML Datei zur\u00fcck, falls die Datei gepr\u00fcft wurde wird die QualityADE mitgeschrieben.</li> <li>About: \u00d6ffnet den Dialog mit Informationen zu dem Projekt CityDoctor2</li> <li>Ansichten: Wechselt verschiedene Ansichten. F\u00fcr die Pr\u00fcfung gibt es nur eine.</li> <li>Sprache: Hier kann die Sprache eingestellt werden (Deutsch/Englisch)</li> </ul> <p>Warning</p> <p>Das Anzeigen der Globalen Ansicht kann bei gro\u00dfen CityGML Dateien (> 100mb je nach System) zu abst\u00fcrzen f\u00fchren. Das Anzeigen kann kurz dauern.</p>"},{"location":"userInterface/#laden","title":"Laden","text":"<p>\u00dcber die Schaltfl\u00e4che Laden wird der Dialog zum laden einer CityGML Datei ge\u00f6ffnet.</p> <p></p> <p>In der Datei Leiste kann ein Dateipfad eingetragen werden oder \u00fcber die Schaltfl\u00e4che Ausw\u00e4hlen ausgew\u00e4hlt werden.</p> <p>Au\u00dferdem k\u00f6nnen weitere Einstellungen f\u00fcr das Lesen der Datei angegeben werden.</p> <ul> <li>NumberOfRoundingPlaces: Auf wie viele Nachkommastellen werden die eingelesenen Werte gerundet.</li> <li>XML-Validierung: F\u00fchrt eine XML Validierung durch. Fehler werden dabei direkt beim einlesen festgestellt und das Einlesen wird abgebrochen.</li> <li>Speicherverbrauch: Spart RAM um gr\u00f6\u00dfere Dateien in der GUI zu erm\u00f6glichen. Kostet geringf\u00fcgig Performance bei der Pr\u00fcfung.</li> </ul> <p>Beim Laden wird der Fortschritt ungef\u00e4hr durch den Ladebalken repr\u00e4sentiert.</p> <p>Note</p> <p>Dateien k\u00f6nnen auch direkt per Drag and Drop vom Dateimanager in die GUI gezogen werden ohne den Laden Dialog zu verwenden. Dabei werden die Default Werte angenommen (8 Nachkommastellen, keine XML-Validierung)</p> <p>Nach dem Laden einer CityGML Datei werden die Elemente in den einzelnen Tabs angezeigt. Durch ausw\u00e4hlen eines Elements wird das in der Ansicht angezeigt.</p> <p></p> <p>Note</p> <p>Durch Ausw\u00e4hlen des obersten Elements eines Reiters werden alle Elemente innerhalb diese Reiters angezeigt. Wie obige Warnung schon besagt, gilt auch hier, dass gr\u00f6\u00dfere Datenmengen zu Abst\u00fcrzen f\u00fchren.</p>"},{"location":"userInterface/#prufen","title":"Pr\u00fcfen","text":"<p>Im Pr\u00fcfdialog kann der Validierungsplan angepasst werden. Hier werden neben den Verf\u00fcgbaren Pr\u00fcfungen auch die globalen Parameter angezeigt.</p> <p>Ver\u00e4ndert k\u00f6nnen die Parameter mit einem Doppelklick in die Wert Spalte. Die Einheit ist dabei fest.</p> <p>Note</p> <p>Der Parameter numberOfRoundingPlaces kann nicht ver\u00e4ndert werden. Er wurde beim Laden der Datei festgelegt.</p> <p>Falls Pr\u00fcfungen nicht ausgef\u00fchrt werden sollen k\u00f6nnen sie in der Spalte Aktiv deaktiviert werden.</p> <p>Warning</p> <p>Wenn Pr\u00fcfungen deaktiviert wurden die andere aktiven Pr\u00fcfungen aber als Abh\u00e4ngigkeit ben\u00f6tigen werden sie bei der Pr\u00fcfung wieder aktiviert um die Stabilit\u00e4t zu gew\u00e4hrleisten. Siehe Anforderungen.</p> <p>In dem Feld Schematron Datei kann ein Pfad zu einer Schematron Datei eingetragen werden. In dieser Datei k\u00f6nnen flexible Regeln f\u00fcr die semantischen Anforderungen festgelegt werden. Siehe Semantische Pr\u00fcfungen</p> <p>\u00dcber die beiden Schaltfl\u00e4chen oben rechts kann der Pr\u00fcfplan gespeichert und geladen werden.</p> <p>Nach der Pr\u00fcfung werden fehlerhafte Elemente rot und fehlerfreie Elemente gr\u00fcn eingef\u00e4rbt. Bei der Auswahl eines Elements das fehler beinhaltet werden die Fehler in dem unteren Tab Fehler angezeigt. Dort kann der Fehler ausgew\u00e4hlt werden um ihn in CityDoctor anzuzeigen und weitere Informationen zu erhalten.</p> <p></p> <p>Die Elemente k\u00f6nnen mit dem Dropdown-Men\u00fc gefiltert werden um nur fehlerhafte Elemente anzuzeigen.</p>"},{"location":"userInterface/#prufberichte","title":"Pr\u00fcfberichte","text":"<p>In diesem Dialog gibt es nochmal eine \u00dcbersicht \u00fcber die Fehler in Bildform und die M\u00f6glichkeit einen xml oder pdf Bericht zu schreiben.</p> <p></p>"},{"location":"validationPlan/","title":"Validierungsplan","text":"<p>der Validierungsplan f\u00fcr CityDoctor wird in YAML angegeben.</p> <p>F\u00fcr die Version 3.12.x und neuere sieht ein Beispiel so aus:</p> <pre><code>globalParameters:\n numberOfRoundingPlaces: 8\n # in m\n minVertexDistance: 0.0001\n schematronPath: 'checkForSolid.xml'\nuseStreaming: true # (1)!\nrequirements:\n R_GE_R_TOO_FEW_POINTS:\n enabled: true\n R_GE_R_NOT_CLOSED:\n enabled: true\n R_GE_R_CONSECUTIVE_POINTS_SAME:\n enabled: true\n R_GE_R_SELF_INTERSECTION:\n enabled: true\n R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:\n enabled: true\n R_GE_P_INTERIOR_DISCONNECTED:\n enabled: true\n R_GE_P_INTERSECTING_RINGS:\n enabled: true\n R_GE_P_NON_PLANAR:\n enabled: true\n parameters:\n # one of (\"distance\", \"angle\", \"both\")\n type: distance\n # in m\n distanceTolerance: 0.01\n # in degree\n angleTolerance: 1\n R_GE_P_HOLE_OUTSIDE:\n enabled: true\n R_GE_P_ORIENTATION_RINGS_SAME:\n enabled: true\n R_GE_P_INNER_RINGS_NESTED:\n enabled: true\n R_GE_S_TOO_FEW_POLYGONS:\n enabled: true\n R_GE_S_NOT_CLOSED:\n enabled: true\n R_GE_S_NON_MANIFOLD_EDGE:\n enabled: true\n R_GE_S_POLYGON_WRONG_ORIENTATION:\n enabled: true\n R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:\n enabled: true\n R_GE_S_NON_MANIFOLD_VERTEX:\n enabled: true\n R_GE_S_SELF_INTERSECTION:\n enabled: true\n R_SE_BS_IS_WALL:\n enabled: false\n parameters:\n lowerAngle: '45'\n upperAngle: '135'\n R_SE_BS_IS_FLOOR:\n enabled: false\n R_SE_BS_GROUND_UNFRAGMENTED:\n enabled: false\n R_SE_BS_IS_GROUND:\n enabled: false\n R_SE_BS_IS_CEILING:\n enabled: false\n</code></pre> <ol> <li>Der Parameter <code>useStreaming</code> ist ein Schalter um eine Datei St\u00fcck f\u00fcr St\u00fcck einzulesen anstelle erst die komplette Datei zu lesen bevor die Pr\u00fcfung stattfindet. Mit dieser Einstellung k\u00f6nnen auch Dateien > 2GB ohne gro\u00dfe RAM Anforderungen gepr\u00fcft werden.</li> </ol> <p>In dem Validierungsplan finden sich die selben Einstellungen wieder, die in der grafischen Oberfl\u00e4che auch aufgelistet sind.</p> <p>Unter requirements sind alle Anforderungen gelistet die gepr\u00fcft werden sollen. Dabei sind die semantischen Pr\u00fcfungen standardm\u00e4\u00dfig deaktiviert. </p>"}]}
<li><strong>SE_ATTRIBUTE_MISSING:</strong> Wenn ein Attribut fehlt, aber vorhanden sein sollte.</li>
<li><strong>SE_ATTRIBUTE_MISSING:</strong> Wenn ein Attribut fehlt, aber vorhanden sein sollte.</li>
<li><strong>SE_ATTRIBUTE_INVALID:</strong> Wenn ein Attribut vorhanden ist aber verboten ist.</li>
<li><strong>SE_ATTRIBUTE_INVALID:</strong> Wenn ein Attribut vorhanden ist aber verboten ist.</li>
</ul>
</ul>
<divclass="admonition warning">
<pclass="admonition-title">Warning</p>
<p><strong>SE_ATTRIBUTE_INVALID:</strong> ist noch nicht in CityDoctor und der QualityADE umgesetzt ist aber geplant in einer neuen Version zu unterstützen.</p>
<p>In CityDoctor wurde das <ahref="https://de.wikipedia.org/wiki/Schematron">XML Validierungssystem Schematron</a> integriert um flexibel Attributprüfungen anzupassen und zu unterstützen. </p>
<p>In CityDoctor wurde das <ahref="https://de.wikipedia.org/wiki/Schematron">XML Validierungssystem Schematron</a> integriert um flexibel Attributprüfungen anzupassen und zu unterstützen. </p>
<p>Hier ist ein Beispiel für eine Schematron Datei die CityDoctor integrieren kann:</p>
<p>Hier ist ein Beispiel für eine Schematron Datei die CityDoctor integrieren kann:</p>