Commit 38715130 authored by Matthias Betz's avatar Matthias Betz
Browse files

Merge branch 'citygml3'

parents 6cf1abce bd8f73de
Pipeline #7210 passed with stage
in 7 seconds
/*-
* 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.types;
import de.hft.stuttgart.quality.model.properties.EdgeListProperty;
import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor;
public class SolidNotClosedError extends AbstractSolidError {
private static final long serialVersionUID = 297029245173578437L;
private EdgeListProperty edges;
public EdgeListProperty getEdges() {
return edges;
}
public void setEdges(EdgeListProperty edges) {
this.edges = asChild(edges);
}
@Override
public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
visitor.visit(this);
}
}
/*- /*-
* Copyright 2020 Hochschule für Technik Stuttgart * Copyright 2022 Hochschule für Technik Stuttgart
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -13,30 +13,37 @@ ...@@ -13,30 +13,37 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package de.hft.stuttgart.quality.model.jaxb; package de.hft.stuttgart.quality.model.types;
import javax.xml.bind.annotation.XmlRootElement; import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor;
@XmlRootElement(name = "GE_S_SELF_INTERSECTION") public class SolidSelfIntersectionError extends AbstractSolidError {
public class SolidSelfIntersectionType extends SolidErrorType {
private static final long serialVersionUID = 5070991901664859830L;
private String polygonId1; private String polygonId1;
private String polygonId2; private String polygonId2;
public String getPolygonId1() {
return polygonId1;
}
public void setPolygonId1(String polygonId1) { public void setPolygonId1(String polygonId1) {
this.polygonId1 = polygonId1; this.polygonId1 = polygonId1;
} }
public void setPolygonId2(String polygonId2) { public String getPolygonId2() {
this.polygonId2 = polygonId2; return polygonId2;
} }
public String getPolygonId1() { public void setPolygonId2(String polygonId2) {
return polygonId1; this.polygonId2 = polygonId2;
} }
public String getPolygonId2() { @Override
return polygonId2; public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
visitor.visit(this);
} }
} }
/*-
* 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.types;
import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor;
public class SolidTooFewPolygonsError extends AbstractSolidError {
@Override
public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
visitor.visit(this);
}
private static final long serialVersionUID = 1987841643971824973L;
}
/*-
* 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.types;
import java.util.List;
import org.citygml4j.core.model.ade.ADEObject;
import org.xmlobjects.gml.model.GMLObject;
import org.xmlobjects.model.ChildList;
import de.hft.stuttgart.quality.model.properties.ErrorProperty;
import de.hft.stuttgart.quality.model.properties.FeatureStatisticsProperty;
public class Statistics extends GMLObject implements ADEObject {
private static final long serialVersionUID = 2935590283116950203L;
private FeatureStatisticsProperty numErrorBuildings;
private FeatureStatisticsProperty numErrorVegetation;
private FeatureStatisticsProperty numErrorLandObjects;
private FeatureStatisticsProperty numErrorBridgeObjects;
private FeatureStatisticsProperty numErrorWaterObjects;
private FeatureStatisticsProperty numErrorTransportation;
private List<ErrorProperty> errors;
public FeatureStatisticsProperty getNumErrorBuildings() {
return numErrorBuildings;
}
public void setNumErrorBuildings(FeatureStatisticsProperty numErrorBuildings) {
this.numErrorBuildings = asChild(numErrorBuildings);
}
public FeatureStatisticsProperty getNumErrorVegetation() {
return numErrorVegetation;
}
public void setNumErrorVegetation(FeatureStatisticsProperty numErrorVegetation) {
this.numErrorVegetation = asChild(numErrorVegetation);
}
public FeatureStatisticsProperty getNumErrorLandObjects() {
return numErrorLandObjects;
}
public void setNumErrorLandObjects(FeatureStatisticsProperty numErrorLandObjects) {
this.numErrorLandObjects = asChild(numErrorLandObjects);
}
public FeatureStatisticsProperty getNumErrorBridgeObjects() {
return numErrorBridgeObjects;
}
public void setNumErrorBridgeObjects(FeatureStatisticsProperty numErrorBridgeObjects) {
this.numErrorBridgeObjects = asChild(numErrorBridgeObjects);
}
public FeatureStatisticsProperty getNumErrorWaterObjects() {
return numErrorWaterObjects;
}
public void setNumErrorWaterObjects(FeatureStatisticsProperty numErrorWaterObjects) {
this.numErrorWaterObjects = asChild(numErrorWaterObjects);
}
public FeatureStatisticsProperty getNumErrorTransportation() {
return numErrorTransportation;
}
public void setNumErrorTransportation(FeatureStatisticsProperty numErrorTransportation) {
this.numErrorTransportation = asChild(numErrorTransportation);
}
public List<ErrorProperty> getErrors() {
if (errors == null) {
errors = new ChildList<>(this);
}
return errors;
}
public void setErrors(List<ErrorProperty> errors) {
this.errors = asChild(errors);
}
}
/*- /*-
* Copyright 2020 Hochschule für Technik Stuttgart * Copyright 2022 Hochschule für Technik Stuttgart
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -13,43 +13,24 @@ ...@@ -13,43 +13,24 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package de.hft.stuttgart.quality.model.jaxb; package de.hft.stuttgart.quality.model.types;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import javax.xml.bind.annotation.XmlType; import org.citygml4j.core.model.ade.ADEObject;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.citygml4j.core.model.core.AbstractFeature;
import de.hft.stuttgart.quality.marshaller.ZonedDateTimeAdapter; import de.hft.stuttgart.quality.model.properties.StatisticsProperty;
import net.opengis.gml.AbstractGMLType; import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty;
@XmlType(name = "validation") public class Validation extends AbstractFeature implements ADEObject {
public class ValidationType extends AbstractGMLType {
@XmlJavaTypeAdapter(ZonedDateTimeAdapter.class) private static final long serialVersionUID = 7821104529898548535L;
private ZonedDateTime validationDate;
private ZonedDateTime validationDate;
private String validationSoftware; private String validationSoftware;
private StatisticsProperty statistics;
private ValidationPlan validationPlan; private ValidationPlanProperty validationPlan;
private Statistics statistics;
public void setStatistics(Statistics statistics) {
this.statistics = statistics;
}
public Statistics getStatistics() {
return statistics;
}
public void setValidationPlan(ValidationPlan validationPlan) {
this.validationPlan = validationPlan;
}
public ValidationPlan getValidationPlan() {
return validationPlan;
}
public ZonedDateTime getValidationDate() { public ZonedDateTime getValidationDate() {
return validationDate; return validationDate;
...@@ -67,4 +48,20 @@ public class ValidationType extends AbstractGMLType { ...@@ -67,4 +48,20 @@ public class ValidationType extends AbstractGMLType {
this.validationSoftware = validationSoftware; this.validationSoftware = validationSoftware;
} }
public StatisticsProperty getStatistics() {
return statistics;
}
public void setStatistics(StatisticsProperty statistics) {
this.statistics = asChild(statistics);
}
public ValidationPlanProperty getValidationPlan() {
return validationPlan;
}
public void setValidationPlan(ValidationPlanProperty validationPlan) {
this.validationPlan = asChild(validationPlan);
}
} }
/*- /*-
* Copyright 2020 Hochschule für Technik Stuttgart * Copyright 2022 Hochschule für Technik Stuttgart
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -13,53 +13,52 @@ ...@@ -13,53 +13,52 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package de.hft.stuttgart.quality.model.jaxb; package de.hft.stuttgart.quality.model.types;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlAccessType; import org.citygml4j.core.model.ade.ADEObject;
import javax.xml.bind.annotation.XmlAccessorType; import org.xmlobjects.gml.model.GMLObject;
import javax.xml.bind.annotation.XmlElement; import org.xmlobjects.model.ChildList;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "validationPlan") import de.hft.stuttgart.quality.model.properties.FilterProperty;
@XmlAccessorType(XmlAccessType.FIELD) import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty;
public class ValidationPlan implements Serializable { import de.hft.stuttgart.quality.model.properties.RequirementProperty;
private static final long serialVersionUID = 199908444294536261L; public class ValidationPlan extends GMLObject implements ADEObject {
@XmlElementWrapper(name = "globalParameters") private static final long serialVersionUID = 434443226848485642L;
@XmlElement(name = "parameter")
private List<Parameter> globalParameters;
@XmlElement(name = "requirement") private GlobalParametersProperty globalParameters;
private List<Requirement> requirements; private FilterProperty filter;
private List<RequirementProperty> requirement;
@XmlElementWrapper(name = "filter") public GlobalParametersProperty getGlobalParameters() {
@XmlElement(name = "checking") return globalParameters;
private List<Checking> filter; }
public List<Checking> getFilter() { public void setGlobalParameters(GlobalParametersProperty globalParameters) {
if (filter == null) { this.globalParameters = asChild(globalParameters);
filter = new ArrayList<>(); }
}
public FilterProperty getFilter() {
return filter; return filter;
} }
public List<Requirement> getRequirements() { public void setFilter(FilterProperty filter) {
if (requirements == null) { this.filter = asChild(filter);
requirements = new ArrayList<>();
}
return requirements;
} }
public List<Parameter> getGlobalParameters() { public List<RequirementProperty> getRequirements() {
if (globalParameters == null) { if (requirement == null) {
globalParameters = new ArrayList<>(); requirement = new ChildList<>(this);
} }
return globalParameters; return requirement;
}
public void setRequirements(List<RequirementProperty> requirement) {
this.requirement = asChild(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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -13,41 +13,61 @@ ...@@ -13,41 +13,61 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package de.hft.stuttgart.quality.model.jaxb; package de.hft.stuttgart.quality.model.types;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.xml.bind.annotation.XmlAttribute; import org.citygml4j.core.model.ade.ADEObject;
import javax.xml.bind.annotation.XmlElementRef; import org.xmlobjects.gml.model.GMLObject;
import org.xmlobjects.gml.model.base.Reference;
import org.xmlobjects.model.ChildList;
import net.opengis.gml.AbstractFeatureType; import de.hft.stuttgart.quality.model.enums.ResultType;
import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor;
public class ValidationResultType extends AbstractFeatureType { public class ValidationResult extends GMLObject implements ADEObject {
@XmlAttribute(name = "result") private static final long serialVersionUID = 4867627296196445082L;
private ResultType result;
@XmlElementRef private Reference validationPlanID;
private List<ValidationErrorType> errors; private List<AbstractErrorProperty> errors;
private ResultType resultType;
public List<ValidationErrorType> getErrors() { public Reference getValidationPlanID() {
return validationPlanID;
}
public void setValidationPlanID(Reference validationPlanID) {
this.validationPlanID = asChild(validationPlanID);
}
public List<AbstractErrorProperty> getErrors() {
if (errors == null) { if (errors == null) {
errors = new ArrayList<>(2); errors = new ChildList<>(this);
} }
return errors; return errors;
} }
public void setResult(ResultType result) { public void setErrors(List<AbstractErrorProperty> errors) {
this.result = result; this.errors = errors;
} }
public ResultType getResult() { public ResultType getResultType() {
return result; return resultType;
} }
public boolean isSetErrors() { public void setResultType(ResultType resultType) {
return errors != null && !errors.isEmpty(); this.resultType = resultType;
}
public void accept(ValidationErrorVisitor visitor) {
for (AbstractErrorProperty errorProp : errors) {
if (errorProp.getObject() == null) {
continue;
}
errorProp.getObject().accept(visitor);
}
} }
} }
/*-
* 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.walker;
import de.hft.stuttgart.quality.model.types.AbstractError;
import de.hft.stuttgart.quality.model.types.AbstractGeometryError;
import de.hft.stuttgart.quality.model.types.AbstractPolygonError;
import de.hft.stuttgart.quality.model.types.AbstractRingError;
import de.hft.stuttgart.quality.model.types.AbstractSemanticError;
import de.hft.stuttgart.quality.model.types.AbstractSolidError;
import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError;
import de.hft.stuttgart.quality.model.types.ConsecutivePointsSameError;
import de.hft.stuttgart.quality.model.types.HoleOutsideError;
import de.hft.stuttgart.quality.model.types.InnerRingsNestedError;
import de.hft.stuttgart.quality.model.types.InteriorDisconnectedError;
import de.hft.stuttgart.quality.model.types.IntersectingRingsError;
import de.hft.stuttgart.quality.model.types.MultipleComponentsError;
import de.hft.stuttgart.quality.model.types.NonManifoldEdgeError;
import de.hft.stuttgart.quality.model.types.NonManifoldVertexError;
import de.hft.stuttgart.quality.model.types.OrientationRingsSameError;
import de.hft.stuttgart.quality.model.types.PlanarDistancePlaneError;
import de.hft.stuttgart.quality.model.types.PlanarNormalsDeviationError;
import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError;
import de.hft.stuttgart.quality.model.types.RingNotClosedError;
import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.RingTooFewPointsError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError;
import de.hft.stuttgart.quality.model.types.SolidNotClosedError;
import de.hft.stuttgart.quality.model.types.SolidSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError;
public interface ValidationErrorVisitor {
default void visit(AbstractError err) {
}
default void visit(AbstractGeometryError err) {
}
default void visit(AbstractPolygonError err) {
}
default void visit(AbstractRingError err) {
}
default void visit(AbstractSemanticError err) {
}
default void visit(AbstractSolidError err) {
}
default void visit(AllPolygonsOrientedWrongError err) {
}
default void visit(ConsecutivePointsSameError err) {
}
default void visit(HoleOutsideError err) {
}
default void visit(InnerRingsNestedError err) {
}
default void visit(IntersectingRingsError err) {
}
default void visit(InteriorDisconnectedError err) {
}
default void visit(MultipleComponentsError err) {
}
default void visit(NonManifoldEdgeError err) {
}
default void visit(NonManifoldVertexError err) {
}
default void visit(OrientationRingsSameError err) {
}
default void visit(PlanarDistancePlaneError err) {
}
default void visit(PlanarNormalsDeviationError err) {
}
default void visit(PolygonWrongOrientationError err) {
}
default void visit(RingNotClosedError err) {
}
default void visit(RingSelfIntersectionError err) {
}
default void visit(RingTooFewPointsError err) {
}
default void visit(SemanticAttributeMissingError err) {
}
default void visit(SemanticAttributeWrongValueError err) {
}
default void visit(SolidNotClosedError err) {
}
default void visit(SolidSelfIntersectionError err) {
}
default void visit(SolidTooFewPolygonsError err) {
}
}
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" elementFormDefault="qualified" targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" version="0.1.4">
<schema xmlns="http://www.w3.org/2001/XMLSchema" <import namespace="http://www.opengis.net/citygml/2.0" schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd"/>
xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" <import namespace="http://www.opengis.net/citygml/building/2.0" schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd"/>
targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
xmlns:core="http://www.opengis.net/citygml/2.0" <!--XML Schema document created by ShapeChange - http://shapechange.net/-->
xmlns:bldg="http://www.opengis.net/citygml/building/2.0" <element abstract="true" name="AbstractError" substitutionGroup="gml:_Object" type="qual:AbstractErrorType"/>
xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" <complexType abstract="true" name="AbstractErrorType">
version="1.0"> <sequence/>
<import namespace="http://www.opengis.net/citygml/2.0" </complexType>
schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd" /> <complexType name="AbstractErrorPropertyType">
<import namespace="http://www.opengis.net/citygml/building/2.0" <sequence>
schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd" /> <element ref="qual:AbstractError"/>
<import </sequence>
namespace="http://www.opengis.net/citygml/appearance/2.0" </complexType>
schemaLocation="http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd" /> <element abstract="true" name="AbstractGeometryError" substitutionGroup="qual:AbstractError" type="qual:AbstractGeometryErrorType"/>
<import namespace="http://www.opengis.net/citygml/generics/2.0" <complexType abstract="true" name="AbstractGeometryErrorType">
schemaLocation="http://schemas.opengis.net/citygml/generics/2.0/generics.xsd" /> <complexContent>
<import namespace="http://www.opengis.net/gml" <extension base="qual:AbstractErrorType">
schemaLocation="http://schemas.opengis.net/gml/2.1.2/gml.xsd" /> <sequence/>
</extension>
<element name="validationResult" </complexContent>
type="qual:validationResultType" </complexType>
substitutionGroup="core:_GenericApplicationPropertyOfCityObject" /> <complexType name="AbstractGeometryErrorPropertyType">
<sequence>
<simpleType name="result" final="restriction"> <element ref="qual:AbstractGeometryError"/>
<annotation> </sequence>
<documentation>Enumeration for status of check result</documentation> </complexType>
</annotation> <element abstract="true" name="AbstractPolygonError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractPolygonErrorType"/>
<restriction base="string"> <complexType abstract="true" name="AbstractPolygonErrorType">
<enumeration value="ERROR"> <complexContent>
<annotation> <extension base="qual:AbstractGeometryErrorType">
<documentation>One or more errors were found</documentation> <sequence>
</annotation> <element name="polygonId" type="string"/>
</enumeration> </sequence>
<enumeration value="NOT_CHECKED"> </extension>
<annotation> </complexContent>
<documentation>Feature was not checked</documentation> </complexType>
</annotation> <complexType name="AbstractPolygonErrorPropertyType">
</enumeration> <sequence>
<enumeration value="OK"> <element ref="qual:AbstractPolygonError"/>
<annotation> </sequence>
<documentation>No errors were found</documentation> </complexType>
</annotation> <element abstract="true" name="AbstractRingError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractRingErrorType"/>
</enumeration> <complexType abstract="true" name="AbstractRingErrorType">
</restriction> <complexContent>
</simpleType> <extension base="qual:AbstractGeometryErrorType">
<sequence>
<complexType name="ValidationError"> <element name="linearRingId" type="string"/>
</complexType> </sequence>
</extension>
<complexType name="RingError"> </complexContent>
<complexContent> </complexType>
<extension base="qual:ValidationError"> <complexType name="AbstractRingErrorPropertyType">
<sequence> <sequence>
<element name="linearRingId" type="string" /> <element ref="qual:AbstractRingError"/>
</sequence> </sequence>
</extension> </complexType>
</complexContent> <element abstract="true" name="AbstractSemanticError" substitutionGroup="qual:AbstractError" type="qual:AbstractSemanticErrorType"/>
</complexType> <complexType abstract="true" name="AbstractSemanticErrorType">
<complexContent>
<complexType name="GE_R_CONSECUTIVE_POINTS_SAME"> <extension base="qual:AbstractErrorType">
<annotation> <sequence/>
<documentation>Consecutive point are the same</documentation> </extension>
</annotation> </complexContent>
<complexContent> </complexType>
<extension base="qual:RingError"> <complexType name="AbstractSemanticErrorPropertyType">
<sequence> <sequence>
<element name="vertex1" type="gml:DirectPositionType" /> <element ref="qual:AbstractSemanticError"/>
<element name="vertex2" type="gml:DirectPositionType" /> </sequence>
</sequence> </complexType>
</extension> <element abstract="true" name="AbstractSolidError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractSolidErrorType"/>
</complexContent> <complexType abstract="true" name="AbstractSolidErrorType">
</complexType> <complexContent>
<extension base="qual:AbstractGeometryErrorType">
<complexType name="GE_R_TOO_FEW_POINTS"> <sequence>
<complexContent> <element name="geometryId" type="string"/>
<extension base="qual:RingError" /> </sequence>
</complexContent> </extension>
</complexType> </complexContent>
</complexType>
<complexType name="GE_R_SELF_INTERSECTION"> <complexType name="AbstractSolidErrorPropertyType">
<complexContent> <sequence>
<extension base="qual:RingError"> <element ref="qual:AbstractSolidError"/>
<sequence> </sequence>
<element name="type" type="qual:ringSelfIntType" /> </complexType>
<element name="edge1" type="qual:edgeType" minOccurs="0" /> <element name="Checking" substitutionGroup="gml:_Object" type="qual:CheckingType"/>
<element name="edge2" type="qual:edgeType" minOccurs="0" /> <complexType name="CheckingType">
<element name="vertex1" type="gml:DirectPositionType" <sequence>
minOccurs="0" /> <element name="featureType" type="qual:FeatureTypeType"/>
<element name="vertex2" type="gml:DirectPositionType" </sequence>
minOccurs="0" /> </complexType>
</sequence> <complexType name="CheckingPropertyType">
</extension> <sequence>
</complexContent> <element ref="qual:Checking"/>
</complexType> </sequence>
</complexType>
<simpleType name="ringSelfIntType"> <element name="Edge" substitutionGroup="gml:_Object" type="qual:EdgeType"/>
<restriction base="string"> <complexType name="EdgeType">
<enumeration value="DUPLICATE_POINT" /> <sequence>
<enumeration value="POINT_TOUCHES_EDGE" /> <element name="from" type="gml:DirectPositionType"/>
<enumeration value="EDGE_INTERSECTS_EDGE" /> <element name="to" type="gml:DirectPositionType"/>
</restriction> </sequence>
</simpleType> </complexType>
<complexType name="EdgePropertyType">
<complexType name="edgeType"> <sequence>
<sequence> <element ref="qual:Edge"/>
<element name="from" type="gml:DirectPositionType" /> </sequence>
<element name="to" type="gml:DirectPositionType" /> </complexType>
</sequence> <element name="EdgeList" substitutionGroup="gml:_Object" type="qual:EdgeListType"/>
</complexType> <complexType name="EdgeListType">
<sequence>
<complexType name="GE_R_NOT_CLOSED"> <element maxOccurs="unbounded" name="edge" type="qual:EdgePropertyType"/>
<complexContent> </sequence>
<extension base="qual:RingError" /> </complexType>
</complexContent> <complexType name="EdgeListPropertyType">
</complexType> <sequence>
<element ref="qual:EdgeList"/>
<complexType name="PolygonError"> </sequence>
<sequence> </complexType>
<element name="polygonId" type="string" /> <element name="Error" substitutionGroup="gml:_Object" type="qual:ErrorType"/>
</sequence> <complexType name="ErrorType">
</complexType> <sequence>
<element name="occurrences" type="integer"/>
<complexType name="GE_P_INTERIOR_DISCONNECTED"> <element name="name" type="qual:ErrorTypeType"/>
<complexContent> </sequence>
<extension base="qual:PolygonError" /> </complexType>
</complexContent> <complexType name="ErrorPropertyType">
</complexType> <sequence>
<element ref="qual:Error"/>
<complexType name="GE_P_INTERSECTING_RINGS"> </sequence>
<complexContent> </complexType>
<extension base="qual:PolygonError"> <simpleType name="ErrorTypeType">
<sequence> <restriction base="string">
<element name="linearRingId1" type="string" /> <enumeration value="GE_R_TOO_FEW_POINTS"/>
<element name="linearRingId2" type="string" /> <enumeration value="GE_R_NOT_CLOSED"/>
</sequence> <enumeration value="GE_R_CONSECUTIVE_POINTS_SAME"/>
</extension> <enumeration value="GE_R_SELF_INTERSECTION"/>
</complexContent> <enumeration value="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"/>
</complexType> <enumeration value="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"/>
<enumeration value="GE_P_INTERIOR_DISCONNECTED"/>
<complexType name="GE_P_INNER_RINGS_NESTED"> <enumeration value="GE_P_INTERSECTING_RINGS"/>
<complexContent> <enumeration value="GE_P_HOLE_OUTSIDE"/>
<extension base="qual:PolygonError"> <enumeration value="GE_P_ORIENTATION_RINGS_SAME"/>
<sequence> <enumeration value="GE_P_INNER_RINGS_NESTED"/>
<element name="linearRingId1" type="string" /> <enumeration value="GE_S_TOO_FEW_POLYGONS"/>
<element name="linearRingId2" type="string" /> <enumeration value="GE_S_NOT_CLOSED"/>
</sequence> <enumeration value="GE_S_NON_MANIFOLD_EDGE"/>
</extension> <enumeration value="GE_S_POLYGON_WRONG_ORIENTATION"/>
</complexContent> <enumeration value="GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/>
</complexType> <enumeration value="GE_S_NON_MANIFOLD_VERTEX"/>
<enumeration value="GE_S_SELF_INTERSECTION"/>
<complexType name="GE_P_HOLE_OUTSIDE"> <enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS"/>
<complexContent> <enumeration value="SE_ATTRIBUTE_WRONG_VALUE"/>
<extension base="qual:PolygonError"> <enumeration value="SE_ATTRIBUTE_MISSING"/>
<sequence> </restriction>
<element name="linearRingId" type="string" /> </simpleType>
</sequence> <element name="FeatureStatistics" substitutionGroup="gml:_Object" type="qual:FeatureStatisticsType"/>
</extension> <complexType name="FeatureStatisticsType">
</complexContent> <sequence>
</complexType> <element name="numChecked" type="integer"/>
<element name="numErrors" type="integer"/>
<complexType </sequence>
name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"> </complexType>
<complexContent> <complexType name="FeatureStatisticsPropertyType">
<extension base="qual:PolygonError"> <sequence>
<sequence> <element ref="qual:FeatureStatistics"/>
<element name="deviation" type="gml:AngleType"></element> </sequence>
</sequence> </complexType>
</extension> <simpleType name="FeatureTypeType">
</complexContent> <restriction base="string">
</complexType> <enumeration value="BUILDING"/>
<enumeration value="TRANSPORTATION"/>
<complexType name="GE_P_ORIENTATION_RINGS_SAME"> <enumeration value="VEGETATION"/>
<complexContent> <enumeration value="BRIDGE"/>
<extension base="qual:PolygonError"> <enumeration value="WATER"/>
<sequence> <enumeration value="LAND"/>
<element name="linearRingId" type="string" /> </restriction>
</sequence> </simpleType>
</extension> <element name="Filter" substitutionGroup="gml:_Object" type="qual:FilterType"/>
</complexContent> <complexType name="FilterType">
</complexType> <sequence>
<element maxOccurs="unbounded" minOccurs="0" name="checking" type="qual:CheckingPropertyType"/>
<complexType name="SolidError"> </sequence>
<sequence> </complexType>
<element name="geometryId" type="string" /> <complexType name="FilterPropertyType">
</sequence> <sequence>
</complexType> <element ref="qual:Filter"/>
</sequence>
<complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION"> </complexType>
<complexContent> <element name="GE_P_HOLE_OUTSIDE" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_HOLE_OUTSIDEType"/>
<extension base="qual:SolidError" /> <complexType name="GE_P_HOLE_OUTSIDEType">
</complexContent> <complexContent>
</complexType> <extension base="qual:AbstractPolygonErrorType">
<sequence>
<complexType name="GE_S_POLYGON_WRONG_ORIENTATION"> <element name="linearRingId" type="string"/>
<complexContent> </sequence>
<extension base="qual:SolidError"> </extension>
<sequence> </complexContent>
<element name="edges" type="qual:EdgeList" /> </complexType>
</sequence> <complexType name="GE_P_HOLE_OUTSIDEPropertyType">
</extension> <sequence>
</complexContent> <element ref="qual:GE_P_HOLE_OUTSIDE"/>
</complexType> </sequence>
</complexType>
<complexType name="EdgeList"> <element name="GE_P_INNER_RINGS_NESTED" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INNER_RINGS_NESTEDType"/>
<sequence> <complexType name="GE_P_INNER_RINGS_NESTEDType">
<element name="edge" type="qual:edgeType" <complexContent>
maxOccurs="unbounded" /> <extension base="qual:AbstractPolygonErrorType">
</sequence> <sequence>
</complexType> <element name="linearRingId1" type="string"/>
<element name="linearRingId2" type="string"/>
<complexType name="GE_S_SELF_INTERSECTION"> </sequence>
<complexContent> </extension>
<extension base="qual:SolidError"> </complexContent>
<sequence> </complexType>
<element name="polygonId1" type="string" /> <complexType name="GE_P_INNER_RINGS_NESTEDPropertyType">
<element name="polygonId2" type="string" /> <sequence>
</sequence> <element ref="qual:GE_P_INNER_RINGS_NESTED"/>
</extension> </sequence>
</complexContent> </complexType>
</complexType> <element name="GE_P_INTERIOR_DISCONNECTED" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INTERIOR_DISCONNECTEDType"/>
<complexType name="GE_P_INTERIOR_DISCONNECTEDType">
<complexType name="GE_S_NON_MANIFOLD_VERTEX"> <complexContent>
<complexContent> <extension base="qual:AbstractPolygonErrorType">
<extension base="qual:SolidError"> <sequence/>
<sequence> </extension>
<element name="vertex" type="gml:DirectPositionType" /> </complexContent>
</sequence> </complexType>
</extension> <complexType name="GE_P_INTERIOR_DISCONNECTEDPropertyType">
</complexContent> <sequence>
</complexType> <element ref="qual:GE_P_INTERIOR_DISCONNECTED"/>
</sequence>
<complexType name="GE_S_NON_MANIFOLD_EDGE"> </complexType>
<complexContent> <element name="GE_P_INTERSECTING_RINGS" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INTERSECTING_RINGSType"/>
<extension base="qual:SolidError"> <complexType name="GE_P_INTERSECTING_RINGSType">
<sequence> <complexContent>
<element name="edges" type="qual:EdgeList" /> <extension base="qual:AbstractPolygonErrorType">
</sequence> <sequence>
</extension> <element name="linearRingId1" type="string"/>
</complexContent> <element name="linearRingId2" type="string"/>
</complexType> </sequence>
</extension>
<complexType name="GE_S_NOT_CLOSED"> </complexContent>
<complexContent> </complexType>
<extension base="qual:SolidError"> <complexType name="GE_P_INTERSECTING_RINGSPropertyType">
<sequence> <sequence>
<element name="edges" type="qual:EdgeList" /> <element ref="qual:GE_P_INTERSECTING_RINGS"/>
</sequence> </sequence>
</extension> </complexType>
</complexContent> <element name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEType"/>
</complexType> <complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEType">
<complexContent>
<complexType name="GE_S_TOO_FEW_POLYGONS"> <extension base="qual:AbstractPolygonErrorType">
<complexContent> <sequence>
<extension base="qual:SolidError" /> <element name="distance" type="gml:LengthType"/>
</complexContent> <element name="vertex" type="gml:DirectPositionType"/>
</complexType> </sequence>
</extension>
<complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTS"> </complexContent>
<complexContent> </complexType>
<extension base="qual:SolidError"> <complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEPropertyType">
<sequence> <sequence>
<element name="components" type="qual:ComponentList" /> <element ref="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"/>
</sequence> </sequence>
</extension> </complexType>
</complexContent> <element name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONType"/>
</complexType> <complexType name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONType">
<complexContent>
<complexType name="ComponentList"> <extension base="qual:AbstractPolygonErrorType">
<sequence> <sequence>
<element name="component" type="qual:componentType" <element name="deviation" type="gml:AngleType"/>
maxOccurs="unbounded" /> </sequence>
</sequence> </extension>
</complexType> </complexContent>
</complexType>
<complexType name="componentType"> <complexType name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONPropertyType">
<sequence> <sequence>
<element name="polygonId" type="string" maxOccurs="unbounded" /> <element ref="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"/>
</sequence> </sequence>
</complexType> </complexType>
<element name="GE_P_ORIENTATION_RINGS_SAME" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_ORIENTATION_RINGS_SAMEType"/>
<complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"> <complexType name="GE_P_ORIENTATION_RINGS_SAMEType">
<annotation> <complexContent>
<documentation>A planarity error with a point too far from the <extension base="qual:AbstractPolygonErrorType">
regression plane <sequence>
</documentation> <element name="linearRingId" type="string"/>
</annotation> </sequence>
<complexContent> </extension>
<extension base="qual:PolygonError"> </complexContent>
<sequence> </complexType>
<element name="vertex" type="gml:DirectPositionType" /> <complexType name="GE_P_ORIENTATION_RINGS_SAMEPropertyType">
<element name="distance" type="gml:LengthType" /> <sequence>
</sequence> <element ref="qual:GE_P_ORIENTATION_RINGS_SAME"/>
</extension> </sequence>
</complexContent> </complexType>
</complexType> <element name="GE_R_CONSECUTIVE_POINTS_SAME" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_CONSECUTIVE_POINTS_SAMEType"/>
<complexType name="GE_R_CONSECUTIVE_POINTS_SAMEType">
<complexType name="SemanticError"> <complexContent>
</complexType> <extension base="qual:AbstractRingErrorType">
<sequence>
<complexType name="SE_ATTRIBUTE_WRONG_VALUE"> <element name="vertex1" type="gml:DirectPositionType"/>
<complexContent> <element name="vertex2" type="gml:DirectPositionType"/>
<extension base="qual:SemanticError"> </sequence>
<sequence> </extension>
<element name="childId" type="string" minOccurs="0" /> </complexContent>
<element name="attributeName" type="string" /> </complexType>
<element name="generic" type="boolean" /> <complexType name="GE_R_CONSECUTIVE_POINTS_SAMEPropertyType">
</sequence> <sequence>
</extension> <element ref="qual:GE_R_CONSECUTIVE_POINTS_SAME"/>
</complexContent> </sequence>
</complexType> </complexType>
<element name="GE_R_NOT_CLOSED" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_NOT_CLOSEDType"/>
<complexType name="SE_ATTRIBUTE_MISSING"> <complexType name="GE_R_NOT_CLOSEDType">
<complexContent> <complexContent>
<extension base="qual:SemanticError"> <extension base="qual:AbstractRingErrorType">
<sequence> <sequence/>
<element name="childId" type="string" minOccurs="0" /> </extension>
<element name="attributeName" type="string" /> </complexContent>
<element name="generic" type="boolean" /> </complexType>
</sequence> <complexType name="GE_R_NOT_CLOSEDPropertyType">
</extension> <sequence>
</complexContent> <element ref="qual:GE_R_NOT_CLOSED"/>
</complexType> </sequence>
</complexType>
<complexType name="validationResultType"> <element name="GE_R_SELF_INTERSECTION" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_SELF_INTERSECTIONType"/>
<annotation> <complexType name="GE_R_SELF_INTERSECTIONType">
<documentation>Data structure containing validation results for <complexContent>
features <extension base="qual:AbstractRingErrorType">
</documentation> <sequence>
</annotation> <element minOccurs="0" name="edge1" type="qual:EdgePropertyType"/>
<element minOccurs="0" name="edge2" type="qual:EdgePropertyType"/>
<element minOccurs="0" name="vertex1" type="gml:DirectPositionType"/>
<sequence> <element minOccurs="0" name="vertex2" type="gml:DirectPositionType"/>
<element name="GE_P_HOLE_OUTSIDE" <element name="type" type="qual:RingSelfIntersectionTypeType"/>
type="qual:GE_P_HOLE_OUTSIDE" minOccurs="0" maxOccurs="unbounded" /> </sequence>
<element name="GE_P_INNER_RINGS_NESTED" </extension>
type="qual:GE_P_INNER_RINGS_NESTED" minOccurs="0" </complexContent>
maxOccurs="unbounded" /> </complexType>
<element name="GE_P_INTERIOR_DISCONNECTED" <complexType name="GE_R_SELF_INTERSECTIONPropertyType">
type="qual:GE_P_INTERIOR_DISCONNECTED" minOccurs="0" <sequence>
maxOccurs="unbounded" /> <element ref="qual:GE_R_SELF_INTERSECTION"/>
<element name="GE_P_INTERSECTING_RINGS" </sequence>
type="qual:GE_P_INTERSECTING_RINGS" minOccurs="0" </complexType>
maxOccurs="unbounded" /> <element name="GE_R_TOO_FEW_POINTS" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_TOO_FEW_POINTSType"/>
<element name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" <complexType name="GE_R_TOO_FEW_POINTSType">
type="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" minOccurs="0" <complexContent>
maxOccurs="unbounded" /> <extension base="qual:AbstractRingErrorType">
<element name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" <sequence/>
type="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" minOccurs="0" </extension>
maxOccurs="unbounded" /> </complexContent>
<element name="GE_P_ORIENTATION_RINGS_SAME" </complexType>
type="qual:GE_P_ORIENTATION_RINGS_SAME" minOccurs="0" <complexType name="GE_R_TOO_FEW_POINTSPropertyType">
maxOccurs="unbounded" /> <sequence>
<element ref="qual:GE_R_TOO_FEW_POINTS"/>
<element name="GE_R_CONSECUTIVE_POINTS_SAME" </sequence>
type="qual:GE_R_CONSECUTIVE_POINTS_SAME" minOccurs="0" </complexType>
maxOccurs="unbounded" /> <element name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATIONType"/>
<element name="GE_R_NOT_CLOSED" type="qual:GE_R_NOT_CLOSED" <complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATIONType">
minOccurs="0" maxOccurs="unbounded" /> <complexContent>
<element name="GE_R_SELF_INTERSECTION" <extension base="qual:AbstractSolidErrorType">
type="qual:GE_R_SELF_INTERSECTION" minOccurs="0" <sequence/>
maxOccurs="unbounded" /> </extension>
<element name="GE_R_TOO_FEW_POINTS" </complexContent>
type="qual:GE_R_TOO_FEW_POINTS" minOccurs="0" maxOccurs="unbounded" /> </complexType>
<complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATIONPropertyType">
<element name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION" <sequence>
type="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION" minOccurs="0" <element ref="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/>
maxOccurs="unbounded" /> </sequence>
<element name="GE_S_MULTIPLE_CONNECTED_COMPONENTS" </complexType>
type="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS" minOccurs="0" <element name="GE_S_MULTIPLE_CONNECTED_COMPONENTS" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTSType"/>
maxOccurs="unbounded" /> <complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTSType">
<element name="GE_S_NON_MANIFOLD_EDGE" <complexContent>
type="qual:GE_S_NON_MANIFOLD_EDGE" minOccurs="0" <extension base="qual:AbstractSolidErrorType">
maxOccurs="unbounded" /> <sequence>
<element name="GE_S_NON_MANIFOLD_VERTEX" <element maxOccurs="unbounded" name="component" type="qual:PolygonIdListPropertyType"/>
type="qual:GE_S_NON_MANIFOLD_VERTEX" minOccurs="0" </sequence>
maxOccurs="unbounded" /> </extension>
<element name="GE_S_NOT_CLOSED" type="qual:GE_S_NOT_CLOSED" </complexContent>
minOccurs="0" maxOccurs="unbounded" /> </complexType>
<element name="GE_S_POLYGON_WRONG_ORIENTATION" <complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTSPropertyType">
type="qual:GE_S_POLYGON_WRONG_ORIENTATION" minOccurs="0" <sequence>
maxOccurs="unbounded" /> <element ref="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS"/>
<element name="GE_S_SELF_INTERSECTION" </sequence>
type="qual:GE_S_SELF_INTERSECTION" minOccurs="0" </complexType>
maxOccurs="unbounded" /> <element name="GE_S_NON_MANIFOLD_EDGE" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NON_MANIFOLD_EDGEType"/>
<element name="GE_S_TOO_FEW_POLYGONS" <complexType name="GE_S_NON_MANIFOLD_EDGEType">
type="qual:GE_S_TOO_FEW_POLYGONS" minOccurs="0" <complexContent>
maxOccurs="unbounded" /> <extension base="qual:AbstractSolidErrorType">
<sequence>
<element name="SE_ATTRIBUTE_MISSING" <element name="edges" type="qual:EdgeListPropertyType"/>
type="qual:SE_ATTRIBUTE_MISSING" minOccurs="0" maxOccurs="unbounded" /> </sequence>
<element name="SE_ATTRIBUTE_WRONG_VALUE" </extension>
type="qual:SE_ATTRIBUTE_WRONG_VALUE" minOccurs="0" </complexContent>
maxOccurs="unbounded" /> </complexType>
</sequence> <complexType name="GE_S_NON_MANIFOLD_EDGEPropertyType">
<attribute name="result" type="qual:result" /> <sequence>
</complexType> <element ref="qual:GE_S_NON_MANIFOLD_EDGE"/>
</sequence>
<simpleType name="requirementID" final="restriction"> </complexType>
<annotation> <element name="GE_S_NON_MANIFOLD_VERTEX" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NON_MANIFOLD_VERTEXType"/>
<documentation>Enumeration for available requirements</documentation> <complexType name="GE_S_NON_MANIFOLD_VERTEXType">
</annotation> <complexContent>
<restriction base="string"> <extension base="qual:AbstractSolidErrorType">
<enumeration value="R_GE_R_TOO_FEW_POINTS" /> <sequence>
<enumeration value="R_GE_R_NOT_CLOSED" /> <element name="vertex" type="gml:DirectPositionType"/>
<enumeration value="R_GE_R_CONSECUTIVE_POINTS_SAME" /> </sequence>
<enumeration value="R_GE_R_SELF_INTERSECTION" /> </extension>
<enumeration value="R_GE_P_NON_PLANAR" /> </complexContent>
<enumeration value="R_GE_P_INTERIOR_DISCONNECTED" /> </complexType>
<enumeration value="R_GE_P_INTERSECTING_RINGS" /> <complexType name="GE_S_NON_MANIFOLD_VERTEXPropertyType">
<enumeration value="R_GE_P_HOLE_OUTSIDE" /> <sequence>
<enumeration value="R_GE_P_ORIENTATION_RINGS_SAME" /> <element ref="qual:GE_S_NON_MANIFOLD_VERTEX"/>
<enumeration value="R_GE_P_INNER_RINGS_NESTED" /> </sequence>
<enumeration value="R_GE_S_TOO_FEW_POLYGONS" /> </complexType>
<enumeration value="R_GE_S_NOT_CLOSED" /> <element name="GE_S_NOT_CLOSED" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NOT_CLOSEDType"/>
<enumeration value="R_GE_S_NON_MANIFOLD_EDGE" /> <complexType name="GE_S_NOT_CLOSEDType">
<enumeration value="R_GE_S_POLYGON_WRONG_ORIENTATION" /> <complexContent>
<enumeration <extension base="qual:AbstractSolidErrorType">
value="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" /> <sequence>
<enumeration value="R_GE_S_NON_MANIFOLD_VERTEX" /> <element name="edges" type="qual:EdgeListPropertyType"/>
<enumeration value="R_GE_S_SELF_INTERSECTION" /> </sequence>
<enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" /> </extension>
<enumeration value="R_SE_ATTRIBUTES_EXISTING" /> </complexContent>
<enumeration value="R_SE_ATTRIBUTES_CORRECT" /> </complexType>
</restriction> <complexType name="GE_S_NOT_CLOSEDPropertyType">
</simpleType> <sequence>
<element ref="qual:GE_S_NOT_CLOSED"/>
<complexType name="parameter"> </sequence>
<simpleContent> </complexType>
<extension base="string"> <element name="GE_S_POLYGON_WRONG_ORIENTATION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_POLYGON_WRONG_ORIENTATIONType"/>
<attribute name="name" type="string" use="required" /> <complexType name="GE_S_POLYGON_WRONG_ORIENTATIONType">
<attribute name="uom" type="string" use="optional" /> <complexContent>
</extension> <extension base="qual:AbstractSolidErrorType">
</simpleContent> <sequence>
</complexType> <element name="edges" type="qual:EdgeListPropertyType"/>
</sequence>
<complexType name="requirementType"> </extension>
<annotation> </complexContent>
<documentation>Requirement structure for configuration purposes </complexType>
</documentation> <complexType name="GE_S_POLYGON_WRONG_ORIENTATIONPropertyType">
</annotation> <sequence>
<sequence> <element ref="qual:GE_S_POLYGON_WRONG_ORIENTATION"/>
<element name="parameter" type="qual:parameter" minOccurs="0" </sequence>
maxOccurs="unbounded" /> </complexType>
</sequence> <element name="GE_S_SELF_INTERSECTION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_SELF_INTERSECTIONType"/>
<attribute name="name" type="qual:requirementID" /> <complexType name="GE_S_SELF_INTERSECTIONType">
<attribute name="enabled" type="boolean" /> <complexContent>
</complexType> <extension base="qual:AbstractSolidErrorType">
<sequence>
<complexType name="validationPlanType"> <element name="polygonId1" type="string"/>
<annotation> <element name="polygonId2" type="string"/>
<documentation>Validation plan structure containing information about </sequence>
the parameters used to perform the checks </extension>
</documentation> </complexContent>
</annotation> </complexType>
<sequence> <complexType name="GE_S_SELF_INTERSECTIONPropertyType">
<element name="globalParameters" <sequence>
type="qual:globalParameterType" /> <element ref="qual:GE_S_SELF_INTERSECTION"/>
<element name="requirement" type="qual:requirementType" </sequence>
maxOccurs="unbounded" /> </complexType>
<element name="filter" type="qual:filterType" minOccurs="1" <element name="GE_S_TOO_FEW_POLYGONS" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_TOO_FEW_POLYGONSType"/>
maxOccurs="1" /> <complexType name="GE_S_TOO_FEW_POLYGONSType">
</sequence> <complexContent>
</complexType> <extension base="qual:AbstractSolidErrorType">
<sequence/>
<complexType name="filterType"> </extension>
<sequence> </complexContent>
<element name="checking" type="qual:featureType" </complexType>
minOccurs="0" maxOccurs="unbounded" /> <complexType name="GE_S_TOO_FEW_POLYGONSPropertyType">
</sequence> <sequence>
</complexType> <element ref="qual:GE_S_TOO_FEW_POLYGONS"/>
</sequence>
<simpleType name="featureType"> </complexType>
<restriction base="string"> <element name="GlobalParameters" substitutionGroup="gml:_Object" type="qual:GlobalParametersType"/>
<enumeration value="BUILDING"></enumeration> <complexType name="GlobalParametersType">
<enumeration value="TRANSPORTATION"></enumeration> <sequence>
<enumeration value="VEGETATION"></enumeration> <element maxOccurs="unbounded" minOccurs="0" name="parameter" type="qual:ParameterPropertyType"/>
<enumeration value="BRIDGE"></enumeration> </sequence>
<enumeration value="WATER"></enumeration> </complexType>
<enumeration value="LAND"></enumeration> <complexType name="GlobalParametersPropertyType">
</restriction> <sequence>
</simpleType> <element ref="qual:GlobalParameters"/>
</sequence>
<complexType name="globalParameterType"> </complexType>
<sequence> <element name="Parameter" substitutionGroup="gml:_Object" type="qual:ParameterType"/>
<element name="parameter" type="qual:parameter" <complexType name="ParameterType">
maxOccurs="unbounded" /> <sequence>
</sequence> <element name="name" type="string"/>
</complexType> <element minOccurs="0" name="uom" type="string"/>
<element name="value" type="string"/>
<complexType name="statisticsType"> </sequence>
<annotation> </complexType>
<documentation>Statistics structure containing information about end <complexType name="ParameterPropertyType">
result of checking process <sequence>
</documentation> <element ref="qual:Parameter"/>
</annotation> </sequence>
<sequence> </complexType>
<element name="numErrorBuildings" <element name="PolygonIdList" substitutionGroup="gml:_Object" type="qual:PolygonIdListType"/>
type="qual:featureStatistics" /> <complexType name="PolygonIdListType">
<element name="numErrorVegetation" <sequence>
type="qual:featureStatistics" /> <element maxOccurs="unbounded" name="polygonId" type="string"/>
<element name="numErrorLandObjects" </sequence>
type="qual:featureStatistics" /> </complexType>
<element name="numErrorBridgeObjects" <complexType name="PolygonIdListPropertyType">
type="qual:featureStatistics" /> <sequence>
<element name="numErrorWaterObjects" <element ref="qual:PolygonIdList"/>
type="qual:featureStatistics" /> </sequence>
<element name="numErrorTransportation" </complexType>
type="qual:featureStatistics" /> <element name="Requirement" substitutionGroup="gml:_Object" type="qual:RequirementType"/>
<element name="errorStatistics" <complexType name="RequirementType">
type="qual:errorStatisticsType" /> <sequence>
</sequence> <element name="enabled" type="boolean"/>
</complexType> <element name="requirementType" type="qual:RequirementTypeType"/>
<element maxOccurs="unbounded" minOccurs="0" name="parameter" type="qual:ParameterPropertyType"/>
<complexType name="errorStatisticsType"> </sequence>
<sequence> </complexType>
<element name="error" type="qual:errorType" minOccurs="0" <complexType name="RequirementPropertyType">
maxOccurs="unbounded" /> <sequence>
</sequence> <element ref="qual:Requirement"/>
</complexType> </sequence>
</complexType>
<complexType name="errorType"> <simpleType name="RequirementTypeType">
<simpleContent> <restriction base="string">
<extension base="int"> <enumeration value="R_GE_R_TOO_FEW_POINTS"/>
<attribute name="name" type="qual:errorId"></attribute> <enumeration value="R_GE_R_NOT_CLOSED"/>
</extension> <enumeration value="R_GE_R_CONSECUTIVE_POINTS_SAME"/>
</simpleContent> <enumeration value="R_GE_R_SELF_INTERSECTION"/>
</complexType> <enumeration value="R_GE_P_NON_PLANAR"/>
<enumeration value="R_GE_P_INTERIOR_DISCONNECTED"/>
<simpleType name="errorId"> <enumeration value="R_GE_P_INTERSECTING_RINGS"/>
<restriction base="string"> <enumeration value="R_GE_P_HOLE_OUTSIDE"/>
<enumeration value="GE_R_TOO_FEW_POINTS" /> <enumeration value="R_GE_P_ORIENTATION_RINGS_SAME"/>
<enumeration value="GE_R_NOT_CLOSED" /> <enumeration value="R_GE_P_INNER_RINGS_NESTED"/>
<enumeration value="GE_R_CONSECUTIVE_POINTS_SAME" /> <enumeration value="R_GE_S_TOO_FEW_POLYGONS"/>
<enumeration value="GE_R_SELF_INTERSECTION" /> <enumeration value="R_GE_S_NOT_CLOSED"/>
<enumeration <enumeration value="R_GE_S_NON_MANIFOLD_EDGE"/>
value="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" /> <enumeration value="R_GE_S_POLYGON_WRONG_ORIENTATION"/>
<enumeration <enumeration value="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/>
value="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" /> <enumeration value="R_GE_S_NON_MANIFOLD_VERTEX"/>
<enumeration value="GE_P_INTERIOR_DISCONNECTED" /> <enumeration value="R_GE_S_SELF_INTERSECTION"/>
<enumeration value="GE_P_INTERSECTING_RINGS" /> <enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"/>
<enumeration value="GE_P_HOLE_OUTSIDE" /> <enumeration value="R_SE_ATTRIBUTES_EXISTING"/>
<enumeration value="GE_P_ORIENTATION_RINGS_SAME" /> <enumeration value="R_SE_ATTRIBUTES_CORRECT"/>
<enumeration value="GE_P_INNER_RINGS_NESTED" /> </restriction>
<enumeration value="GE_S_TOO_FEW_POLYGONS" /> </simpleType>
<enumeration value="GE_S_NOT_CLOSED" /> <simpleType name="ResultTypeType">
<enumeration value="GE_S_NON_MANIFOLD_EDGE" /> <restriction base="string">
<enumeration value="GE_S_POLYGON_WRONG_ORIENTATION" /> <enumeration value="OK"/>
<enumeration value="GE_S_ALL_POLYGONS_WRONG_ORIENTATION" /> <enumeration value="ERROR"/>
<enumeration value="GE_S_NON_MANIFOLD_VERTEX" /> <enumeration value="NOT_CHECKED"/>
<enumeration value="GE_S_SELF_INTERSECTION" /> </restriction>
<enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS" /> </simpleType>
<enumeration value="SE_ATTRIBUTE_WRONG_VALUE" /> <simpleType name="RingSelfIntersectionTypeType">
<enumeration value="SE_ATTRIBUTE_MISSING" /> <restriction base="string">
</restriction> <enumeration value="EDGE_INTERSECTION"/>
</simpleType> <enumeration value="VERTEX_TOUCHES_EDGE"/>
<enumeration value="DUPLICATE_POINT"/>
<complexType name="featureStatistics"> <enumeration value="DEGENERATED_RING"/>
<simpleContent> </restriction>
<extension base="int"> </simpleType>
<attribute name="numChecked" type="int" /> <element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/>
</extension> <complexType name="SE_ATTRIBUTE_MISSINGType">
</simpleContent> <complexContent>
</complexType> <extension base="qual:AbstractSemanticErrorType">
<sequence>
<element name="validation" type="qual:validationType" <element name="childId" type="string"/>
substitutionGroup="core:_GenericApplicationPropertyOfCityModel" /> <element name="attributeName" type="string"/>
<element name="generic" type="boolean"/>
<complexType name="validationType"> </sequence>
<annotation> </extension>
<documentation>Data structure containing the validation plan and </complexContent>
statistics of a validation process </complexType>
</documentation> <complexType name="SE_ATTRIBUTE_MISSINGPropertyType">
</annotation> <sequence>
<sequence> <element ref="qual:SE_ATTRIBUTE_MISSING"/>
<element name="validationDate" type="dateTime" /> </sequence>
<element name="validationSoftware" type="string" /> </complexType>
<element name="validationPlan" type="qual:validationPlanType" <element name="SE_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_WRONG_VALUEType"/>
maxOccurs="1" /> <complexType name="SE_ATTRIBUTE_WRONG_VALUEType">
<element name="statistics" type="qual:statisticsType" <complexContent>
maxOccurs="1" /> <extension base="qual:AbstractSemanticErrorType">
</sequence> <sequence>
</complexType> <element name="childId" type="string"/>
</schema> <element name="attributeName" type="string"/>
\ No newline at end of file <element name="generic" type="boolean"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SE_ATTRIBUTE_WRONG_VALUEPropertyType">
<sequence>
<element ref="qual:SE_ATTRIBUTE_WRONG_VALUE"/>
</sequence>
</complexType>
<element name="Statistics" substitutionGroup="gml:_Object" type="qual:StatisticsType"/>
<complexType name="StatisticsType">
<sequence>
<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>
<complexType name="StatisticsPropertyType">
<sequence>
<element ref="qual:Statistics"/>
</sequence>
</complexType>
<element name="Validation" substitutionGroup="gml:_Feature" type="qual:ValidationType"/>
<complexType name="ValidationType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="validationDate" type="dateTime"/>
<element name="validationSoftware" type="string"/>
<element minOccurs="0" name="statistics" type="qual:StatisticsPropertyType"/>
<element name="validationPlan" type="qual:ValidationPlanPropertyType"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="ValidationPropertyType">
<sequence minOccurs="0">
<element ref="qual:Validation"/>
</sequence>
<attributeGroup ref="gml:AssociationAttributeGroup"/>
</complexType>
<element name="ValidationPlan" substitutionGroup="gml:_Object" type="qual:ValidationPlanType"/>
<complexType name="ValidationPlanType">
<sequence>
<element name="globalParameters" type="qual:GlobalParametersPropertyType"/>
<element name="filter" type="qual:FilterPropertyType"/>
<element maxOccurs="unbounded" name="requirement" type="qual:RequirementPropertyType"/>
</sequence>
</complexType>
<complexType name="ValidationPlanPropertyType">
<sequence>
<element ref="qual:ValidationPlan"/>
</sequence>
</complexType>
<element name="ValidationResult" substitutionGroup="gml:_Object" type="qual:ValidationResultType"/>
<complexType name="ValidationResultType">
<sequence>
<element name="validationPlanID" type="gml:ReferenceType"/>
<element maxOccurs="unbounded" minOccurs="0" name="error" type="qual:AbstractErrorPropertyType"/>
<element name="resultType" type="qual:ResultTypeType"/>
</sequence>
</complexType>
<complexType name="ValidationResultPropertyType">
<sequence>
<element ref="qual:ValidationResult"/>
</sequence>
</complexType>
<element name="validationResult" substitutionGroup="core:_GenericApplicationPropertyOfCityObject" type="qual:ValidationResultPropertyType"/>
</schema>
/*- /*-
* Copyright 2020 Hochschule für Technik Stuttgart * Copyright 2022 Hochschule für Technik Stuttgart
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -15,1395 +15,588 @@ ...@@ -15,1395 +15,588 @@
*/ */
package de.hft.stuttgart.quality; 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 static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDateTime; import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.ServiceLoader; import java.util.Locale;
import org.citygml4j.CityGMLContext; import javax.xml.XMLConstants;
import org.citygml4j.builder.jaxb.CityGMLBuilder; import javax.xml.namespace.QName;
import org.citygml4j.builder.jaxb.CityGMLBuilderException; import javax.xml.transform.Source;
import org.citygml4j.model.citygml.ade.ADEComponent; import javax.xml.transform.stream.StreamSource;
import org.citygml4j.model.citygml.ade.ADEException; import javax.xml.validation.Schema;
import org.citygml4j.model.citygml.ade.binding.ADEContext; import javax.xml.validation.SchemaFactory;
import org.citygml4j.model.citygml.building.Building; import javax.xml.validation.Validator;
import org.citygml4j.model.citygml.core.AbstractCityObject;
import org.citygml4j.model.citygml.core.CityModel; import org.citygml4j.core.ade.ADEException;
import org.citygml4j.model.citygml.core.CityObjectMember; import org.citygml4j.core.ade.ADERegistry;
import org.citygml4j.model.gml.geometry.primitives.DirectPosition; import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.model.gml.measures.Angle; import org.citygml4j.core.model.building.Building;
import org.citygml4j.model.gml.measures.Length; import org.citygml4j.core.model.core.AbstractCityObjectProperty;
import org.citygml4j.model.module.citygml.CityGMLVersion; import org.citygml4j.core.model.core.AbstractFeatureProperty;
import org.citygml4j.xml.io.CityGMLInputFactory; import org.citygml4j.core.model.core.CityModel;
import org.citygml4j.xml.io.CityGMLOutputFactory; import org.citygml4j.core.util.CityGMLConstants;
import org.citygml4j.xml.io.reader.CityGMLReadException; import org.citygml4j.xml.CityGMLContext;
import org.citygml4j.xml.io.reader.CityGMLReader; import org.citygml4j.xml.CityGMLContextException;
import org.citygml4j.xml.io.reader.FeatureReadMode; import org.citygml4j.xml.module.citygml.CoreModule;
import org.citygml4j.xml.io.writer.CityGMLWriteException; import org.citygml4j.xml.schema.CityGMLSchemaHandler;
import org.citygml4j.xml.io.writer.CityGMLWriter; import org.citygml4j.xml.writer.CityGMLOutputFactory;
import org.citygml4j.xml.writer.CityGMLWriteException;
import org.citygml4j.xml.writer.CityGMLWriter;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xml.sax.ErrorHandler;
import de.hft.stuttgart.quality.model.AllPolygonsWrongOrientation; import org.xml.sax.SAXException;
import de.hft.stuttgart.quality.model.AttributeMissing; import org.xml.sax.SAXParseException;
import de.hft.stuttgart.quality.model.AttributeWrongValue; import org.xmlobjects.gml.model.base.Reference;
import de.hft.stuttgart.quality.model.ConsecutivePointsSame; import org.xmlobjects.gml.model.geometry.DirectPosition;
import de.hft.stuttgart.quality.model.Edge; import org.xmlobjects.gml.model.measures.Angle;
import de.hft.stuttgart.quality.model.HoleOutside; import org.xmlobjects.gml.model.measures.Length;
import de.hft.stuttgart.quality.model.InnerRingsNested; import org.xmlobjects.schema.SchemaHandlerException;
import de.hft.stuttgart.quality.model.InteriorDisconnected;
import de.hft.stuttgart.quality.model.IntersectingRings; import de.hft.stuttgart.quality.model.enums.ErrorId;
import de.hft.stuttgart.quality.model.MultipleConnectedComponents; import de.hft.stuttgart.quality.model.enums.RequirementId;
import de.hft.stuttgart.quality.model.NonManifoldEdge; import de.hft.stuttgart.quality.model.enums.ResultType;
import de.hft.stuttgart.quality.model.NonManifoldVertex; import de.hft.stuttgart.quality.model.enums.RingSelfIntType;
import de.hft.stuttgart.quality.model.NonPlanarDistancePlane; import de.hft.stuttgart.quality.model.enums.TopLevelFeatureType;
import de.hft.stuttgart.quality.model.NonPlanarNormalsDeviation; import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty;
import de.hft.stuttgart.quality.model.OrientationRingsSame; import de.hft.stuttgart.quality.model.properties.CheckingProperty;
import de.hft.stuttgart.quality.model.PolygonWrongOrientation; import de.hft.stuttgart.quality.model.properties.EdgeListProperty;
import de.hft.stuttgart.quality.model.RingNotClosed; import de.hft.stuttgart.quality.model.properties.EdgeProperty;
import de.hft.stuttgart.quality.model.RingSelfIntersection; import de.hft.stuttgart.quality.model.properties.ErrorProperty;
import de.hft.stuttgart.quality.model.SolidNotClosed; import de.hft.stuttgart.quality.model.properties.FeatureStatisticsProperty;
import de.hft.stuttgart.quality.model.TooFewPoints; import de.hft.stuttgart.quality.model.properties.FilterProperty;
import de.hft.stuttgart.quality.model.TooFewPolygons; import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty;
import de.hft.stuttgart.quality.model.Validation; import de.hft.stuttgart.quality.model.properties.ParameterProperty;
import de.hft.stuttgart.quality.model.ValidationError; import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty;
import de.hft.stuttgart.quality.model.ValidationResult; import de.hft.stuttgart.quality.model.properties.RequirementProperty;
import de.hft.stuttgart.quality.model.jaxb.Checking; import de.hft.stuttgart.quality.model.properties.StatisticsProperty;
import de.hft.stuttgart.quality.model.jaxb.Component; import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty;
import de.hft.stuttgart.quality.model.jaxb.ErrorId; import de.hft.stuttgart.quality.model.properties.ValidationResultProperty;
import de.hft.stuttgart.quality.model.jaxb.ErrorStatistics; import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError;
import de.hft.stuttgart.quality.model.jaxb.FeatureStatistics; import de.hft.stuttgart.quality.model.types.Checking;
import de.hft.stuttgart.quality.model.jaxb.Parameter; import de.hft.stuttgart.quality.model.types.CityObjectProperties;
import de.hft.stuttgart.quality.model.jaxb.Requirement; import de.hft.stuttgart.quality.model.types.ConsecutivePointsSameError;
import de.hft.stuttgart.quality.model.jaxb.RequirementId; import de.hft.stuttgart.quality.model.types.Edge;
import de.hft.stuttgart.quality.model.jaxb.ResultType; import de.hft.stuttgart.quality.model.types.EdgeList;
import de.hft.stuttgart.quality.model.jaxb.RingSelfIntType; import de.hft.stuttgart.quality.model.types.FeatureStatistics;
import de.hft.stuttgart.quality.model.jaxb.Statistics; import de.hft.stuttgart.quality.model.types.Filter;
import de.hft.stuttgart.quality.model.jaxb.TopLevelFeatureType; import de.hft.stuttgart.quality.model.types.GlobalParameters;
import de.hft.stuttgart.quality.model.jaxb.ValidationPlan; import de.hft.stuttgart.quality.model.types.HoleOutsideError;
import de.hft.stuttgart.quality.model.types.InnerRingsNestedError;
import de.hft.stuttgart.quality.model.types.InteriorDisconnectedError;
import de.hft.stuttgart.quality.model.types.IntersectingRingsError;
import de.hft.stuttgart.quality.model.types.MultipleComponentsError;
import de.hft.stuttgart.quality.model.types.NonManifoldEdgeError;
import de.hft.stuttgart.quality.model.types.NonManifoldVertexError;
import de.hft.stuttgart.quality.model.types.OrientationRingsSameError;
import de.hft.stuttgart.quality.model.types.Parameter;
import de.hft.stuttgart.quality.model.types.PlanarDistancePlaneError;
import de.hft.stuttgart.quality.model.types.PlanarNormalsDeviationError;
import de.hft.stuttgart.quality.model.types.PolygonIdList;
import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError;
import de.hft.stuttgart.quality.model.types.Requirement;
import de.hft.stuttgart.quality.model.types.RingNotClosedError;
import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.RingTooFewPointsError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError;
import de.hft.stuttgart.quality.model.types.SolidNotClosedError;
import de.hft.stuttgart.quality.model.types.SolidSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError;
import de.hft.stuttgart.quality.model.types.Statistics;
import de.hft.stuttgart.quality.model.types.Validation;
import de.hft.stuttgart.quality.model.types.ValidationPlan;
import de.hft.stuttgart.quality.model.types.ValidationResult;
class QualityAdeTests { class QualityAdeTests {
@Test private static final String CITY_OBJECT_MEMBER = "cityObjectMember";
void testReadingConsecutiveSameError() private static List<QName> chunkProperties = new ArrayList<>();
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_Error_QualityADE.gml");
testValidationPlan(cityModel);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
assertEquals(1, cityObjectMember.size());
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
assertNotNull(aco);
assertTrue(aco instanceof Building);
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
assertTrue(resultComp instanceof ValidationResult);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
assertEquals(1, errors.size());
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof ConsecutivePointsSame);
ConsecutivePointsSame err = (ConsecutivePointsSame) validationError;
assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId());
Double x1 = err.getVertex1().getValue().get(0);
assertEquals(11.5, x1, 0.0000001);
Double x2 = err.getVertex2().getValue().get(0);
assertEquals(11.5, x2, 0.0000001);
}
@Test static {
void testReadingTooFewPointsError() chunkProperties.add(new QName(CityGMLConstants.CITYGML_1_0_CORE_NAMESPACE, CITY_OBJECT_MEMBER));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { chunkProperties.add(new QName(CityGMLConstants.CITYGML_2_0_CORE_NAMESPACE, CITY_OBJECT_MEMBER));
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_TooFewPoints.gml"); chunkProperties.add(new QName(CityGMLConstants.CITYGML_3_0_CORE_NAMESPACE, CITY_OBJECT_MEMBER));
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof TooFewPoints);
TooFewPoints err = (TooFewPoints) validationError;
assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId());
} }
@Test @BeforeAll
void testReadingRingSelfIntersectionError() static void setUsLocale() throws ADEException {
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { Locale.setDefault(Locale.US);
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_RingSelfIntersection.gml"); ADERegistry.getInstance().loadADE(new QualityADEContext());
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof RingSelfIntersection);
RingSelfIntersection err = (RingSelfIntersection) validationError;
assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId());
assertEquals(RingSelfIntType.POINT_TOUCHES_EDGE, err.getType());
assertNull(err.getEdge2());
Edge edge1 = err.getEdge1();
assertEquals(10.0, edge1.getFrom().getValue().get(0), 0.000001);
assertEquals(11.0, edge1.getTo().getValue().get(0), 0.000001);
assertEquals(5.0, err.getVertex1().getValue().get(0));
assertNull(err.getVertex2());
} }
@Test @Test
void testReadingRingNotClosedError() void testAllPolygonsOrientedWrong() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { SAXException, IOException, SchemaHandlerException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_RingNotClosed.gml"); CityModel model = new CityModel();
ValidationResult res = fillCityModel(model);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof RingNotClosed);
RingNotClosed err = (RingNotClosed) validationError;
assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId());
}
@Test AllPolygonsOrientedWrongError err = new AllPolygonsOrientedWrongError();
void testReadingInteriorDisconnectedError() err.setGeometryId("geomId");
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { res.getErrors().add(new AbstractErrorProperty(err));
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_InteriorDisconnected.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof InteriorDisconnected);
InteriorDisconnected err = (InteriorDisconnected) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
}
@Test byte[] buf = writeModel(model);
void testReadingIntersectingRingsError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_IntersectingRings.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof IntersectingRings);
IntersectingRings err = (IntersectingRings) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId1());
assertEquals("_Simple_BD.1_PG.1_Ring2", err.getLinearRingId2());
} }
@Test @Test
void testReadingNonPlanarPolygonDistancePlaneError() void testConsecutivePointsSameError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { SAXException, IOException, SchemaHandlerException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.gml"); CityModel model = new CityModel();
ValidationResult res = fillCityModel(model);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof NonPlanarDistancePlane);
NonPlanarDistancePlane err = (NonPlanarDistancePlane) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals(1.0, err.getVertex().getValue().get(0), 0.000001);
assertEquals(0.001, err.getDistance().getValue(), 0.000001);
assertEquals("m", err.getDistance().getUom());
}
@Test ConsecutivePointsSameError err = new ConsecutivePointsSameError();
void testReadingInnerRingsNestedError() err.setLinearRingId("ringId");
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { err.setVertex1(new DirectPosition(1, 2, 3));
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_InnerRingNested.gml"); err.setVertex2(new DirectPosition(5, 6, 7));
res.getErrors().add(new AbstractErrorProperty(err));
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof InnerRingsNested);
InnerRingsNested err = (InnerRingsNested) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId1());
assertEquals("_Simple_BD.1_PG.1_Ring2", err.getLinearRingId2());
}
@Test byte[] buf = writeModel(model);
void testReadingHoleOutsideError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_HoleOutside.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof HoleOutside);
HoleOutside err = (HoleOutside) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId());
} }
@Test @Test
void testReadingNonPlanarNormalsDeviationError() void testHoleOutsideError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { IOException, SchemaHandlerException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.gml"); CityModel model = new CityModel();
ValidationResult res = fillCityModel(model);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof NonPlanarNormalsDeviation);
NonPlanarNormalsDeviation err = (NonPlanarNormalsDeviation) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals(1.0, err.getDeviation().getValue());
assertEquals("deg", err.getDeviation().getUom());
}
@Test HoleOutsideError err = new HoleOutsideError();
void testReadingOrientationRingsSameError() err.setLinearRingId("ringId");
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { err.setPolygonId("polyId");
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_OrientationRingsSame.gml"); res.getErrors().add(new AbstractErrorProperty(err));
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof OrientationRingsSame);
OrientationRingsSame err = (OrientationRingsSame) validationError;
assertEquals("_Simple_BD.1_PG.1", err.getPolygonId());
assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId());
}
@Test byte[] buf = writeModel(model);
void testReadingAllPolygonsWrongOrientationError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof AllPolygonsWrongOrientation);
AllPolygonsWrongOrientation err = (AllPolygonsWrongOrientation) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
} }
@Test @Test
void testReadingPolygonWrongOrientationError() void testInnerRingsNestedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { IOException, SchemaHandlerException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_PolygonWrongOrientation.gml"); CityModel model = new CityModel();
ValidationResult res = fillCityModel(model);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof PolygonWrongOrientation);
PolygonWrongOrientation err = (PolygonWrongOrientation) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
assertFalse(err.getEdges().isEmpty());
List<Edge> edges = err.getEdges();
Edge edge = edges.get(0);
DirectPosition from = edge.getFrom();
assertEquals(10.0, from.getValue().get(0), 0.000001);
assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001);
}
@Test InnerRingsNestedError err = new InnerRingsNestedError();
void testReadingNonManifoldVertexError() err.setLinearRingId1("ringId1");
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { err.setLinearRingId2("ringId2");
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonManifoldVertex.gml"); err.setPolygonId("polyId");
res.getErrors().add(new AbstractErrorProperty(err));
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof NonManifoldVertex);
NonManifoldVertex err = (NonManifoldVertex) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
DirectPosition vertex = err.getVertex();
assertEquals(1.0, vertex.getValue().get(0), 0.000001);
}
@Test byte[] buf = writeModel(model);
void testReadingNonManifoldEdgeError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonManifoldEdge.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof NonManifoldEdge);
NonManifoldEdge err = (NonManifoldEdge) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
assertFalse(err.getEdges().isEmpty());
List<Edge> edges = err.getEdges();
Edge edge = edges.get(0);
DirectPosition from = edge.getFrom();
assertEquals(10.0, from.getValue().get(0), 0.000001);
assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001);
} }
@Test @Test
void testReadingSolidNotClosedError() void testInteriorDisconnectedError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { SAXException, IOException, SchemaHandlerException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_SolidNotClosed.gml"); CityModel model = new CityModel();
ValidationResult res = fillCityModel(model);
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof SolidNotClosed);
SolidNotClosed err = (SolidNotClosed) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
assertFalse(err.getEdges().isEmpty());
List<Edge> edges = err.getEdges();
Edge edge = edges.get(0);
DirectPosition from = edge.getFrom();
assertEquals(10.0, from.getValue().get(0), 0.000001);
assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001);
}
@Test InteriorDisconnectedError err = new InteriorDisconnectedError();
void testReadingTooFewPolygonsError() err.setPolygonId("polyId");
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { res.getErrors().add(new AbstractErrorProperty(err));
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_TooFewPolygons.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof TooFewPolygons);
TooFewPolygons err = (TooFewPolygons) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
}
@Test byte[] buf = writeModel(model);
void testReadingMultipleConnectedComponentsError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException {
CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_MultipleConnectedComponents.gml");
List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember();
CityObjectMember com = cityObjectMember.get(0);
AbstractCityObject aco = com.getCityObject();
Building b = (Building) aco;
List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject();
ADEComponent resultComp = gen.get(0);
ValidationResult result = (ValidationResult) resultComp;
assertEquals(ResultType.ERROR, result.getResult());
assertFalse(result.getErrors().isEmpty());
List<ValidationError> errors = result.getErrors();
ValidationError validationError = errors.get(0);
assertTrue(validationError instanceof MultipleConnectedComponents);
MultipleConnectedComponents err = (MultipleConnectedComponents) validationError;
assertEquals("_Simple_BD.1_Geom1", err.getGeometryId());
assertEquals("_Simple_BD.1_PG.1", err.getComponents().get(0).getPolygonIds().get(0));
assertEquals("_Simple_BD.1_PG.2", err.getComponents().get(0).getPolygonIds().get(1));
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 {
CityModel model = new CityModel();
Building b = new Building();
model.getCityObjectMember().add(new CityObjectMember(b));
ValidationResult result = new ValidationResult();
result.setResult(ResultType.ERROR);
b.addGenericApplicationPropertyOfCityObject(result);
AttributeMissing error = new AttributeMissing();
error.setAttributeName("TestName");
error.setChildId("TestId");
error.setGeneric(true);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
AttributeMissing error2 = (AttributeMissing) valError;
assertEquals(error.getAttributeName(), error2.getAttributeName());
assertEquals(error.getChildId(), error2.getChildId());
assertEquals(error.isGeneric(), error2.isGeneric());
}
@Test
void testWritingAttributeWrongValueError()
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException {
CityModel model = new CityModel();
Building b = new Building();
model.getCityObjectMember().add(new CityObjectMember(b));
ValidationResult result = new ValidationResult();
result.setResult(ResultType.ERROR);
b.addGenericApplicationPropertyOfCityObject(result);
AttributeWrongValue error = new AttributeWrongValue();
error.setAttributeName("TestName");
error.setChildId("TestId");
error.setGeneric(true);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
AttributeWrongValue error2 = (AttributeWrongValue) valError;
assertEquals(error.getAttributeName(), error2.getAttributeName());
assertEquals(error.getChildId(), error2.getChildId());
assertEquals(error.isGeneric(), error2.isGeneric());
} }
@Test @Test
void testWritingMultipleConnectedComponentsError() void testIntersectingRingsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
ValidationResult result = new ValidationResult();
result.setResult(ResultType.ERROR);
b.addGenericApplicationPropertyOfCityObject(result);
MultipleConnectedComponents error = new MultipleConnectedComponents();
error.setGeometryId("TestGeometry");
Component c1 = new Component();
c1.getPolygonIds().add("TestPoly");
error.getComponents().add(c1);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
MultipleConnectedComponents error2 = (MultipleConnectedComponents) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
assertEquals(error.getComponents().get(0).getPolygonIds().get(0),
error2.getComponents().get(0).getPolygonIds().get(0));
}
@Test IntersectingRingsError err = new IntersectingRingsError();
void testWritingTooFewPolygonsError() err.setLinearRingId1("ringId1");
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { err.setLinearRingId2("ringId2");
CityModel model = new CityModel(); err.setPolygonId("polyId");
Building b = new Building(); res.getErrors().add(new AbstractErrorProperty(err));
model.getCityObjectMember().add(new CityObjectMember(b));
ValidationResult result = new ValidationResult();
result.setResult(ResultType.ERROR);
b.addGenericApplicationPropertyOfCityObject(result);
TooFewPolygons error = new TooFewPolygons();
error.setGeometryId("TestGeometry");
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
TooFewPolygons error2 = (TooFewPolygons) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
}
@Test byte[] buf = writeModel(model);
void testWritingSolidNotClosedError() assertTrue(validate(new ByteArrayInputStream(buf)));
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException {
CityModel model = new CityModel();
Building b = new Building();
model.getCityObjectMember().add(new CityObjectMember(b));
ValidationResult result = new ValidationResult();
result.setResult(ResultType.ERROR);
b.addGenericApplicationPropertyOfCityObject(result);
SolidNotClosed error = new SolidNotClosed();
error.setGeometryId("TestGeometry");
DirectPosition from = new DirectPosition();
from.getValue().add(10.0);
DirectPosition to = new DirectPosition();
to.getValue().add(11.0);
Edge e = new Edge();
e.setFrom(from);
e.setTo(to);
error.getEdges().add(e);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
SolidNotClosed error2 = (SolidNotClosed) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
Edge edge = error.getEdges().get(0);
assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001);
assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001);
} }
@Test @Test
void testWritingNonManifoldEdgeError() void testMultipleComponentsError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
MultipleComponentsError err = new MultipleComponentsError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); PolygonIdList polygons = new PolygonIdList();
b.addGenericApplicationPropertyOfCityObject(result); polygons.getPolygonIds().add("test1");
NonManifoldEdge error = new NonManifoldEdge(); polygons.getPolygonIds().add("test2");
error.setGeometryId("TestGeometry"); err.getComponents().add(new PolygonIdListProperty(polygons));
DirectPosition from = new DirectPosition(); res.getErrors().add(new AbstractErrorProperty(err));
from.getValue().add(10.0);
DirectPosition to = new DirectPosition(); byte[] buf = writeModel(model);
to.getValue().add(11.0); assertTrue(validate(new ByteArrayInputStream(buf)));
Edge e = new Edge();
e.setFrom(from);
e.setTo(to);
error.getEdges().add(e);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
NonManifoldEdge error2 = (NonManifoldEdge) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
Edge edge = error.getEdges().get(0);
assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001);
assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001);
} }
@Test @Test
void testWritingNonManifoldVertexError() void testNonManifoldEdgeError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
NonManifoldEdgeError err = new NonManifoldEdgeError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); EdgeList edges = new EdgeList();
b.addGenericApplicationPropertyOfCityObject(result); Edge edge = new Edge();
NonManifoldVertex error = new NonManifoldVertex(); edge.setFrom(new DirectPosition(1, 2, 3));
error.setGeometryId("TestGeometry"); edge.setTo(new DirectPosition(5, 6, 7));
DirectPosition vertex = new DirectPosition(); edges.getEdges().add(new EdgeProperty(edge));
vertex.getValue().add(10.0); err.setEdges(new EdgeListProperty(edges));
error.setVertex(vertex);
result.getErrors().add(error); res.getErrors().add(new AbstractErrorProperty(err));
byte[] gml = writeCityGml(model); byte[] buf = writeModel(model);
model = readCityGml(gml); assertTrue(validate(new ByteArrayInputStream(buf)));
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
NonManifoldVertex error2 = (NonManifoldVertex) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
assertEquals(error.getVertex().getValue().get(0), error2.getVertex().getValue().get(0));
} }
@Test @Test
void testWritingPolygonWrongOrientationError() void testNonManifoldVertexError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
NonManifoldVertexError err = new NonManifoldVertexError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); err.setVertex(new DirectPosition(1, 2, 3));
b.addGenericApplicationPropertyOfCityObject(result); res.getErrors().add(new AbstractErrorProperty(err));
PolygonWrongOrientation error = new PolygonWrongOrientation();
error.setGeometryId("TestGeometry"); byte[] buf = writeModel(model);
DirectPosition from = new DirectPosition(); assertTrue(validate(new ByteArrayInputStream(buf)));
from.getValue().add(10.0);
DirectPosition to = new DirectPosition();
to.getValue().add(11.0);
Edge e = new Edge();
e.setFrom(from);
e.setTo(to);
error.getEdges().add(e);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
PolygonWrongOrientation error2 = (PolygonWrongOrientation) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
Edge edge = error.getEdges().get(0);
assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001);
assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001);
} }
@Test @Test
void testWritingAllPolygonsWrongOrientationError() void testOrientationRingsSameError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
OrientationRingsSameError err = new OrientationRingsSameError();
ValidationResult result = new ValidationResult(); err.setLinearRing("ring1");
result.setResult(ResultType.ERROR); err.setPolygonId("polyId");
b.addGenericApplicationPropertyOfCityObject(result); res.getErrors().add(new AbstractErrorProperty(err));
AllPolygonsWrongOrientation error = new AllPolygonsWrongOrientation();
error.setGeometryId("TestGeometry"); byte[] buf = writeModel(model);
result.getErrors().add(error); assertTrue(validate(new ByteArrayInputStream(buf)));
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
AllPolygonsWrongOrientation error2 = (AllPolygonsWrongOrientation) valError;
assertEquals(error.getGeometryId(), error2.getGeometryId());
} }
@Test @Test
void testWritingOrientationRingsSameError() void testPlanarDistancePlaneError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
PlanarDistancePlaneError err = new PlanarDistancePlaneError();
ValidationResult result = new ValidationResult(); err.setPolygonId("polyId");
result.setResult(ResultType.ERROR); err.setDistance(new Length(5d, "m"));
b.addGenericApplicationPropertyOfCityObject(result); err.setVertex(new DirectPosition(1, 2, 3));
OrientationRingsSame error = new OrientationRingsSame(); res.getErrors().add(new AbstractErrorProperty(err));
error.setPolygonId("TestPolygon");
error.setLinearRingId("TestRing"); byte[] buf = writeModel(model);
result.getErrors().add(error); assertTrue(validate(new ByteArrayInputStream(buf)));
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
OrientationRingsSame error2 = (OrientationRingsSame) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
} }
@Test @Test
void testWritingNonPlanarNormalsDeviationError() void testPlanarNormalsDeviationError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
PlanarNormalsDeviationError err = new PlanarNormalsDeviationError();
ValidationResult result = new ValidationResult(); err.setPolygonId("polyId");
result.setResult(ResultType.ERROR); err.setDeviation(new Angle(5d, "deg"));
b.addGenericApplicationPropertyOfCityObject(result); res.getErrors().add(new AbstractErrorProperty(err));
NonPlanarNormalsDeviation error = new NonPlanarNormalsDeviation();
error.setPolygonId("TestPolygon"); byte[] buf = writeModel(model);
Angle deviation = new Angle(); assertTrue(validate(new ByteArrayInputStream(buf)));
deviation.setValue(1.0);
deviation.setUom("deg");
error.setDeviation(deviation);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
NonPlanarNormalsDeviation error2 = (NonPlanarNormalsDeviation) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getDeviation().getValue(), error2.getDeviation().getValue());
assertEquals(error.getDeviation().getUom(), error2.getDeviation().getUom());
} }
@Test @Test
void testWritingHoleOutsideError() void testPolygonWrongOrientationError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
PolygonWrongOrientationError err = new PolygonWrongOrientationError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); EdgeList edges = new EdgeList();
b.addGenericApplicationPropertyOfCityObject(result); Edge edge = new Edge();
HoleOutside error = new HoleOutside(); edge.setFrom(new DirectPosition(1, 2, 3));
error.setPolygonId("TestPolygon"); edge.setTo(new DirectPosition(5, 6, 7));
error.setLinearRingId("TestRing1"); edges.getEdges().add(new EdgeProperty(edge));
result.getErrors().add(error); err.setEdges(new EdgeListProperty(edges));
res.getErrors().add(new AbstractErrorProperty(err));
byte[] gml = writeCityGml(model);
model = readCityGml(gml); byte[] buf = writeModel(model);
assertTrue(validate(new ByteArrayInputStream(buf)));
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
HoleOutside error2 = (HoleOutside) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
} }
@Test @Test
void testWritingInnerRingsNestedError() void testRingNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
RingNotClosedError err = new RingNotClosedError();
ValidationResult result = new ValidationResult(); err.setLinearRingId("ringId");
result.setResult(ResultType.ERROR); res.getErrors().add(new AbstractErrorProperty(err));
b.addGenericApplicationPropertyOfCityObject(result);
InnerRingsNested error = new InnerRingsNested(); byte[] buf = writeModel(model);
error.setPolygonId("TestPolygon"); assertTrue(validate(new ByteArrayInputStream(buf)));
error.setLinearRingId1("TestRing1");
error.setLinearRingId2("TestRing2");
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
InnerRingsNested error2 = (InnerRingsNested) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getLinearRingId1(), error2.getLinearRingId1());
assertEquals(error.getLinearRingId2(), error2.getLinearRingId2());
} }
@Test @Test
void testWritingNonPlanarDistancePlaneError() void testRingSelfIntersectionError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
RingSelfIntersectionError err = new RingSelfIntersectionError();
ValidationResult result = new ValidationResult(); err.setLinearRingId("ringId");
result.setResult(ResultType.ERROR); Edge edge = new Edge();
b.addGenericApplicationPropertyOfCityObject(result); edge.setFrom(new DirectPosition(1, 2, 3));
NonPlanarDistancePlane error = new NonPlanarDistancePlane(); edge.setTo(new DirectPosition(5, 6, 7));
error.setPolygonId("TestPolygon"); err.setEdge1(new EdgeProperty(edge));
DirectPosition vertex = new DirectPosition(); err.setEdge2(new EdgeProperty(edge));
vertex.getValue().add(1.0); err.setType(RingSelfIntType.EDGE_INTERSECTION);
error.setVertex(vertex); err.setVertex1(new DirectPosition(1, 2, 3));
Length distance = new Length(0.1); res.getErrors().add(new AbstractErrorProperty(err));
distance.setUom("m");
error.setDistance(distance); byte[] buf = writeModel(model);
result.getErrors().add(error); assertTrue(validate(new ByteArrayInputStream(buf)));
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
NonPlanarDistancePlane error2 = (NonPlanarDistancePlane) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getVertex().getValue().get(0), error2.getVertex().getValue().get(0), 0.00001);
assertEquals(error.getDistance().getValue(), error2.getDistance().getValue(), 0.00001);
} }
@Test @Test
void testWritingIntersectingRingsError() void testRingSelfIntersectionErrorDegenerateRing() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
RingSelfIntersectionError err = new RingSelfIntersectionError();
ValidationResult result = new ValidationResult(); err.setLinearRingId("ringId");
result.setResult(ResultType.ERROR); err.setType(RingSelfIntType.DEGENERATED_RING);
b.addGenericApplicationPropertyOfCityObject(result); err.setVertex1(new DirectPosition(1, 2, 3));
IntersectingRings error = new IntersectingRings(); res.getErrors().add(new AbstractErrorProperty(err));
error.setPolygonId("TestPolygon");
error.setLinearRingId1("TestRing1"); byte[] buf = writeModel(model);
error.setLinearRingId2("TestRing2"); assertTrue(validate(new ByteArrayInputStream(buf)));
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
IntersectingRings error2 = (IntersectingRings) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
assertEquals(error.getLinearRingId1(), error2.getLinearRingId1());
assertEquals(error.getLinearRingId2(), error2.getLinearRingId2());
} }
@Test @Test
void testWritingInteriorDisconnectedError() void testRingTooFewPointsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
RingTooFewPointsError err = new RingTooFewPointsError();
ValidationResult result = new ValidationResult(); err.setLinearRingId("ringId");
result.setResult(ResultType.ERROR); res.getErrors().add(new AbstractErrorProperty(err));
b.addGenericApplicationPropertyOfCityObject(result);
InteriorDisconnected error = new InteriorDisconnected(); byte[] buf = writeModel(model);
error.setPolygonId("TestPolygon"); assertTrue(validate(new ByteArrayInputStream(buf)));
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
InteriorDisconnected error2 = (InteriorDisconnected) valError;
assertEquals(error.getPolygonId(), error2.getPolygonId());
} }
@Test @Test
void testWritingRingNotClosedError() void testSemanticAttributeMissingError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
SemanticAttributeMissingError err = new SemanticAttributeMissingError();
ValidationResult result = new ValidationResult(); err.setAttributeName("attribute");
result.setResult(ResultType.ERROR); err.setChildId("child");
b.addGenericApplicationPropertyOfCityObject(result); err.setGeneric(true);
RingNotClosed error = new RingNotClosed(); res.getErrors().add(new AbstractErrorProperty(err));
error.setLinearRingId("TestRing");
result.getErrors().add(error); byte[] buf = writeModel(model);
assertTrue(validate(new ByteArrayInputStream(buf)));
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
RingNotClosed error2 = (RingNotClosed) valError;
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
} }
@Test @Test
void testWritingTooFewPointsError() void testSemanticAttributeWrongValueError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
SemanticAttributeWrongValueError err = new SemanticAttributeWrongValueError();
ValidationResult result = new ValidationResult(); err.setAttributeName("attribute");
result.setResult(ResultType.ERROR); err.setChildId("child");
b.addGenericApplicationPropertyOfCityObject(result); err.setGeneric(true);
TooFewPoints error = new TooFewPoints(); res.getErrors().add(new AbstractErrorProperty(err));
error.setLinearRingId("TestRing");
result.getErrors().add(error); byte[] buf = writeModel(model);
assertTrue(validate(new ByteArrayInputStream(buf)));
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
TooFewPoints error2 = (TooFewPoints) valError;
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
} }
@Test @Test
void testWritingConsecutiveSameError() void testSolidNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
SolidNotClosedError err = new SolidNotClosedError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); EdgeList edges = new EdgeList();
b.addGenericApplicationPropertyOfCityObject(result); Edge edge = new Edge();
edge.setFrom(new DirectPosition(1, 2, 3));
ConsecutivePointsSame error = new ConsecutivePointsSame(); edge.setTo(new DirectPosition(5, 6, 7));
error.setLinearRingId("TestRing"); edges.getEdges().add(new EdgeProperty(edge));
DirectPosition vertex1 = new DirectPosition(); err.setEdges(new EdgeListProperty(edges));
vertex1.getValue().add(10.0); res.getErrors().add(new AbstractErrorProperty(err));
vertex1.getValue().add(5.0);
vertex1.getValue().add(7.0); byte[] buf = writeModel(model);
error.setVertex1(vertex1); assertTrue(validate(new ByteArrayInputStream(buf)));
DirectPosition vertex2 = new DirectPosition();
vertex2.getValue().add(15.0);
vertex2.getValue().add(55.0);
vertex2.getValue().add(71.0);
error.setVertex2(vertex2);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
ConsecutivePointsSame error2 = (ConsecutivePointsSame) valError;
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
assertEquals(error.getVertex1().getValue().get(0), error2.getVertex1().getValue().get(0));
assertEquals(error.getVertex2().getValue().get(0), error2.getVertex2().getValue().get(0));
} }
@Test @Test
void testWritingRingSelfIntersection() void testSolidSelfIntersectionError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Building b = new Building(); ValidationResult res = fillCityModel(model);
model.getCityObjectMember().add(new CityObjectMember(b));
SolidSelfIntersectionError err = new SolidSelfIntersectionError();
ValidationResult result = new ValidationResult(); err.setGeometryId("geomId");
result.setResult(ResultType.ERROR); err.setPolygonId1("poly1");
b.addGenericApplicationPropertyOfCityObject(result); err.setPolygonId2("poly2");
res.getErrors().add(new AbstractErrorProperty(err));
RingSelfIntersection error = new RingSelfIntersection();
error.setType(RingSelfIntType.DUPLICATE_POINT); byte[] buf = writeModel(model);
error.setLinearRingId("TestRing"); assertTrue(validate(new ByteArrayInputStream(buf)));
DirectPosition vertex1 = new DirectPosition();
vertex1.getValue().add(10.0);
vertex1.getValue().add(5.0);
vertex1.getValue().add(7.0);
error.setVertex1(vertex1);
DirectPosition vertex2 = new DirectPosition();
vertex2.getValue().add(15.0);
vertex2.getValue().add(55.0);
vertex2.getValue().add(71.0);
error.setVertex2(vertex2);
result.getErrors().add(error);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject();
List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject();
ADEComponent adeComponent = ades.get(0);
ValidationResult valRes = (ValidationResult) adeComponent;
assertEquals(ResultType.ERROR, valRes.getResult());
ValidationError valError = valRes.getErrors().get(0);
RingSelfIntersection error2 = (RingSelfIntersection) valError;
assertEquals(error.getLinearRingId(), error2.getLinearRingId());
assertEquals(error.getVertex1().getValue().get(0), error2.getVertex1().getValue().get(0));
assertEquals(error.getVertex2().getValue().get(0), error2.getVertex2().getValue().get(0));
} }
@Test @Test
void testWritingValidationPlan() void testSolidTooFewPolygonsError() throws ADEException, CityGMLContextException, CityGMLWriteException,
throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { SAXException, IOException, SchemaHandlerException {
CityModel model = new CityModel(); CityModel model = new CityModel();
Validation val = new Validation(); ValidationResult res = fillCityModel(model);
model.addGenericApplicationPropertyOfCityModel(val);
ZonedDateTime expectedDate = LocalDateTime.of(2002, 5, 30, 9, 0).atZone(ZoneId.systemDefault()); SolidTooFewPolygonsError err = new SolidTooFewPolygonsError();
err.setGeometryId("geomId");
res.getErrors().add(new AbstractErrorProperty(err));
val.setValidationDate(expectedDate); byte[] buf = writeModel(model);
val.setValidationSoftware("CityDoctor2"); assertTrue(validate(new ByteArrayInputStream(buf)));
ValidationPlan plan = new ValidationPlan();
val.setValidationPlan(plan);
Parameter roundingParameter = new Parameter();
roundingParameter.setName("numberOfRoundingPlaces");
roundingParameter.setValue("8");
plan.getGlobalParameters().add(roundingParameter);
Parameter minVertexDistance = new Parameter();
minVertexDistance.setName("minVertexDistance");
minVertexDistance.setValue("0.0001");
minVertexDistance.setUom("m");
plan.getGlobalParameters().add(minVertexDistance);
Requirement rTooFewPoints = new Requirement();
rTooFewPoints.setEnabled(true);
rTooFewPoints.setName(RequirementId.R_GE_R_TOO_FEW_POINTS);
plan.getRequirements().add(rTooFewPoints);
Checking buildingChecking = new Checking();
buildingChecking.setValue(TopLevelFeatureType.BUILDING);
plan.getFilter().add(buildingChecking);
Statistics statistics = new Statistics();
val.setStatistics(statistics);
FeatureStatistics numErrorBridgeObjects = new FeatureStatistics();
numErrorBridgeObjects.setNumChecked(0);
numErrorBridgeObjects.setNumErrors(0);
statistics.setNumErrorBridgeObjects(numErrorBridgeObjects);
FeatureStatistics numErrorBuildings = new FeatureStatistics();
numErrorBuildings.setNumChecked(1);
numErrorBuildings.setNumErrors(1);
statistics.setNumErrorBuildings(numErrorBuildings);
FeatureStatistics numErrors = new FeatureStatistics();
statistics.setNumErrorLandObjects(numErrors);
statistics.setNumErrorTransportation(numErrors);
statistics.setNumErrorVegetation(numErrors);
statistics.setNumErrorWaterObjects(numErrors);
ErrorStatistics stats1 = new ErrorStatistics();
stats1.setAmount(1);
stats1.setName(ErrorId.GE_R_CONSECUTIVE_POINTS_SAME);
statistics.getErrorStatistics().add(stats1);
byte[] gml = writeCityGml(model);
model = readCityGml(gml);
testValidationPlan(model);
} }
private CityModel readCityGml(InputStream input) private boolean validate(InputStream stream)
throws ADEException, CityGMLBuilderException, CityGMLReadException { throws SAXException, IOException, CityGMLContextException, SchemaHandlerException {
CityGMLContext context = CityGMLContext.getInstance();
List<ADEContext> adeContexts = context.getADEContexts(); CityGMLContext context = CityGMLContext.newInstance();
if (adeContexts.isEmpty()) {
for (ADEContext adeContext : ServiceLoader.load(ADEContext.class)) { CityGMLSchemaHandler schemaHandler = context.getDefaultSchemaHandler();
context.registerADEContext(adeContext); Source[] schemas = schemaHandler.getSchemas();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemas);
Validator validator = schema.newValidator();
boolean[] foundErrors = new boolean[1];
foundErrors[0] = false;
validator.setErrorHandler(new ErrorHandler() {
@Override
public void error(SAXParseException exception) {
String message = "[" + exception.getLineNumber() + ", " + exception.getColumnNumber() + "] "
+ exception.getMessage();
System.out.println(message);
foundErrors[0] = true;
} }
}
CityGMLBuilder builder = context.createCityGMLBuilder(); @Override
CityGMLInputFactory in = builder.createCityGMLInputFactory(); public void warning(SAXParseException exception) {
in.setProperty(CityGMLInputFactory.USE_VALIDATION, true); error(exception);
in.setProperty(CityGMLInputFactory.FEATURE_READ_MODE, FeatureReadMode.NO_SPLIT); }
in.setValidationEventHandler(event -> {
System.out.print( @Override
"[" + event.getLocator().getLineNumber() + "," + event.getLocator().getColumnNumber() + "] "); public void fatalError(SAXParseException exception) {
System.out.println(event.getMessage()); error(exception);
throw new IllegalStateException(event.getLinkedException()); }
}); });
CityModel cityModel;
try (CityGMLReader reader = in.createCityGMLReader("?", input)) {
cityModel = (CityModel) reader.nextFeature();
}
return cityModel;
}
private CityModel readCityGml(File f) validator.validate(new StreamSource(stream));
throws FileNotFoundException, ADEException, CityGMLBuilderException, CityGMLReadException { return !foundErrors[0];
return readCityGml(new FileInputStream(f));
} }
private CityModel readCityGml(String fileName) private byte[] writeModel(CityModel model) throws ADEException, CityGMLContextException, CityGMLWriteException {
throws FileNotFoundException, ADEException, CityGMLBuilderException, CityGMLReadException {
return readCityGml(new File(fileName));
}
private CityModel readCityGml(byte[] bytes) throws ADEException, CityGMLBuilderException, CityGMLReadException { CityGMLContext context = CityGMLContext.newInstance();
return readCityGml(new ByteArrayInputStream(bytes)); CityGMLVersion version = CityGMLVersion.v2_0;
CityGMLOutputFactory out = context.createCityGMLOutputFactory(version);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
try (CityGMLWriter writer = out.createCityGMLWriter(outStream, StandardCharsets.UTF_8.name())) {
writer.withIndent(" ")
.withSchemaLocation(QualityADEModule.NAMESPACE_URI,
getClass().getResource("/qualityAde.xsd").toString())
.withDefaultPrefixes().withDefaultNamespace(CoreModule.of(version).getNamespaceURI()).write(model);
}
return outStream.toByteArray();
} }
private void testValidationPlan(CityModel cityModel) { private ValidationResult fillCityModel(CityModel model) {
assertFalse(cityModel.getGenericApplicationPropertyOfCityModel().isEmpty()); Validation v = new Validation();
List<ADEComponent> ades = cityModel.getGenericApplicationPropertyOfCityModel(); v.setId("planId");
ADEComponent adeComponent = ades.get(0); model.getFeatureMembers().add(new AbstractFeatureProperty(v));
assertTrue(adeComponent instanceof Validation); v.setValidationSoftware("testSoftware");
Validation val = (Validation) adeComponent; v.setValidationDate(ZonedDateTime.now());
ZonedDateTime expectedDate = LocalDateTime.of(2002, 5, 30, 9, 0).atZone(ZoneId.systemDefault()); ValidationPlan plan = new ValidationPlan();
assertTrue(expectedDate.isEqual(val.getValidationDate()));
assertEquals("CityDoctor2", val.getValidationSoftware());
assertNotNull(val.getValidationPlan());
ValidationPlan plan = val.getValidationPlan();
assertNotNull(plan.getGlobalParameters());
assertFalse(plan.getGlobalParameters().isEmpty());
List<Parameter> globalParameters = plan.getGlobalParameters();
Parameter roundingParameter = globalParameters.get(0);
assertEquals("numberOfRoundingPlaces", roundingParameter.getName());
assertEquals("8", roundingParameter.getValue());
assertNull(roundingParameter.getUom());
Parameter minVertexDistance = globalParameters.get(1);
assertEquals("minVertexDistance", minVertexDistance.getName());
assertEquals("0.0001", minVertexDistance.getValue());
assertEquals("m", minVertexDistance.getUom());
assertNotNull(plan.getRequirements());
assertFalse(plan.getRequirements().isEmpty());
List<Requirement> requirements = plan.getRequirements();
Requirement rTooFewPoints = requirements.get(0);
assertEquals(RequirementId.R_GE_R_TOO_FEW_POINTS, rTooFewPoints.getName());
assertTrue(rTooFewPoints.isEnabled());
assertNotNull(plan.getFilter());
assertFalse(plan.getFilter().isEmpty());
List<Checking> filter = plan.getFilter();
Checking buildingChecking = filter.get(0);
assertEquals(TopLevelFeatureType.BUILDING, buildingChecking.getValue());
Statistics statistics = val.getStatistics();
assertNotNull(statistics);
FeatureStatistics numErrorBridgeObjects = statistics.getNumErrorBridgeObjects();
assertNotNull(numErrorBridgeObjects);
assertEquals(0, numErrorBridgeObjects.getNumChecked());
assertEquals(0, numErrorBridgeObjects.getNumErrors());
FeatureStatistics numErrorBuildings = statistics.getNumErrorBuildings();
assertEquals(1, numErrorBuildings.getNumChecked());
assertEquals(1, numErrorBuildings.getNumErrors());
List<ErrorStatistics> errorStatistics = statistics.getErrorStatistics();
assertNotNull(errorStatistics);
assertFalse(errorStatistics.isEmpty());
ErrorStatistics stats1 = errorStatistics.get(0);
assertEquals(ErrorId.GE_R_CONSECUTIVE_POINTS_SAME, stats1.getName());
assertEquals(1, stats1.getAmount());
}
private byte[] writeCityGml(CityModel model) throws ADEException, CityGMLBuilderException, CityGMLWriteException { Statistics stats = new Statistics();
CityGMLContext context = CityGMLContext.getInstance(); FeatureStatistics fStats = new FeatureStatistics();
List<ADEContext> adeContexts = context.getADEContexts(); fStats.setNumChecked(5);
if (adeContexts == null || adeContexts.isEmpty()) { fStats.setNumErrors(2);
for (ADEContext adeContext : ServiceLoader.load(ADEContext.class)) { stats.setNumErrorBridgeObjects(new FeatureStatisticsProperty(fStats));
context.registerADEContext(adeContext); v.setStatistics(new StatisticsProperty(stats));
}
} de.hft.stuttgart.quality.model.types.Error err = new de.hft.stuttgart.quality.model.types.Error();
err.setName(ErrorId.GE_P_HOLE_OUTSIDE);
err.setOccurrences(1);
stats.getErrors().add(new ErrorProperty(err));
Requirement req = new Requirement();
req.setEnabled(true);
req.setRequirementType(RequirementId.R_GE_P_HOLE_OUTSIDE);
plan.getRequirements().add(new RequirementProperty(req));
Checking checking = new Checking();
checking.setFeatureType(TopLevelFeatureType.BRIDGE);
Filter filter = new Filter();
filter.getChecking().add(new CheckingProperty(checking));
plan.setFilter(new FilterProperty(filter));
Parameter param = new Parameter();
param.setName("test");
param.setUom("uom");
param.setValue("5");
GlobalParameters globalParams = new GlobalParameters();
globalParams.getParameters().add(new ParameterProperty(param));
plan.setGlobalParameters(new GlobalParametersProperty(globalParams));
v.setValidationPlan(new ValidationPlanProperty(plan));
CityGMLBuilder builder = context.createCityGMLBuilder(); Building b = new Building();
b.setId("testId");
CityGMLOutputFactory outputFactory = builder.createCityGMLOutputFactory(CityGMLVersion.DEFAULT); model.getCityObjectMembers().add(new AbstractCityObjectProperty(b));
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (CityGMLWriter writer = outputFactory.createCityGMLWriter(out)) {
writer.setIndentString(" ");
writer.setPrefixes(CityGMLVersion.DEFAULT);
writer.setPrefix("qual", QualityADEModule.NAMESPACE_URI);
writer.setSchemaLocation(QualityADEModule.NAMESPACE_URI,
QualityADEModule.NAMESPACE_URI + "/qualityAde.xsd");
writer.setSchemaLocations(CityGMLVersion.DEFAULT);
writer.write(model);
return out.toByteArray();
}
}
CityObjectProperties props = new CityObjectProperties();
b.addADEProperty(props);
ValidationResult res = new ValidationResult();
props.setValidationResult(new ValidationResultProperty(res));
res.setResultType(ResultType.ERROR);
res.setValidationPlanID(new Reference(v));
return res;
}
} }
<?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"?> <?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
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), referenziert CityGML 2.0 linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind.
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert 10.5.2017 Author: V. Coors, HFT Stuttgart Lizenz: -->
CityGML 2.0 <gml:name>Building-Unit-House</gml:name>
<gml:boundedBy>
<gml:Envelope srsDimension="3" srsName="urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH">
linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. <gml:lowerCorner srsDimension="3">457841 5439082 111 </gml:lowerCorner>
<gml:upperCorner srsDimension="3">457854 5439093 121 </gml:upperCorner>
10.5.2017 </gml:Envelope>
Author: V. Coors, HFT Stuttgart </gml:boundedBy>
Lizenz:
-->
<core:cityObjectMember> <core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1"> <bldg:Building gml:id="_Simple_BD.1">
<qual:validationResult result="ERROR"> <qual:validationResult>
<qual:GE_R_CONSECUTIVE_POINTS_SAME> <qual:ValidationResult>
<qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId> <qual:validationPlanID xlink:href="#idvalue0" />
<qual:vertex1>11.5 10.0 4.5</qual:vertex1> <qual:error>
<qual:vertex2>11.5 10.0 4.5</qual:vertex2> <qual:GE_R_CONSECUTIVE_POINTS_SAME>
</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>ERROR</qual:resultType>
</qual:ValidationResult>
</qual:validationResult> </qual:validationResult>
<bldg:lod2Solid> <bldg:lod2Solid>
<gml:Solid> <gml:Solid>
<gml:exterior> <gml:exterior>
<gml:CompositeSurface> <gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> <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.2" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> <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.4" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> <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.6" />
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7" />
</gml:CompositeSurface> </gml:CompositeSurface>
</gml:exterior> </gml:exterior>
</gml:Solid> </gml:Solid>
...@@ -77,7 +87,8 @@ Lizenz: ...@@ -77,7 +87,8 @@ Lizenz:
11.5 15.0 4.5 11.5 15.0 4.5
13.0 15.0 3.0 13.0 15.0 3.0
13.0 15.0 0.0 13.0 15.0 0.0
10.0 15.0 0.0 10.0
15.0 0.0
</gml:posList> </gml:posList>
</gml:LinearRing> </gml:LinearRing>
</gml:exterior> </gml:exterior>
...@@ -124,7 +135,8 @@ Lizenz: ...@@ -124,7 +135,8 @@ Lizenz:
11.5 10.0 4.5 11.5 10.0 4.5
10.0 10.0 3.0 10.0 10.0 3.0
10.0 10.0 0.0 10.0 10.0 0.0
13.0 10.0 0.0 13.0
10.0 0.0
</gml:posList> </gml:posList>
</gml:LinearRing> </gml:LinearRing>
</gml:exterior> </gml:exterior>
...@@ -148,8 +160,9 @@ Lizenz: ...@@ -148,8 +160,9 @@ Lizenz:
11.5 10.0 4.5 11.5 10.0 4.5
11.5 15.0 4.5 11.5 15.0 4.5
10.0 15.0 3.0 10.0 15.0 3.0
10.0 10.0 3.0 10.0
10.0 3.0
</gml:posList> </gml:posList>
</gml:LinearRing> </gml:LinearRing>
</gml:exterior> </gml:exterior>
...@@ -199,59 +212,245 @@ Lizenz: ...@@ -199,59 +212,245 @@ Lizenz:
</bldg:boundedBy> </bldg:boundedBy>
</bldg:Building> </bldg:Building>
</core:cityObjectMember> </core:cityObjectMember>
<qual:validation> <core:cityObjectMember>
<qual:validationDate>2002-05-30T09:00:00</qual:validationDate> <qual:Validation gml:id="idvalue0">
<qual:validationSoftware>CityDoctor2</qual:validationSoftware> <qual:validationDate>2002-05-30T09:00:00</qual:validationDate>
<qual:validationPlan> <qual:validationSoftware>CityDoctor2</qual:validationSoftware>
<qual:globalParameters> <qual:statistics>
<qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> <qual:Statistics>
<qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> <qual:numErrorBuildings>
<qual:parameter name="schematronFile"></qual:parameter> <qual:FeatureStatistics>
</qual:globalParameters> <qual:numChecked>1</qual:numChecked>
<qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> <qual:numErrors>1</qual:numErrors>
<qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> </qual:FeatureStatistics>
<qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> </qual:numErrorBuildings>
<qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> <qual:numErrorVegetation>
<qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> <qual:FeatureStatistics>
<qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> <qual:numChecked>0</qual:numChecked>
<qual:parameter name="type">distance</qual:parameter> <qual:numErrors>0</qual:numErrors>
<qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> </qual:FeatureStatistics>
<qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> </qual:numErrorVegetation>
<qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> <qual:numErrorLandObjects>
</qual:requirement> <qual:FeatureStatistics>
<qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> <qual:numChecked>0</qual:numChecked>
<qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> <qual:numErrors>0</qual:numErrors>
<qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> </qual:FeatureStatistics>
<qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> </qual:numErrorLandObjects>
<qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> <qual:numErrorBridgeObjects>
<qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> <qual:FeatureStatistics>
<qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> <qual:numChecked>0</qual:numChecked>
<qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> <qual:numErrors>0</qual:numErrors>
<qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> </qual:FeatureStatistics>
<qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> </qual:numErrorBridgeObjects>
<qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> <qual:numErrorWaterObjects>
<qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> <qual:FeatureStatistics>
<qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> <qual:numChecked>0</qual:numChecked>
<qual:numErrors>0</qual:numErrors>
<qual:filter> </qual:FeatureStatistics>
<qual:checking>BUILDING</qual:checking> </qual:numErrorWaterObjects>
<qual:checking>TRANSPORTATION</qual:checking> <qual:numErrorTransportation>
<qual:checking>VEGETATION</qual:checking> <qual:FeatureStatistics>
<qual:checking>BRIDGE</qual:checking> <qual:numChecked>0</qual:numChecked>
<qual:checking>WATER</qual:checking> <qual:numErrors>0</qual:numErrors>
<qual:checking>LAND</qual:checking> </qual:FeatureStatistics>
</qual:filter> </qual:numErrorTransportation>
</qual:validationPlan> <qual:error>
<qual:statistics> <qual:Error>
<qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> <qual:occurrences>1</qual:occurrences>
<qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> <qual:name>GE_R_CONSECUTIVE_POINTS_SAME</qual:name>
<qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> </qual:Error>
<qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> </qual:error>
<qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> </qual:Statistics>
<qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> </qual:statistics>
<qual:errorStatistics> <qual:validationPlan>
<qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> <qual:ValidationPlan>
</qual:errorStatistics> <qual:globalParameters>
</qual:statistics> <qual:GlobalParameters>
</qual:validation> <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> </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
<?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_INNER_RINGS_NESTED>
<qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId>
<qual:linearRingId1>_Simple_BD.1_PG.1_Ring1</qual:linearRingId1>
<qual:linearRingId2>_Simple_BD.1_PG.1_Ring2</qual:linearRingId2>
</qual:GE_P_INNER_RINGS_NESTED>
</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
<?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_INTERIOR_DISCONNECTED>
<qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId>
</qual:GE_P_INTERIOR_DISCONNECTED>
</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
<?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_INTERSECTING_RINGS>
<qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId>
<qual:linearRingId1>_Simple_BD.1_PG.1_Ring1</qual:linearRingId1>
<qual:linearRingId2>_Simple_BD.1_PG.1_Ring2</qual:linearRingId2>
</qual:GE_P_INTERSECTING_RINGS>
</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
<?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_MULTIPLE_CONNECTED_COMPONENTS>
<qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId>
<qual:components>
<qual:component>
<qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId>
<qual:polygonId>_Simple_BD.1_PG.2</qual:polygonId>
</qual:component>
<qual:component>
<qual:polygonId>_Simple_BD.1_PG.3</qual:polygonId>
<qual:polygonId>_Simple_BD.1_PG.4</qual:polygonId>
</qual:component>
</qual:components>
</qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS>
</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_S_NON_MANIFOLD_EDGE>
<qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId>
<qual:edges>
<qual:edge>
<qual:from>10.0 1.0 2.0</qual:from>
<qual:to>11.0 2.0 3.0</qual:to>
</qual:edge>
</qual:edges>
</qual:GE_S_NON_MANIFOLD_EDGE>
</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_S_NON_MANIFOLD_VERTEX>
<qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId>
<qual:vertex>1.0 2.0 3.0</qual:vertex>
</qual:GE_S_NON_MANIFOLD_VERTEX>
</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
Supports Markdown
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