Commit 4ef4c11f authored by Matthias Betz's avatar Matthias Betz
Browse files

added type adapters

added validation tests
parent 5fe70e14
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError;
@XMLElement(name = "GE_S_TOO_FEW_POLYGONS", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class SolidTooFewPolygonsErrorAdapter extends AbstractSolidErrorAdapter<SolidTooFewPolygonsError> {
@Override
public SolidTooFewPolygonsError createObject(QName name, Object parent) throws ObjectBuildException {
return new SolidTooFewPolygonsError();
}
@Override
public Element createElement(SolidTooFewPolygonsError object, Namespaces namespaces)
throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_TOO_FEW_POLYGONS");
}
}
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.builder.ObjectBuilder;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.serializer.ObjectSerializer;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
import org.xmlobjects.stream.XMLWriter;
import org.xmlobjects.xml.Attributes;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.adapter.properties.FeatureStatisticsPropertyAdapter;
import de.hft.stuttgart.quality.model.types.Statistics;
@XMLElement(name = "Statistics", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class StatisticsAdapter implements ObjectBuilder<Statistics>, ObjectSerializer<Statistics> {
@Override
public Statistics createObject(QName name, Object parent) throws ObjectBuildException {
return new Statistics();
}
@Override
public void buildChildObject(Statistics object, QName name, Attributes attributes, XMLReader reader)
throws ObjectBuildException, XMLReadException {
if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) {
return;
}
switch (name.getLocalPart()) {
case "numErrorBuildings" -> object
.setNumErrorBuildings(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
case "numErrorVegetation" -> object
.setNumErrorVegetation(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
case "numErrorLandObjects" -> object
.setNumErrorLandObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
case "numErrorBridgeObjects" -> object
.setNumErrorBridgeObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
case "numErrorWaterObjects" -> object
.setNumErrorWaterObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
case "numErrorTransportation" -> object
.setNumErrorTransportation(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class));
default -> throw new IllegalStateException("Cannot handle name " + name + " when building Statistics element");
}
}
@Override
public Element createElement(Statistics object, Namespaces namespaces) throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "Statistics");
}
@Override
public void writeChildElements(Statistics object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
if (object.getNumErrorBuildings() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorBuildings"),
object.getNumErrorBuildings(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
if (object.getNumErrorVegetation() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorVegetation"),
object.getNumErrorVegetation(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
if (object.getNumErrorLandObjects() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorLandObjects"),
object.getNumErrorLandObjects(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
if (object.getNumErrorBridgeObjects() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorBridgeObjects"),
object.getNumErrorBridgeObjects(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
if (object.getNumErrorWaterObjects() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorWaterObjects"),
object.getNumErrorWaterObjects(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
if (object.getNumErrorTransportation() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorTransportation"),
object.getNumErrorTransportation(), FeatureStatisticsPropertyAdapter.class, namespaces);
}
}
}
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
import org.xmlobjects.stream.XMLWriter;
import org.xmlobjects.xml.Attributes;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.adapter.properties.StatisticsPropertyAdapter;
import de.hft.stuttgart.quality.adapter.properties.ValidationPlanPropertyAdapter;
import de.hft.stuttgart.quality.model.types.Validation;
@XMLElement(name = "Validation", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class ValidationAdapter extends AbstractFeatureAdapter<Validation> {
private static final ZonedDateTimeAdapter DATE_TIME_ADAPTER = new ZonedDateTimeAdapter();
@Override
public Validation createObject(QName name, Object parent) throws ObjectBuildException {
return new Validation();
}
@Override
public void buildChildObject(Validation object, QName name, Attributes attributes, XMLReader reader)
throws ObjectBuildException, XMLReadException {
if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) {
return;
}
switch (name.getLocalPart()) {
case "validationDate" -> reader.getTextContent()
.ifPresent(s -> object.setValidationDate(DATE_TIME_ADAPTER.fromString(s)));
case "validationSoftware" -> reader.getTextContent().ifPresent(object::setValidationSoftware);
case "statistics" -> object.setStatistics(reader.getObjectUsingBuilder(StatisticsPropertyAdapter.class));
case "validationPlan" -> object
.setValidationPlan(reader.getObjectUsingBuilder(ValidationPlanPropertyAdapter.class));
default -> super.buildChildObject(object, name, attributes, reader);
}
}
@Override
public Element createElement(Validation object, Namespaces namespaces) throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "Validation");
}
@Override
public void writeChildElements(Validation object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
super.writeChildElements(object, namespaces, writer);
if (object.getValidationDate() != null) {
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "validationDate")
.addTextContent(DATE_TIME_ADAPTER.toString(object.getValidationDate())));
}
if (object.getValidationSoftware() != null) {
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "validationSoftware")
.addTextContent(object.getValidationSoftware()));
}
if (object.getStatistics() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "statistics"),
object.getStatistics(), StatisticsPropertyAdapter.class, namespaces);
}
if (object.getValidationPlan() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlan"),
object.getValidationPlan(), ValidationPlanPropertyAdapter.class, namespaces);
}
}
}
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.builder.ObjectBuilder;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.serializer.ObjectSerializer;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
import org.xmlobjects.stream.XMLWriter;
import org.xmlobjects.xml.Attributes;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.adapter.properties.FilterPropertyAdapter;
import de.hft.stuttgart.quality.adapter.properties.GlobalParametersPropertyAdapter;
import de.hft.stuttgart.quality.adapter.properties.RequirementPropertyAdapter;
import de.hft.stuttgart.quality.model.properties.RequirementProperty;
import de.hft.stuttgart.quality.model.types.ValidationPlan;
@XMLElement(name = "ValidationPlan", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class ValidationPlanAdapter implements ObjectBuilder<ValidationPlan>, ObjectSerializer<ValidationPlan> {
@Override
public ValidationPlan createObject(QName name, Object parent) throws ObjectBuildException {
return new ValidationPlan();
}
@Override
public void buildChildObject(ValidationPlan object, QName name, Attributes attributes, XMLReader reader)
throws ObjectBuildException, XMLReadException {
if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) {
return;
}
switch (name.getLocalPart()) {
case "globalParameters" -> object
.setGlobalParameters(reader.getObjectUsingBuilder(GlobalParametersPropertyAdapter.class));
case "filter" -> object.setFilter(reader.getObjectUsingBuilder(FilterPropertyAdapter.class));
case "requirement" -> object.getRequirements()
.add(reader.getObjectUsingBuilder(RequirementPropertyAdapter.class));
default -> throw new IllegalStateException(
"Cannot handle name " + name + " when building ValidationPlan element");
}
}
@Override
public Element createElement(ValidationPlan object, Namespaces namespaces) throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "ValidationPlan");
}
@Override
public void writeChildElements(ValidationPlan object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
if (object.getGlobalParameters() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "globalParameters"),
object.getGlobalParameters(), GlobalParametersPropertyAdapter.class, namespaces);
}
if (object.getFilter() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "filter"), object.getFilter(),
FilterPropertyAdapter.class, namespaces);
}
for (RequirementProperty req : object.getRequirements()) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "requirement"), req,
RequirementPropertyAdapter.class, namespaces);
}
}
}
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.builder.ObjectBuilder;
import org.xmlobjects.gml.adapter.base.ReferenceAdapter;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.serializer.ObjectSerializer;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
import org.xmlobjects.stream.XMLWriter;
import org.xmlobjects.xml.Attributes;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.adapter.properties.AbstractErrorPropertyAdapter;
import de.hft.stuttgart.quality.model.enums.ResultType;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.types.ValidationResult;
@XMLElement(name = "ValidationResult", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>, ObjectSerializer<ValidationResult> {
@Override
public ValidationResult createObject(QName name, Object parent) throws ObjectBuildException {
return new ValidationResult();
}
@Override
public void buildChildObject(ValidationResult object, QName name, Attributes attributes, XMLReader reader)
throws ObjectBuildException, XMLReadException {
if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) {
return;
}
switch (name.getLocalPart()) {
case "validationPlanID" -> object.setValidationPlanID(reader.getObjectUsingBuilder(ReferenceAdapter.class));
case "error" -> object.getErrors().add(reader.getObjectUsingBuilder(AbstractErrorPropertyAdapter.class));
case "resultType" -> reader.getTextContent().ifPresent(s -> object.setResultType(ResultType.valueOf(s)));
default -> throw new IllegalStateException(
"Cannot handle name " + name + " when building ValidationResult element");
}
}
@Override
public Element createElement(ValidationResult object, Namespaces namespaces) throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "ValidationResult");
}
@Override
public void writeChildElements(ValidationResult object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
if (object.getValidationPlanID() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"),
object.getValidationPlanID(), ReferenceAdapter.class, namespaces);
}
for (AbstractErrorProperty err : object.getErrors()) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "error"), err,
AbstractErrorPropertyAdapter.class, namespaces);
}
if (object.getResultType() != null) {
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "resultType")
.addTextContent(object.getResultType().toString()));
}
}
}
/*-
* 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,25 +13,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.util;
package de.hft.stuttgart.quality.adapter.types;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import org.citygml4j.xml.reader.MissingADESchemaException;
public class ZonedDateTimeAdapter {
public class UncheckedMissingADESchemaException extends RuntimeException {
private static final long serialVersionUID = -5684499826072882203L;
private MissingADESchemaException cause;
public UncheckedMissingADESchemaException(MissingADESchemaException e) {
super(e);
this.cause = e;
public ZonedDateTime fromString(String v) {
try {
return ZonedDateTime.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(v));
} catch (Exception e) {
return LocalDateTime.parse(v).atZone(ZoneId.systemDefault());
}
}
@Override
public synchronized MissingADESchemaException getCause() {
return cause;
public String toString(ZonedDateTime v) {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(v);
}
}
/*-
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.model.properties;
import java.io.Serial;
import org.citygml4j.core.model.ade.ADEObject;
import org.xmlobjects.gml.model.base.AbstractInlineOrByReferenceProperty;
import de.hft.stuttgart.quality.model.types.ValidationResult;
public class ValidationResultProperty extends AbstractInlineOrByReferenceProperty<ValidationResult> implements ADEObject {
@Serial
private static final long serialVersionUID = 480940868730913996L;
public ValidationResultProperty() {
super();
}
public ValidationResultProperty(ValidationResult object) {
super(object);
}
public ValidationResultProperty(String href) {
super(href);
}
@Override
public Class<ValidationResult> getTargetType() {
return ValidationResult.class;
}
}
......@@ -4,18 +4,20 @@ import java.io.Serial;
import org.citygml4j.core.model.core.ADEOfAbstractCityObject;
import de.hft.stuttgart.quality.model.properties.ValidationResultProperty;
public class CityObjectProperties extends ADEOfAbstractCityObject {
@Serial
private static final long serialVersionUID = 1273072314736964714L;
private ValidationResult validationResult;
private ValidationResultProperty validationResult;
public ValidationResult getValidationResult() {
public ValidationResultProperty getValidationResult() {
return validationResult;
}
public void setValidationResult(ValidationResult validationResult) {
public void setValidationResult(ValidationResultProperty validationResult) {
this.validationResult = asChild(validationResult);
}
}
......@@ -27,17 +27,17 @@ public class MultipleComponentsError extends AbstractSolidError {
@Serial
private static final long serialVersionUID = 4322219502819024437L;
private List<ComponentListProperty> edges;
private List<ComponentListProperty> components;
public List<ComponentListProperty> getEdges() {
if (edges == null) {
edges = new ChildList<>(this);
public List<ComponentListProperty> getComponents() {
if (components == null) {
components = new ChildList<>(this);
}
return edges;
return components;
}
public void setEdges(List<ComponentListProperty> edges) {
this.edges = asChild(edges);
public void setComponents(List<ComponentListProperty> edges) {
this.components = asChild(edges);
}
}
......@@ -17,28 +17,21 @@ package de.hft.stuttgart.quality.model.types;
import java.io.Serial;
import de.hft.stuttgart.quality.model.properties.EdgeListProperty;
public class PolygonWrongOrientationError extends AbstractSolidError {
@Serial
private static final long serialVersionUID = 4975827693656963892L;
private String polygonId1;
private String polygonId2;
public String getPolygonId1() {
return polygonId1;
}
public void setPolygonId1(String polygonId1) {
this.polygonId1 = polygonId1;
}
private EdgeListProperty edges;
public String getPolygonId2() {
return polygonId2;
public EdgeListProperty getEdges() {
return edges;
}
public void setPolygonId2(String polygonId2) {
this.polygonId2 = polygonId2;
public void setEdges(EdgeListProperty edges) {
this.edges = edges;
}
}
......@@ -19,7 +19,26 @@ import java.io.Serial;
public class SolidSelfIntersectionError extends AbstractSolidError {
@Serial
private static final long serialVersionUID = 5070991901664859830L;
@Serial
private static final long serialVersionUID = 5070991901664859830L;
private String polygonId1;
private String polygonId2;
public String getPolygonId1() {
return polygonId1;
}
public void setPolygonId1(String polygonId1) {
this.polygonId1 = polygonId1;
}
public String getPolygonId2() {
return polygonId2;
}
public void setPolygonId2(String polygonId2) {
this.polygonId2 = polygonId2;
}
}
......@@ -51,14 +51,14 @@ public class ValidationPlan extends GMLObject implements ADEObject {
this.filter = asChild(filter);
}
public List<RequirementProperty> getRequirement() {
public List<RequirementProperty> getRequirements() {
if (requirement == null) {
requirement = new ChildList<>(this);
}
return requirement;
}
public void setRequirement(List<RequirementProperty> requirement) {
public void setRequirements(List<RequirementProperty> requirement) {
this.requirement = asChild(requirement);
}
......
......@@ -561,8 +561,8 @@
<enumeration value="NOT_CHECKED"/>
</restriction>
</simpleType>
<element name="SEM_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SEM_ATTRIBUTE_MISSINGType"/>
<complexType name="SEM_ATTRIBUTE_MISSINGType">
<element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/>
<complexType name="SE_ATTRIBUTE_MISSINGType">
<complexContent>
<extension base="qual:AbstractSemanticErrorType">
<sequence>
......@@ -573,13 +573,13 @@
</extension>
</complexContent>
</complexType>
<complexType name="SEM_ATTRIBUTE_MISSINGPropertyType">
<complexType name="SE_ATTRIBUTE_MISSINGPropertyType">
<sequence>
<element ref="qual:SEM_ATTRIBUTE_MISSING"/>
<element ref="qual:SE_ATTRIBUTE_MISSING"/>
</sequence>
</complexType>
<element name="SEM_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SEM_ATTRIBUTE_WRONG_VALUEType"/>
<complexType name="SEM_ATTRIBUTE_WRONG_VALUEType">
<element name="SE_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_WRONG_VALUEType"/>
<complexType name="SE_ATTRIBUTE_WRONG_VALUEType">
<complexContent>
<extension base="qual:AbstractSemanticErrorType">
<sequence>
......@@ -590,20 +590,20 @@
</extension>
</complexContent>
</complexType>
<complexType name="SEM_ATTRIBUTE_WRONG_VALUEPropertyType">
<complexType name="SE_ATTRIBUTE_WRONG_VALUEPropertyType">
<sequence>
<element ref="qual:SEM_ATTRIBUTE_WRONG_VALUE"/>
<element ref="qual:SE_ATTRIBUTE_WRONG_VALUE"/>
</sequence>
</complexType>
<element name="Statistics" substitutionGroup="gml:_Object" type="qual:StatisticsType"/>
<complexType name="StatisticsType">
<sequence>
<element name="numErrorBuildings" type="qual:FeatureStatisticsPropertyType"/>
<element name="numErrorVegetation" type="qual:FeatureStatisticsPropertyType"/>
<element name="numErrorLandObjects" type="qual:FeatureStatisticsPropertyType"/>
<element name="numErrorBridgeObjects" type="qual:FeatureStatisticsPropertyType"/>
<element name="numErrorWaterObjects" type="qual:FeatureStatisticsPropertyType"/>
<element name="numErrorTransportation" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorBuildings" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorVegetation" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorLandObjects" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorBridgeObjects" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorWaterObjects" type="qual:FeatureStatisticsPropertyType"/>
<element minOccurs="0" name="numErrorTransportation" type="qual:FeatureStatisticsPropertyType"/>
<element maxOccurs="unbounded" minOccurs="0" name="error" type="qual:ErrorPropertyType"/>
</sequence>
</complexType>
......
<?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">
<!--
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_S_ALL_POLYGONS_WRONG_ORIENTATION>
<qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId>
</qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION>
</qual:validationResult>
<bldg:lod2Solid>
<gml:Solid gml:id="_Simple_BD.1_Geom1">
<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:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</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:CityModel>
\ No newline at end of file
<?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">
<!--
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_P_HOLE_OUTSIDE>
<qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId>
<qual:linearRingId>_Simple_BD.1_PG.1_Ring1</qual:linearRingId>
</qual:GE_P_HOLE_OUTSIDE>
</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:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</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: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