Commit 571a3248 authored by Matthias Betz's avatar Matthias Betz
Browse files

update model for citygml4j 3 and quality ade 1.4.0

parent 009cef54
/*-
* Copyright 2020 Hochschule für Technik Stuttgart
* Copyright 2022 Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -13,53 +13,53 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.model.jaxb;
package de.hft.stuttgart.quality.model.types;
import java.io.Serializable;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlType;
import org.xmlobjects.gml.model.GMLObject;
@XmlType(name = "validationPlan")
@XmlAccessorType(XmlAccessType.FIELD)
public class ValidationPlan implements Serializable {
import de.hft.stuttgart.quality.model.properties.FilterProperty;
import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty;
import de.hft.stuttgart.quality.model.properties.RequirementProperty;
private static final long serialVersionUID = 199908444294536261L;
public abstract class ValidationPlan extends GMLObject {
@XmlElementWrapper(name = "globalParameters")
@XmlElement(name = "parameter")
private List<Parameter> globalParameters;
@Serial
private static final long serialVersionUID = 434443226848485642L;
@XmlElement(name = "requirement")
private List<Requirement> requirements;
private GlobalParametersProperty globalParameters;
private FilterProperty filter;
private List<RequirementProperty> requirement;
@XmlElementWrapper(name = "filter")
@XmlElement(name = "checking")
private List<Checking> filter;
public List<Checking> getFilter() {
if (filter == null) {
filter = new ArrayList<>();
}
public GlobalParametersProperty getGlobalParameters() {
return globalParameters;
}
public void setGlobalParameters(GlobalParametersProperty globalParameters) {
this.globalParameters = globalParameters;
}
public FilterProperty getFilter() {
return filter;
}
public List<Requirement> getRequirements() {
if (requirements == null) {
requirements = new ArrayList<>();
}
return requirements;
public void setFilter(FilterProperty filter) {
this.filter = filter;
}
public List<Parameter> getGlobalParameters() {
if (globalParameters == null) {
globalParameters = new ArrayList<>();
public List<RequirementProperty> getRequirement() {
if (requirement == null) {
requirement = new ArrayList<>();
}
return globalParameters;
return requirement;
}
public void setRequirement(List<RequirementProperty> requirement) {
this.requirement = requirement;
}
}
/*-
* Copyright 2020 Hochschule für Technik Stuttgart
* Copyright 2022 Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -13,45 +13,52 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.model;
package de.hft.stuttgart.quality.model.types;
import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
import org.citygml4j.builder.copy.CopyBuilder;
import org.xmlobjects.gml.model.GMLObject;
import org.xmlobjects.gml.model.base.Reference;
import de.hft.stuttgart.quality.model.jaxb.ResultType;
import de.hft.stuttgart.quality.model.enums.ResultType;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
public class ValidationResult extends ChildObject {
public abstract class ValidationResult extends GMLObject {
private static final long serialVersionUID = 1180762313908627342L;
private ResultType result;
private List<ValidationError> errors;
public boolean hasErrors() {
return errors != null && !errors.isEmpty();
@Serial
private static final long serialVersionUID = 4867627296196445082L;
private Reference validationPlanID;
private List<AbstractErrorProperty> errors;
private ResultType resultType;
public Reference getValidationPlanID() {
return validationPlanID;
}
public void setValidationPlanID(Reference validationPlanID) {
this.validationPlanID = validationPlanID;
}
public List<ValidationError> getErrors() {
public List<AbstractErrorProperty> getErrors() {
if (errors == null) {
errors = new ArrayList<>(2);
errors = new ArrayList<>();
}
return errors;
}
public void setResult(ResultType result) {
this.result = result;
public void setErrors(List<AbstractErrorProperty> errors) {
this.errors = errors;
}
public ResultType getResult() {
return result;
public ResultType getResultType() {
return resultType;
}
@Override
public Object copy(CopyBuilder copyBuilder) {
return copyTo(new ValidationResult(), copyBuilder);
public void setResultType(ResultType resultType) {
this.resultType = resultType;
}
}
......@@ -15,7 +15,8 @@
*/
package de.hft.stuttgart.quality.util;
import org.citygml4j.xml.io.reader.MissingADESchemaException;
import org.citygml4j.xml.reader.MissingADESchemaException;
public class UncheckedMissingADESchemaException extends RuntimeException {
......
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3"
targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3"
xmlns:core="http://www.opengis.net/citygml/2.0"
xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified"
version="1.0">
<import namespace="http://www.opengis.net/citygml/2.0"
schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd" />
<import namespace="http://www.opengis.net/citygml/building/2.0"
schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd" />
<import
namespace="http://www.opengis.net/citygml/appearance/2.0"
schemaLocation="http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd" />
<import namespace="http://www.opengis.net/citygml/generics/2.0"
schemaLocation="http://schemas.opengis.net/citygml/generics/2.0/generics.xsd" />
<import namespace="http://www.opengis.net/gml"
schemaLocation="http://schemas.opengis.net/gml/2.1.2/gml.xsd" />
<element name="validationResult"
type="qual:validationResultType"
substitutionGroup="core:_GenericApplicationPropertyOfCityObject" />
<simpleType name="result" final="restriction">
<annotation>
<documentation>Enumeration for status of check result</documentation>
</annotation>
<restriction base="string">
<enumeration value="ERROR">
<annotation>
<documentation>One or more errors were found</documentation>
</annotation>
</enumeration>
<enumeration value="NOT_CHECKED">
<annotation>
<documentation>Feature was not checked</documentation>
</annotation>
</enumeration>
<enumeration value="OK">
<annotation>
<documentation>No errors were found</documentation>
</annotation>
</enumeration>
</restriction>
</simpleType>
<complexType name="ValidationError">
</complexType>
<complexType name="RingError">
<complexContent>
<extension base="qual:ValidationError">
<sequence>
<element name="linearRingId" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_R_CONSECUTIVE_POINTS_SAME">
<annotation>
<documentation>Consecutive point are the same</documentation>
</annotation>
<complexContent>
<extension base="qual:RingError">
<sequence>
<element name="vertex1" type="gml:DirectPositionType" />
<element name="vertex2" type="gml:DirectPositionType" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_R_TOO_FEW_POINTS">
<complexContent>
<extension base="qual:RingError" />
</complexContent>
</complexType>
<complexType name="GE_R_SELF_INTERSECTION">
<complexContent>
<extension base="qual:RingError">
<sequence>
<element name="type" type="qual:ringSelfIntType" />
<element name="edge1" type="qual:edgeType" minOccurs="0" />
<element name="edge2" type="qual:edgeType" minOccurs="0" />
<element name="vertex1" type="gml:DirectPositionType"
minOccurs="0" />
<element name="vertex2" type="gml:DirectPositionType"
minOccurs="0" />
</sequence>
</extension>
</complexContent>
</complexType>
<simpleType name="ringSelfIntType">
<restriction base="string">
<enumeration value="DUPLICATE_POINT" />
<enumeration value="POINT_TOUCHES_EDGE" />
<enumeration value="EDGE_INTERSECTS_EDGE" />
</restriction>
</simpleType>
<complexType name="edgeType">
<sequence>
<element name="from" type="gml:DirectPositionType" />
<element name="to" type="gml:DirectPositionType" />
</sequence>
</complexType>
<complexType name="GE_R_NOT_CLOSED">
<complexContent>
<extension base="qual:RingError" />
</complexContent>
</complexType>
<complexType name="PolygonError">
<sequence>
<element name="polygonId" type="string" />
</sequence>
</complexType>
<complexType name="GE_P_INTERIOR_DISCONNECTED">
<complexContent>
<extension base="qual:PolygonError" />
</complexContent>
</complexType>
<complexType name="GE_P_INTERSECTING_RINGS">
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="linearRingId1" type="string" />
<element name="linearRingId2" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_P_INNER_RINGS_NESTED">
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="linearRingId1" type="string" />
<element name="linearRingId2" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_P_HOLE_OUTSIDE">
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="linearRingId" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION">
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="deviation" type="gml:AngleType"></element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_P_ORIENTATION_RINGS_SAME">
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="linearRingId" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SolidError">
<sequence>
<element name="geometryId" type="string" />
</sequence>
</complexType>
<complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION">
<complexContent>
<extension base="qual:SolidError" />
</complexContent>
</complexType>
<complexType name="GE_S_POLYGON_WRONG_ORIENTATION">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="edges" type="qual:EdgeList" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="EdgeList">
<sequence>
<element name="edge" type="qual:edgeType"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="GE_S_SELF_INTERSECTION">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="polygonId1" type="string" />
<element name="polygonId2" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_S_NON_MANIFOLD_VERTEX">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="vertex" type="gml:DirectPositionType" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_S_NON_MANIFOLD_EDGE">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="edges" type="qual:EdgeList" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_S_NOT_CLOSED">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="edges" type="qual:EdgeList" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GE_S_TOO_FEW_POLYGONS">
<complexContent>
<extension base="qual:SolidError" />
</complexContent>
</complexType>
<complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTS">
<complexContent>
<extension base="qual:SolidError">
<sequence>
<element name="components" type="qual:ComponentList" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="ComponentList">
<sequence>
<element name="component" type="qual:componentType"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="componentType">
<sequence>
<element name="polygonId" type="string" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE">
<annotation>
<documentation>A planarity error with a point too far from the
regression plane
</documentation>
</annotation>
<complexContent>
<extension base="qual:PolygonError">
<sequence>
<element name="vertex" type="gml:DirectPositionType" />
<element name="distance" type="gml:LengthType" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SemanticError">
</complexType>
<complexType name="SE_ATTRIBUTE_WRONG_VALUE">
<complexContent>
<extension base="qual:SemanticError">
<sequence>
<element name="childId" type="string" minOccurs="0" />
<element name="attributeName" type="string" />
<element name="generic" type="boolean" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SE_ATTRIBUTE_MISSING">
<complexContent>
<extension base="qual:SemanticError">
<sequence>
<element name="childId" type="string" minOccurs="0" />
<element name="attributeName" type="string" />
<element name="generic" type="boolean" />
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="validationResultType">
<annotation>
<documentation>Data structure containing validation results for
features
</documentation>
</annotation>
<sequence>
<element name="GE_P_HOLE_OUTSIDE"
type="qual:GE_P_HOLE_OUTSIDE" minOccurs="0" maxOccurs="unbounded" />
<element name="GE_P_INNER_RINGS_NESTED"
type="qual:GE_P_INNER_RINGS_NESTED" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_P_INTERIOR_DISCONNECTED"
type="qual:GE_P_INTERIOR_DISCONNECTED" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_P_INTERSECTING_RINGS"
type="qual:GE_P_INTERSECTING_RINGS" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"
type="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"
type="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_P_ORIENTATION_RINGS_SAME"
type="qual:GE_P_ORIENTATION_RINGS_SAME" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_R_CONSECUTIVE_POINTS_SAME"
type="qual:GE_R_CONSECUTIVE_POINTS_SAME" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_R_NOT_CLOSED" type="qual:GE_R_NOT_CLOSED"
minOccurs="0" maxOccurs="unbounded" />
<element name="GE_R_SELF_INTERSECTION"
type="qual:GE_R_SELF_INTERSECTION" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_R_TOO_FEW_POINTS"
type="qual:GE_R_TOO_FEW_POINTS" minOccurs="0" maxOccurs="unbounded" />
<element name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
type="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_MULTIPLE_CONNECTED_COMPONENTS"
type="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_NON_MANIFOLD_EDGE"
type="qual:GE_S_NON_MANIFOLD_EDGE" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_NON_MANIFOLD_VERTEX"
type="qual:GE_S_NON_MANIFOLD_VERTEX" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_NOT_CLOSED" type="qual:GE_S_NOT_CLOSED"
minOccurs="0" maxOccurs="unbounded" />
<element name="GE_S_POLYGON_WRONG_ORIENTATION"
type="qual:GE_S_POLYGON_WRONG_ORIENTATION" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_SELF_INTERSECTION"
type="qual:GE_S_SELF_INTERSECTION" minOccurs="0"
maxOccurs="unbounded" />
<element name="GE_S_TOO_FEW_POLYGONS"
type="qual:GE_S_TOO_FEW_POLYGONS" minOccurs="0"
maxOccurs="unbounded" />
<element name="SE_ATTRIBUTE_MISSING"
type="qual:SE_ATTRIBUTE_MISSING" minOccurs="0" maxOccurs="unbounded" />
<element name="SE_ATTRIBUTE_WRONG_VALUE"
type="qual:SE_ATTRIBUTE_WRONG_VALUE" minOccurs="0"
maxOccurs="unbounded" />
</sequence>
<attribute name="result" type="qual:result" />
</complexType>
<simpleType name="requirementID" final="restriction">
<annotation>
<documentation>Enumeration for available requirements</documentation>
</annotation>
<restriction base="string">
<enumeration value="R_GE_R_TOO_FEW_POINTS" />
<enumeration value="R_GE_R_NOT_CLOSED" />
<enumeration value="R_GE_R_CONSECUTIVE_POINTS_SAME" />
<enumeration value="R_GE_R_SELF_INTERSECTION" />
<enumeration value="R_GE_P_NON_PLANAR" />
<enumeration value="R_GE_P_INTERIOR_DISCONNECTED" />
<enumeration value="R_GE_P_INTERSECTING_RINGS" />
<enumeration value="R_GE_P_HOLE_OUTSIDE" />
<enumeration value="R_GE_P_ORIENTATION_RINGS_SAME" />
<enumeration value="R_GE_P_INNER_RINGS_NESTED" />
<enumeration value="R_GE_S_TOO_FEW_POLYGONS" />
<enumeration value="R_GE_S_NOT_CLOSED" />
<enumeration value="R_GE_S_NON_MANIFOLD_EDGE" />
<enumeration value="R_GE_S_POLYGON_WRONG_ORIENTATION" />
<enumeration
value="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" />
<enumeration value="R_GE_S_NON_MANIFOLD_VERTEX" />
<enumeration value="R_GE_S_SELF_INTERSECTION" />
<enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" />
<enumeration value="R_SE_ATTRIBUTES_EXISTING" />
<enumeration value="R_SE_ATTRIBUTES_CORRECT" />
</restriction>
</simpleType>
<complexType name="parameter">
<simpleContent>
<extension base="string">
<attribute name="name" type="string" use="required" />
<attribute name="uom" type="string" use="optional" />
</extension>
</simpleContent>
</complexType>
<complexType name="requirementType">
<annotation>
<documentation>Requirement structure for configuration purposes
</documentation>
</annotation>
<sequence>
<element name="parameter" type="qual:parameter" minOccurs="0"
maxOccurs="unbounded" />
</sequence>
<attribute name="name" type="qual:requirementID" />
<attribute name="enabled" type="boolean" />
</complexType>
<complexType name="validationPlanType">
<annotation>
<documentation>Validation plan structure containing information about
the parameters used to perform the checks
</documentation>
</annotation>
<sequence>
<element name="globalParameters"
type="qual:globalParameterType" />
<element name="requirement" type="qual:requirementType"
maxOccurs="unbounded" />
<element name="filter" type="qual:filterType" minOccurs="1"
maxOccurs="1" />
</sequence>
</complexType>
<complexType name="filterType">
<sequence>
<element name="checking" type="qual:featureType"
minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<simpleType name="featureType">
<restriction base="string">
<enumeration value="BUILDING"></enumeration>
<enumeration value="TRANSPORTATION"></enumeration>
<enumeration value="VEGETATION"></enumeration>
<enumeration value="BRIDGE"></enumeration>
<enumeration value="WATER"></enumeration>
<enumeration value="LAND"></enumeration>
</restriction>
</simpleType>
<complexType name="globalParameterType">
<sequence>
<element name="parameter" type="qual:parameter"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="statisticsType">
<annotation>
<documentation>Statistics structure containing information about end
result of checking process
</documentation>
</annotation>
<sequence>
<element name="numErrorBuildings"
type="qual:featureStatistics" />
<element name="numErrorVegetation"
type="qual:featureStatistics" />
<element name="numErrorLandObjects"
type="qual:featureStatistics" />
<element name="numErrorBridgeObjects"
type="qual:featureStatistics" />
<element name="numErrorWaterObjects"
type="qual:featureStatistics" />
<element name="numErrorTransportation"
type="qual:featureStatistics" />
<element name="errorStatistics"
type="qual:errorStatisticsType" />
</sequence>
</complexType>
<complexType name="errorStatisticsType">
<sequence>
<element name="error" type="qual:errorType" minOccurs="0"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="errorType">
<simpleContent>
<extension base="int">
<attribute name="name" type="qual:errorId"></attribute>
</extension>
</simpleContent>
</complexType>
<simpleType name="errorId">
<restriction base="string">
<enumeration value="GE_R_TOO_FEW_POINTS" />
<enumeration value="GE_R_NOT_CLOSED" />
<enumeration value="GE_R_CONSECUTIVE_POINTS_SAME" />
<enumeration value="GE_R_SELF_INTERSECTION" />
<enumeration
value="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" />
<enumeration
value="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" />
<enumeration value="GE_P_INTERIOR_DISCONNECTED" />
<enumeration value="GE_P_INTERSECTING_RINGS" />
<enumeration value="GE_P_HOLE_OUTSIDE" />
<enumeration value="GE_P_ORIENTATION_RINGS_SAME" />
<enumeration value="GE_P_INNER_RINGS_NESTED" />
<enumeration value="GE_S_TOO_FEW_POLYGONS" />
<enumeration value="GE_S_NOT_CLOSED" />
<enumeration value="GE_S_NON_MANIFOLD_EDGE" />
<enumeration value="GE_S_POLYGON_WRONG_ORIENTATION" />
<enumeration value="GE_S_ALL_POLYGONS_WRONG_ORIENTATION" />
<enumeration value="GE_S_NON_MANIFOLD_VERTEX" />
<enumeration value="GE_S_SELF_INTERSECTION" />
<enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS" />
<enumeration value="SE_ATTRIBUTE_WRONG_VALUE" />
<enumeration value="SE_ATTRIBUTE_MISSING" />
</restriction>
</simpleType>
<complexType name="featureStatistics">
<simpleContent>
<extension base="int">
<attribute name="numChecked" type="int" />
</extension>
</simpleContent>
</complexType>
<element name="validation" type="qual:validationType"
substitutionGroup="core:_GenericApplicationPropertyOfCityModel" />
<complexType name="validationType">
<annotation>
<documentation>Data structure containing the validation plan and
statistics of a validation process
</documentation>
</annotation>
<sequence>
<element name="validationDate" type="dateTime" />
<element name="validationSoftware" type="string" />
<element name="validationPlan" type="qual:validationPlanType"
maxOccurs="1" />
<element name="statistics" type="qual:statisticsType"
maxOccurs="1" />
</sequence>
</complexType>
</schema>
\ No newline at end of file
/*-
* Copyright 2020 Hochschule für Technik Stuttgart
* Copyright 2022 Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -15,87 +15,56 @@
*/
package de.hft.stuttgart.quality;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.ServiceLoader;
import org.citygml4j.CityGMLContext;
import org.citygml4j.builder.jaxb.CityGMLBuilder;
import org.citygml4j.builder.jaxb.CityGMLBuilderException;
import org.citygml4j.model.citygml.ade.ADEComponent;
import org.citygml4j.model.citygml.ade.ADEException;
import org.citygml4j.model.citygml.ade.binding.ADEContext;
import org.citygml4j.model.citygml.building.Building;
import org.citygml4j.model.citygml.core.AbstractCityObject;
import org.citygml4j.model.citygml.core.CityModel;
import org.citygml4j.model.citygml.core.CityObjectMember;
import org.citygml4j.model.gml.geometry.primitives.DirectPosition;
import org.citygml4j.model.gml.measures.Angle;
import org.citygml4j.model.gml.measures.Length;
import org.citygml4j.model.module.citygml.CityGMLVersion;
import org.citygml4j.xml.io.CityGMLInputFactory;
import org.citygml4j.xml.io.CityGMLOutputFactory;
import org.citygml4j.xml.io.reader.CityGMLReadException;
import org.citygml4j.xml.io.reader.CityGMLReader;
import org.citygml4j.xml.io.reader.FeatureReadMode;
import org.citygml4j.xml.io.writer.CityGMLWriteException;
import org.citygml4j.xml.io.writer.CityGMLWriter;
import org.junit.jupiter.api.Test;
import de.hft.stuttgart.quality.model.AllPolygonsWrongOrientation;
import de.hft.stuttgart.quality.model.AttributeMissing;
import de.hft.stuttgart.quality.model.AttributeWrongValue;
import de.hft.stuttgart.quality.model.ConsecutivePointsSame;
import de.hft.stuttgart.quality.model.Edge;
import de.hft.stuttgart.quality.model.HoleOutside;
import de.hft.stuttgart.quality.model.InnerRingsNested;
import de.hft.stuttgart.quality.model.InteriorDisconnected;
import de.hft.stuttgart.quality.model.IntersectingRings;
import de.hft.stuttgart.quality.model.MultipleConnectedComponents;
import de.hft.stuttgart.quality.model.NonManifoldEdge;
import de.hft.stuttgart.quality.model.NonManifoldVertex;
import de.hft.stuttgart.quality.model.NonPlanarDistancePlane;
import de.hft.stuttgart.quality.model.NonPlanarNormalsDeviation;
import de.hft.stuttgart.quality.model.OrientationRingsSame;
import de.hft.stuttgart.quality.model.PolygonWrongOrientation;
import de.hft.stuttgart.quality.model.RingNotClosed;
import de.hft.stuttgart.quality.model.RingSelfIntersection;
import de.hft.stuttgart.quality.model.SolidNotClosed;
import de.hft.stuttgart.quality.model.TooFewPoints;
import de.hft.stuttgart.quality.model.TooFewPolygons;
import de.hft.stuttgart.quality.model.Validation;
import de.hft.stuttgart.quality.model.ValidationError;
import de.hft.stuttgart.quality.model.ValidationResult;
import de.hft.stuttgart.quality.model.jaxb.Checking;
import de.hft.stuttgart.quality.model.jaxb.Component;
import de.hft.stuttgart.quality.model.jaxb.ErrorId;
import de.hft.stuttgart.quality.model.jaxb.ErrorStatistics;
import de.hft.stuttgart.quality.model.jaxb.FeatureStatistics;
import de.hft.stuttgart.quality.model.jaxb.Parameter;
import de.hft.stuttgart.quality.model.jaxb.Requirement;
import de.hft.stuttgart.quality.model.jaxb.RequirementId;
import de.hft.stuttgart.quality.model.jaxb.ResultType;
import de.hft.stuttgart.quality.model.jaxb.RingSelfIntType;
import de.hft.stuttgart.quality.model.jaxb.Statistics;
import de.hft.stuttgart.quality.model.jaxb.TopLevelFeatureType;
import de.hft.stuttgart.quality.model.jaxb.ValidationPlan;
class QualityAdeTests {
/*
@Test
void testValidationPlan() throws ADEException, CityGMLContextException, CityGMLWriteException {
CityModel model = new CityModel();
Validation v = new Validation();
model.getFeatureMembers().add(new AbstractFeatureProperty(v));
v.setValidationSoftware("testSoftware");
v.setValidationDate(ZonedDateTime.now());
ValidationPlan plan = new ValidationPlan();
Requirement req = new Requirement();
req.setEnabled(true);
req.setName(RequirementId.R_GE_P_HOLE_OUTSIDE);
plan.getRequirements().add(req);
Checking checking = new Checking();
checking.setFeatureType(TopLevelFeatureType.BRIDGE);
plan.getFilter().add(checking);
Parameter param = new Parameter();
param.setName("test");
param.setUom("uom");
param.setValue("5");
plan.getGlobalParameters().add(param);
v.setValidationPlan(plan);
ADERegistry.getInstance().loadADE(new QualityADEContext());
CityGMLContext context = CityGMLContext.newInstance();
CityGMLVersion version = CityGMLVersion.v2_0;
CityGMLOutputFactory out = context.createCityGMLOutputFactory(version);
try (CityGMLChunkWriter writer = out.createCityGMLChunkWriter(Paths.get("test.gml"), StandardCharsets.UTF_8.name())) {
writer.withIndent(" ")
.withSchemaLocation(QualityADEModule.NAMESPACE_URI, getClass().getResource("/qualityAde.xsd").toString())
.withDefaultPrefixes()
.withDefaultNamespace(CoreModule.of(version).getNamespaceURI())
.writeMember(v);
}
}
@Test
void testReadingConsecutiveSameError()
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
......@@ -557,7 +526,7 @@ class QualityAdeTests {
assertEquals("_Simple_BD.1_PG.3", err.getComponents().get(1).getPolygonIds().get(0));
assertEquals("_Simple_BD.1_PG.4", err.getComponents().get(1).getPolygonIds().get(1));
}
@Test
void testWritingAttributeMissingError()
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException {
......@@ -588,7 +557,7 @@ class QualityAdeTests {
assertEquals(error.getChildId(), error2.getChildId());
assertEquals(error.isGeneric(), error2.isGeneric());
}
@Test
void testWritingAttributeWrongValueError()
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException {
......@@ -1303,11 +1272,15 @@ class QualityAdeTests {
System.out.println(event.getMessage());
throw new IllegalStateException(event.getLinkedException());
});
CityModel cityModel;
try (CityGMLReader reader = in.createCityGMLReader("?", input)) {
cityModel = (CityModel) reader.nextFeature();
while (reader.hasNext()) {
CityGML nextFeature = reader.nextFeature();
if (nextFeature instanceof CityModel) {
return (CityModel) nextFeature;
}
}
}
return cityModel;
throw new IllegalStateException("No CityModel found in GML file");
}
private CityModel readCityGml(File f)
......@@ -1399,11 +1372,11 @@ class QualityAdeTests {
writer.setPrefixes(CityGMLVersion.DEFAULT);
writer.setPrefix("qual", QualityADEModule.NAMESPACE_URI);
writer.setSchemaLocation(QualityADEModule.NAMESPACE_URI,
QualityADEModule.NAMESPACE_URI + "/qualityAde.xsd");
QualityADEModule.NAMESPACE_URI + "/qualityAdeOld.xsd");
writer.setSchemaLocations(CityGMLVersion.DEFAULT);
writer.write(model);
return out.toByteArray();
}
}
} */
}
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd">
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0"
xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0"
xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4/qualityAde.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind.
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<!-- Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m Modelliert mit Begrenzungsflächen
(eine Dachfläche, 4 Wandflächen, 1 Grundfläche), die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen
referenziert CityGML 2.0 linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind.
10.5.2017 Author: V. Coors, HFT Stuttgart Lizenz: -->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<qual:validationResult result="ERROR">
<qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId>
<qual:vertex1>11.5 10.0 4.5</qual:vertex1>
<qual:vertex2>11.5 10.0 4.5</qual:vertex2>
</qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:validationResult>
<qual:ValidationResult>
<qual:validationPlanID xlink:href="#idvalue0" />
<qual:error>
<qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId>
<qual:vertex1>11.5 10.0 4.5</qual:vertex1>
<qual:vertex2>11.5 10.0 4.5</qual:vertex2>
</qual:GE_R_CONSECUTIVE_POINTS_SAME>
</qual:error>
<qual:resultType>OK</qual:resultType>
</qual:ValidationResult>
</qual:validationResult>
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7" />
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
......@@ -77,7 +79,8 @@ Lizenz:
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
10.0
15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
......@@ -124,7 +127,8 @@ Lizenz:
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
13.0
10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
......@@ -148,8 +152,9 @@ Lizenz:
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
10.0
10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
......@@ -199,59 +204,245 @@ Lizenz:
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
<qual:validation>
<qual:validationDate>2002-05-30T09:00:00</qual:validationDate>
<qual:validationSoftware>CityDoctor2</qual:validationSoftware>
<qual:validationPlan>
<qual:globalParameters>
<qual:parameter name="numberOfRoundingPlaces">8</qual:parameter>
<qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter>
<qual:parameter name="schematronFile"></qual:parameter>
</qual:globalParameters>
<qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/>
<qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/>
<qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/>
<qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/>
<qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/>
<qual:requirement name="R_GE_P_NON_PLANAR" enabled="true">
<qual:parameter name="type">distance</qual:parameter>
<qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter>
<qual:parameter name="angleTolerance" uom="deg">1</qual:parameter>
<qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter>
</qual:requirement>
<qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/>
<qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/>
<qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/>
<qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/>
<qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/>
<qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/>
<qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/>
<qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/>
<qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/>
<qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/>
<qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/>
<qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/>
<qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/>
<qual:filter>
<qual:checking>BUILDING</qual:checking>
<qual:checking>TRANSPORTATION</qual:checking>
<qual:checking>VEGETATION</qual:checking>
<qual:checking>BRIDGE</qual:checking>
<qual:checking>WATER</qual:checking>
<qual:checking>LAND</qual:checking>
</qual:filter>
</qual:validationPlan>
<qual:statistics>
<qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings>
<qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation>
<qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects>
<qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects>
<qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects>
<qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation>
<qual:errorStatistics>
<qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error>
</qual:errorStatistics>
</qual:statistics>
</qual:validation>
<core:cityObjectMember>
<qual:Validation gml:id="idvalue0">
<qual:validationDate>2002-05-30T09:00:00</qual:validationDate>
<qual:validationSoftware>CityDoctor2</qual:validationSoftware>
<qual:statistics>
<qual:Statistics>
<qual:numErrorBuildings>
<qual:FeatureStatistics>
<qual:numChecked>1</qual:numChecked>
<qual:numErrors>1</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorBuildings>
<qual:numErrorVegetation>
<qual:FeatureStatistics>
<qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorVegetation>
<qual:numErrorLandObjects>
<qual:FeatureStatistics>
<qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorLandObjects>
<qual:numErrorBridgeObjects>
<qual:FeatureStatistics>
<qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorBridgeObjects>
<qual:numErrorWaterObjects>
<qual:FeatureStatistics>
<qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorWaterObjects>
<qual:numErrorTransportation>
<qual:FeatureStatistics>
<qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorTransportation>
<qual:error>
<qual:Error>
<qual:occurrences>1</qual:occurrences>
<qual:name>GE_R_CONSECUTIVE_POINTS_SAME</qual:name>
</qual:Error>
</qual:error>
</qual:Statistics>
</qual:statistics>
<qual:validationPlan>
<qual:ValidationPlan>
<qual:globalParameters>
<qual:GlobalParameters>
<qual:parameter>
<qual:Parameter>
<qual:name>numberOfRoundingPlaces</qual:name>
<qual:value>8</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>minVertexDistance</qual:name>
<qual:uom>m</qual:uom>
<qual:value>0.0001</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>schematronFile</qual:name>
<qual:value></qual:value>
</qual:Parameter>
</qual:parameter>
</qual:GlobalParameters>
</qual:globalParameters>
<qual:filter>
<qual:Filter>
<qual:checking>
<qual:Checking>
<qual:featureType>BUILDING</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>TRANSPORTATION</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>VEGETATION</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>BRIDGE</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>WATER</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>LAND</qual:featureType>
</qual:Checking>
</qual:checking>
</qual:Filter>
</qual:filter>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_R_TOO_FEW_POINTS</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_R_NOT_CLOSED</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_R_CONSECUTIVE_POINTS_SAME</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_R_SELF_INTERSECTION</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_NON_PLANAR</qual:requirementType>
<qual:parameter>
<qual:Parameter>
<qual:name>type</qual:name>
<qual:value>distance</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>distanceTolerance</qual:name>
<qual:uom>m</qual:uom>
<qual:value>0.01</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>angleTolerance</qual:name>
<qual:uom>deg</qual:uom>
<qual:value>1</qual:value>
</qual:Parameter>
</qual:parameter>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_INTERIOR_DISCONNECTED</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_INTERSECTING_RINGS</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_HOLE_OUTSIDE</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_ORIENTATION_RINGS_SAME</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_P_INNER_RINGS_NESTED</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_TOO_FEW_POLYGONS</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_NOT_CLOSED</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_NON_MANIFOLD_EDGE</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_POLYGON_WRONG_ORIENTATION</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_NON_MANIFOLD_VERTEX</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_SELF_INTERSECTION</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>true</qual:enabled>
<qual:requirementType>R_GE_S_MULTIPLE_CONNECTED_COMPONENTS</qual:requirementType>
</qual:Requirement>
</qual:requirement>
</qual:ValidationPlan>
</qual:validationPlan>
</qual:Validation>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CityModel xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns="http://www.opengis.net/citygml/2.0" xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:tran="http://www.opengis.net/citygml/transportation/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0" xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0" xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:brid="http://www.opengis.net/citygml/bridge/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" xmlns:luse="http://www.opengis.net/citygml/landuse/2.0" xsi:schemaLocation="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4 file:/C:/Job/QualityADE/QualityADERepo/citygml4j-quality-ade/target/classes/qualityAde.xsd">
<gml:featureMember>
<qual:validation>
<qual:validationDate>2022-03-29T12:31:57.2173659+02:00</qual:validationDate>
<qual:validationSoftware>testSoftware</qual:validationSoftware>
<qual:validationPlan>
<qual:globalParameters>
<qual:requirement uom="uom" name="test">5</qual:requirement>
</qual:globalParameters>
<qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/>
<qual:filter>
<qual:checking>BRIDGE</qual:checking>
</qual:filter>
</qual:validationPlan>
</qual:validation>
</gml:featureMember>
</CityModel>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment