diff --git a/citygml4j-quality-ade/pom.xml b/citygml4j-quality-ade/pom.xml index 64d79092065b2c0a02aa9e5270cfc85f8c581c80..6908ae16ed1c4c75fc149d4683478b67ea0003f2 100644 --- a/citygml4j-quality-ade/pom.xml +++ b/citygml4j-quality-ade/pom.xml @@ -4,7 +4,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>de.hft.stuttgart</groupId> <artifactId>citygml4j-quality-ade</artifactId> - <version>3.1.4</version> + <version>3.2.0</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java index f7b70bafdee1cdcfd3fc884b474a5a17b5061716..ac59d435940c27ba80bb8f534029f6c8d788ce26 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java @@ -25,7 +25,7 @@ import org.citygml4j.xml.module.ade.ADEModule; public class QualityADEContext implements CityGMLADE { - private final List<ADEModule> modules = Collections.singletonList(QualityADEModule.V0_1_4); + private final List<ADEModule> modules = Collections.singletonList(QualityADEModule.V1_0_0); @Override public List<ADEModule> getADEModules() { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java index 58d389b7ca2d5da3a12d71cf1dc4f88d266737f2..c76a18cf8e823c3e10d8e48da39669033d841478 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java @@ -22,9 +22,9 @@ import org.citygml4j.xml.module.ade.ADEModule; public class QualityADEModule extends ADEModule { - public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4"; + public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0"; - public static final QualityADEModule V0_1_4 = new QualityADEModule(); + public static final QualityADEModule V1_0_0 = new QualityADEModule(); public QualityADEModule() { super(NAMESPACE_URI, "qual", CityGMLVersion.v2_0); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..fe13e0190afdec1784f9bab8110d182351f1fc32 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java @@ -0,0 +1,79 @@ +/*- + * Copyright 2023 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.adapter.types; + +import javax.xml.namespace.QName; + +import org.xmlobjects.annotation.XMLElement; +import org.xmlobjects.builder.ObjectBuildException; +import org.xmlobjects.serializer.ObjectSerializeException; +import org.xmlobjects.stream.XMLReadException; +import org.xmlobjects.stream.XMLReader; +import org.xmlobjects.stream.XMLWriteException; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError; + +@XMLElement(name = "SE_ATTRIBUTE_INVALID", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SemanticAttributeInvalidErrorAdapter extends AbstractSemanticErrorAdapter<SemanticAttributeInvalidError> { + + @Override + public SemanticAttributeInvalidError createObject(QName name, Object parent) throws ObjectBuildException { + return new SemanticAttributeInvalidError(); + } + + @Override + public void buildChildObject(SemanticAttributeInvalidError object, QName name, Attributes attributes, + XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "childId": + reader.getTextContent().ifPresent(object::setChildId); + break; + case "attributeName": + reader.getTextContent().ifPresent(object::setAttributeName); + break; + default: + throw new IllegalStateException( + "Cannot handle name " + name + " when building SemanticAttributeInvalidError element"); + } + } + + @Override + public Element createElement(SemanticAttributeInvalidError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "SE_ATTRIBUTE_INVALID"); + } + + @Override + public void writeChildElements(SemanticAttributeInvalidError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getChildId() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "childId").addTextContent(object.getChildId())); + } + if (object.getAttributeName() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") + .addTextContent(object.getAttributeName())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java index c47bcfc846a218138eca1d49167300601ee0605f..4763591786d96c51c4595c27eac5f4a7486acb49 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java @@ -37,9 +37,6 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA case "attributeName": reader.getTextContent().ifPresent(object::setAttributeName); break; - case "generic": - reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); - break; default: throw new IllegalStateException( "Cannot handle name " + name + " when building SemanticAttributeMissingError element"); @@ -63,7 +60,5 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") .addTextContent(object.getAttributeName())); } - writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic") - .addTextContent(Boolean.toString(object.isGeneric()))); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java index 923bf5edbb65d828bd2c12954f9b4869441f8ef5..60c118f19b13fe15035523ae3ffd312961d0545e 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java @@ -38,9 +38,6 @@ public class SemanticAttributeWrongValueErrorAdapter case "attributeName": reader.getTextContent().ifPresent(object::setAttributeName); break; - case "generic": - reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); - break; default: throw new IllegalStateException( "Cannot handle name " + name + " when building SemanticAttributeWrongValueError element"); @@ -65,7 +62,5 @@ public class SemanticAttributeWrongValueErrorAdapter writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") .addTextContent(object.getAttributeName())); } - writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic") - .addTextContent(Boolean.toString(object.isGeneric()))); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java index bd347f05475f03db9ca84a70e40a5c87afca47e1..3d0f27a89afd8ab0e2b74670979f1be2c9ccabd9 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java @@ -5,6 +5,7 @@ import javax.xml.namespace.QName; import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter; import org.xmlobjects.annotation.XMLElement; import org.xmlobjects.builder.ObjectBuildException; +import org.xmlobjects.gml.adapter.base.ReferenceAdapter; import org.xmlobjects.serializer.ObjectSerializeException; import org.xmlobjects.stream.XMLReadException; import org.xmlobjects.stream.XMLReader; @@ -16,7 +17,6 @@ import org.xmlobjects.xml.Namespaces; import de.hft.stuttgart.quality.QualityADEModule; import de.hft.stuttgart.quality.adapter.properties.StatisticsPropertyAdapter; -import de.hft.stuttgart.quality.adapter.properties.ValidationPlanPropertyAdapter; import de.hft.stuttgart.quality.model.types.Validation; @XMLElement(name = "Validation", namespaceURI = QualityADEModule.NAMESPACE_URI) @@ -45,8 +45,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter<Validation> { case "statistics": object.setStatistics(reader.getObjectUsingBuilder(StatisticsPropertyAdapter.class)); break; - case "validationPlan": - object.setValidationPlan(reader.getObjectUsingBuilder(ValidationPlanPropertyAdapter.class)); + case "validationPlanID": + object.setValidationPlan(reader.getObjectUsingBuilder(ReferenceAdapter.class)); break; default: super.buildChildObject(object, name, attributes, reader); @@ -75,8 +75,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter<Validation> { object.getStatistics(), StatisticsPropertyAdapter.class, namespaces); } if (object.getValidationPlan() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlan"), - object.getValidationPlan(), ValidationPlanPropertyAdapter.class, namespaces); + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"), + object.getValidationPlan(), ReferenceAdapter.class, namespaces); } } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java index b84f85e2098255b7861addfdc353033d8d51ac2e..f278afff99999c912a1db439a5fe19f79952ce79 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java @@ -2,11 +2,10 @@ package de.hft.stuttgart.quality.adapter.types; import javax.xml.namespace.QName; +import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter; import org.xmlobjects.annotation.XMLElement; import org.xmlobjects.builder.ObjectBuildException; -import org.xmlobjects.builder.ObjectBuilder; import org.xmlobjects.serializer.ObjectSerializeException; -import org.xmlobjects.serializer.ObjectSerializer; import org.xmlobjects.stream.XMLReadException; import org.xmlobjects.stream.XMLReader; import org.xmlobjects.stream.XMLWriteException; @@ -23,7 +22,7 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty; import de.hft.stuttgart.quality.model.types.ValidationPlan; @XMLElement(name = "ValidationPlan", namespaceURI = QualityADEModule.NAMESPACE_URI) -public class ValidationPlanAdapter implements ObjectBuilder<ValidationPlan>, ObjectSerializer<ValidationPlan> { +public class ValidationPlanAdapter extends AbstractFeatureAdapter<ValidationPlan> { @Override public ValidationPlan createObject(QName name, Object parent) throws ObjectBuildException { @@ -47,7 +46,7 @@ public class ValidationPlanAdapter implements ObjectBuilder<ValidationPlan>, Obj object.getRequirements().add(reader.getObjectUsingBuilder(RequirementPropertyAdapter.class)); break; default: - throw new IllegalStateException("Cannot handle name " + name + " when building ValidationPlan element"); + super.buildChildObject(object, name, attributes, reader); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java index 6e65ca926bf906a48ce5cfd43970542deb35b314..1904cd8d2ce0b7c0d59c82f1168727eabffa16d2 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java @@ -37,8 +37,8 @@ public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>, return; } switch (name.getLocalPart()) { - case "validationPlanID": - object.setValidationPlanID(reader.getObjectUsingBuilder(ReferenceAdapter.class)); + case "validationID": + object.setValidationID(reader.getObjectUsingBuilder(ReferenceAdapter.class)); break; case "error": object.getErrors().add(reader.getObjectUsingBuilder(AbstractErrorPropertyAdapter.class)); @@ -60,7 +60,7 @@ public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>, public void writeChildElements(ValidationResult object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { if (object.getValidationPlanID() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"), + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationID"), object.getValidationPlanID(), ReferenceAdapter.class, namespaces); } for (AbstractErrorProperty err : object.getErrors()) { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java index 3154031a58c8ce072b2a036120dd3f271130b2cd..d65e76cc8c2178de3e35857b685f324e941ae505 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java @@ -22,6 +22,6 @@ public enum ErrorId { GE_P_INTERSECTING_RINGS, GE_P_HOLE_OUTSIDE, GE_P_ORIENTATION_RINGS_SAME, GE_P_INNER_RINGS_NESTED, GE_S_TOO_FEW_POLYGONS, GE_S_NOT_CLOSED, GE_S_NON_MANIFOLD_EDGE, GE_S_POLYGON_WRONG_ORIENTATION, GE_S_ALL_POLYGONS_WRONG_ORIENTATION, GE_S_NON_MANIFOLD_VERTEX, GE_S_SELF_INTERSECTION, - GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING + GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java index 19a065b8ca0f1395b6d4337fc6510a5214b349cd..0564e8312af7a4cc4f318191b35007bfef2f000b 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java @@ -23,6 +23,6 @@ public enum RequirementId { R_GE_P_ORIENTATION_RINGS_SAME, R_GE_P_INNER_RINGS_NESTED, R_GE_S_TOO_FEW_POLYGONS, R_GE_S_NOT_CLOSED, R_GE_S_NON_MANIFOLD_EDGE, R_GE_S_POLYGON_WRONG_ORIENTATION, R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION, R_GE_S_NON_MANIFOLD_VERTEX, R_GE_S_SELF_INTERSECTION, R_GE_S_MULTIPLE_CONNECTED_COMPONENTS, - R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT + R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT, R_SE_ATTRIBUTES_VALID } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java new file mode 100644 index 0000000000000000000000000000000000000000..5f154d35fff1c9c0f8256d7b1ab84f363e45d805 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java @@ -0,0 +1,49 @@ +/*- + * Copyright 2023 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 SemanticAttributeInvalidError extends AbstractSemanticError { + + private static final long serialVersionUID = 6528329813293026972L; + + private String childId; + private String attributeName; + + public String getChildId() { + return childId; + } + + public void setChildId(String childId) { + this.childId = childId; + } + + public String getAttributeName() { + return attributeName; + } + + public void setAttributeName(String attributeName) { + this.attributeName = attributeName; + } + + @Override + public void accept(ValidationErrorVisitor visitor) { + super.accept(visitor); + visitor.visit(this); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java index 8d613e73acfdcb94ac84e1664a1a95a5a2229649..da83a95165ce7c2c72c8740fe04d4f6e44b108c8 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java @@ -23,7 +23,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError { private String childId; private String attributeName; - private boolean generic; public String getChildId() { return childId; @@ -41,14 +40,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError { this.attributeName = attributeName; } - public boolean isGeneric() { - return generic; - } - - public void setGeneric(boolean generic) { - this.generic = generic; - } - @Override public void accept(ValidationErrorVisitor visitor) { super.accept(visitor); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java index f880417b1d824dea1ec38edfe35a04adb048a929..03fb0bf0787c6b0921e2d1e068a10db72468f18c 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java @@ -23,7 +23,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError { private String childId; private String attributeName; - private boolean generic; public String getChildId() { return childId; @@ -41,14 +40,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError { this.attributeName = attributeName; } - public boolean isGeneric() { - return generic; - } - - public void setGeneric(boolean generic) { - this.generic = generic; - } - @Override public void accept(ValidationErrorVisitor visitor) { super.accept(visitor); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java index 2f26c40c470c4211a1d6ffa77ae68344d67e96ba..57c0213d3687651a8f3ccc7ddafc8a354da4f130 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java @@ -19,9 +19,9 @@ import java.time.ZonedDateTime; import org.citygml4j.core.model.ade.ADEObject; import org.citygml4j.core.model.core.AbstractFeature; +import org.xmlobjects.gml.model.base.Reference; import de.hft.stuttgart.quality.model.properties.StatisticsProperty; -import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty; public class Validation extends AbstractFeature implements ADEObject { @@ -30,7 +30,7 @@ public class Validation extends AbstractFeature implements ADEObject { private ZonedDateTime validationDate; private String validationSoftware; private StatisticsProperty statistics; - private ValidationPlanProperty validationPlan; + private Reference validationPlan; public ZonedDateTime getValidationDate() { return validationDate; @@ -56,11 +56,11 @@ public class Validation extends AbstractFeature implements ADEObject { this.statistics = asChild(statistics); } - public ValidationPlanProperty getValidationPlan() { + public Reference getValidationPlan() { return validationPlan; } - public void setValidationPlan(ValidationPlanProperty validationPlan) { + public void setValidationPlan(Reference validationPlan) { this.validationPlan = asChild(validationPlan); } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java index 3310549cc79f5a6bf767e38518a1142e48c4879b..c8356f94c8fef759bd7b5bb89c1920b10dfa1482 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java @@ -18,14 +18,14 @@ 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.citygml4j.core.model.core.AbstractFeature; import org.xmlobjects.model.ChildList; import de.hft.stuttgart.quality.model.properties.FilterProperty; import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty; import de.hft.stuttgart.quality.model.properties.RequirementProperty; -public class ValidationPlan extends GMLObject implements ADEObject { +public class ValidationPlan extends AbstractFeature implements ADEObject { private static final long serialVersionUID = 434443226848485642L; diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java index 8f0446ccec1c45821021290c28c725ccd19c85e0..5f51c0381ecb81d43a78c9ab559603bd35a1a286 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java @@ -30,16 +30,16 @@ public class ValidationResult extends GMLObject implements ADEObject { private static final long serialVersionUID = 4867627296196445082L; - private Reference validationPlanID; + private Reference validationID; private List<AbstractErrorProperty> errors; private ResultType resultType; public Reference getValidationPlanID() { - return validationPlanID; + return validationID; } - public void setValidationPlanID(Reference validationPlanID) { - this.validationPlanID = asChild(validationPlanID); + public void setValidationID(Reference validationPlanID) { + this.validationID = asChild(validationPlanID); } public List<AbstractErrorProperty> getErrors() { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java index e125575a78f1b0977dd5d526c7a69aa7b4ed3d18..a7a9ed738e6246c5b5e8387222b2af83b9af194f 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java @@ -37,6 +37,7 @@ 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.SemanticAttributeInvalidError; import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError; import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError; import de.hft.stuttgart.quality.model.types.SolidNotClosedError; @@ -65,6 +66,10 @@ public interface ValidationErrorVisitor { } + default void visit(SemanticAttributeInvalidError err) { + + } + default void visit(AbstractSolidError err) { } diff --git a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd index 0362e46c4c05e506b0bcfa717c2e7737306e4c26..8dbcb75433df6dd69182f07414706188843e62dc 100644 --- a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd +++ b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd @@ -1,4 +1,4 @@ -<?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"> +<?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/1.0.0" elementFormDefault="qualified" targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0" version="1.0.0"> <import namespace="http://www.opengis.net/citygml/2.0" schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd"/> <import namespace="http://www.opengis.net/citygml/building/2.0" schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd"/> <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/> @@ -117,6 +117,9 @@ <element ref="qual:EdgeList"/> </sequence> </complexType> + <simpleType name="Enumeration1Type"> + <restriction base="string"/> + </simpleType> <element name="Error" substitutionGroup="gml:_Object" type="qual:ErrorType"/> <complexType name="ErrorType"> <sequence> @@ -152,6 +155,7 @@ <enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS"/> <enumeration value="SE_ATTRIBUTE_WRONG_VALUE"/> <enumeration value="SE_ATTRIBUTE_MISSING"/> + <enumeration value="SE_ATTRIBUTE_INVALID"/> </restriction> </simpleType> <element name="FeatureStatistics" substitutionGroup="gml:_Object" type="qual:FeatureStatisticsType"/> @@ -541,6 +545,7 @@ <enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"/> <enumeration value="R_SE_ATTRIBUTES_EXISTING"/> <enumeration value="R_SE_ATTRIBUTES_CORRECT"/> + <enumeration value="R_SE_ATTRIBUTES_VALID"/> </restriction> </simpleType> <simpleType name="ResultTypeType"> @@ -558,6 +563,22 @@ <enumeration value="DEGENERATED_RING"/> </restriction> </simpleType> + <element name="SE_ATTRIBUTE_INVALID" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_INVALIDType"/> + <complexType name="SE_ATTRIBUTE_INVALIDType"> + <complexContent> + <extension base="qual:AbstractSemanticErrorType"> + <sequence> + <element name="childId" type="string"/> + <element name="attributeName" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="SE_ATTRIBUTE_INVALIDPropertyType"> + <sequence> + <element ref="qual:SE_ATTRIBUTE_INVALID"/> + </sequence> + </complexType> <element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/> <complexType name="SE_ATTRIBUTE_MISSINGType"> <complexContent> @@ -565,7 +586,6 @@ <sequence> <element name="childId" type="string"/> <element name="attributeName" type="string"/> - <element name="generic" type="boolean"/> </sequence> </extension> </complexContent> @@ -582,7 +602,6 @@ <sequence> <element name="childId" type="string"/> <element name="attributeName" type="string"/> - <element name="generic" type="boolean"/> </sequence> </extension> </complexContent> @@ -617,7 +636,7 @@ <element name="validationDate" type="dateTime"/> <element name="validationSoftware" type="string"/> <element minOccurs="0" name="statistics" type="qual:StatisticsPropertyType"/> - <element name="validationPlan" type="qual:ValidationPlanPropertyType"/> + <element name="validationPlanID" type="gml:ReferenceType"/> </sequence> </extension> </complexContent> @@ -628,23 +647,28 @@ </sequence> <attributeGroup ref="gml:AssociationAttributeGroup"/> </complexType> - <element name="ValidationPlan" substitutionGroup="gml:_Object" type="qual:ValidationPlanType"/> + <element name="ValidationPlan" substitutionGroup="gml:_Feature" 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> + <complexContent> + <extension base="gml:AbstractFeatureType"> + <sequence> + <element name="globalParameters" type="qual:GlobalParametersPropertyType"/> + <element name="filter" type="qual:FilterPropertyType"/> + <element maxOccurs="unbounded" name="requirement" type="qual:RequirementPropertyType"/> + </sequence> + </extension> + </complexContent> </complexType> <complexType name="ValidationPlanPropertyType"> - <sequence> + <sequence minOccurs="0"> <element ref="qual:ValidationPlan"/> </sequence> + <attributeGroup ref="gml:AssociationAttributeGroup"/> </complexType> <element name="ValidationResult" substitutionGroup="gml:_Object" type="qual:ValidationResultType"/> <complexType name="ValidationResultType"> <sequence> - <element name="validationPlanID" type="gml:ReferenceType"/> + <element name="validationID" type="qual:ValidationPropertyType"/> <element maxOccurs="unbounded" minOccurs="0" name="error" type="qual:AbstractErrorPropertyType"/> <element name="resultType" type="qual:ResultTypeType"/> </sequence> diff --git a/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java b/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java index 51696a95cdbf0406b43a5846ddc1fb5ceab9d7a2..24c916b17f1186836ac8f003106db8144c481ef1 100644 --- a/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java +++ b/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java @@ -78,7 +78,6 @@ import de.hft.stuttgart.quality.model.properties.ParameterProperty; import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty; import de.hft.stuttgart.quality.model.properties.RequirementProperty; import de.hft.stuttgart.quality.model.properties.StatisticsProperty; -import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty; import de.hft.stuttgart.quality.model.properties.ValidationResultProperty; import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError; import de.hft.stuttgart.quality.model.types.Checking; @@ -106,6 +105,7 @@ 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.SemanticAttributeInvalidError; import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError; import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError; import de.hft.stuttgart.quality.model.types.SolidNotClosedError; @@ -418,7 +418,6 @@ class QualityAdeTests { SemanticAttributeMissingError err = new SemanticAttributeMissingError(); err.setAttributeName("attribute"); err.setChildId("child"); - err.setGeneric(true); res.getErrors().add(new AbstractErrorProperty(err)); byte[] buf = writeModel(model); @@ -434,12 +433,26 @@ class QualityAdeTests { SemanticAttributeWrongValueError err = new SemanticAttributeWrongValueError(); err.setAttributeName("attribute"); err.setChildId("child"); - err.setGeneric(true); res.getErrors().add(new AbstractErrorProperty(err)); byte[] buf = writeModel(model); assertTrue(validate(new ByteArrayInputStream(buf))); } + + @Test + void testSemanticAttributeInvalidError() throws ADEException, CityGMLContextException, CityGMLWriteException, + SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SemanticAttributeInvalidError err = new SemanticAttributeInvalidError(); + err.setAttributeName("attribute"); + err.setChildId("child"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); + } @Test void testSolidNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, @@ -547,11 +560,12 @@ class QualityAdeTests { private ValidationResult fillCityModel(CityModel model) { Validation v = new Validation(); - v.setId("planId"); + v.setId("validationId"); model.getFeatureMembers().add(new AbstractFeatureProperty(v)); v.setValidationSoftware("testSoftware"); v.setValidationDate(ZonedDateTime.now()); ValidationPlan plan = new ValidationPlan(); + plan.setId("validationPlanId"); Statistics stats = new Statistics(); FeatureStatistics fStats = new FeatureStatistics(); @@ -561,7 +575,7 @@ class QualityAdeTests { 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.setName(ErrorId.SE_ATTRIBUTE_INVALID); err.setOccurrences(1); stats.getErrors().add(new ErrorProperty(err)); @@ -584,8 +598,10 @@ class QualityAdeTests { GlobalParameters globalParams = new GlobalParameters(); globalParams.getParameters().add(new ParameterProperty(param)); plan.setGlobalParameters(new GlobalParametersProperty(globalParams)); + + model.getFeatureMembers().add(new AbstractFeatureProperty(plan)); - v.setValidationPlan(new ValidationPlanProperty(plan)); + v.setValidationPlan(new Reference(plan)); Building b = new Building(); b.setId("testId"); @@ -596,7 +612,7 @@ class QualityAdeTests { ValidationResult res = new ValidationResult(); props.setValidationResult(new ValidationResultProperty(res)); res.setResultType(ResultType.ERROR); - res.setValidationPlanID(new Reference(v)); + res.setValidationID(new Reference(v)); return res; } } diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml index c62b3696ce8c77b6cc5530708a763a3745b0ee71..4d47e982c26d6f0836f08546f35804044c99f3a5 100644 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml +++ b/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml @@ -1,30 +1,21 @@ <?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.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"> - +<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/1.0.0" 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/1.0.0 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0/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: --> - - <gml:name>Building-Unit-House</gml:name> - <gml:boundedBy> - <gml:Envelope srsDimension="3" srsName="urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH"> - <gml:lowerCorner srsDimension="3">457841 5439082 111 </gml:lowerCorner> - <gml:upperCorner srsDimension="3">457854 5439093 121 </gml:upperCorner> - </gml:Envelope> - </gml:boundedBy> - + <gml:name>Building-Unit-House</gml:name> + <gml:boundedBy> + <gml:Envelope srsDimension="3" srsName="urn:adv:crs:ETRS89_UTM32*DE_DHHN92_NH"> + <gml:lowerCorner srsDimension="3">457841 5439082 111 </gml:lowerCorner> + <gml:upperCorner srsDimension="3">457854 5439093 121 </gml:upperCorner> + </gml:Envelope> + </gml:boundedBy> <core:cityObjectMember> <bldg:Building gml:id="_Simple_BD.1"> <qual:validationResult> <qual:ValidationResult> - <qual:validationPlanID xlink:href="#idvalue0" /> + <qual:validationPlanID xlink:href="#idvalue0"/> <qual:error> <qual:GE_R_CONSECUTIVE_POINTS_SAME> <qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId> @@ -39,13 +30,13 @@ <gml:Solid> <gml:exterior> <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6" /> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7" /> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> + <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> </gml:CompositeSurface> </gml:exterior> </gml:Solid> @@ -212,7 +203,7 @@ </bldg:boundedBy> </bldg:Building> </core:cityObjectMember> - <core:cityObjectMember> + <gml:featureMember> <qual:Validation gml:id="idvalue0"> <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> <qual:validationSoftware>CityDoctor2</qual:validationSoftware> @@ -262,195 +253,196 @@ </qual:error> </qual:Statistics> </qual:statistics> - <qual:validationPlan> - <qual:ValidationPlan> - <qual:globalParameters> - <qual:GlobalParameters> - <qual:parameter> - <qual:Parameter> - <qual:name>numberOfRoundingPlaces</qual:name> - <qual:value>8</qual:value> - </qual:Parameter> - </qual:parameter> - <qual:parameter> - <qual:Parameter> - <qual:name>minVertexDistance</qual:name> - <qual:uom>m</qual:uom> - <qual:value>0.0001</qual:value> - </qual:Parameter> - </qual:parameter> - <qual:parameter> - <qual:Parameter> - <qual:name>schematronFile</qual:name> - <qual:value></qual:value> - </qual:Parameter> - </qual:parameter> - </qual:GlobalParameters> - </qual:globalParameters> - <qual:filter> - <qual:Filter> - <qual:checking> - <qual:Checking> - <qual:featureType>BUILDING</qual:featureType> - </qual:Checking> - </qual:checking> - <qual:checking> - <qual:Checking> - <qual:featureType>TRANSPORTATION</qual:featureType> - </qual:Checking> - </qual:checking> - <qual:checking> - <qual:Checking> - <qual:featureType>VEGETATION</qual:featureType> - </qual:Checking> - </qual:checking> - <qual:checking> - <qual:Checking> - <qual:featureType>BRIDGE</qual:featureType> - </qual:Checking> - </qual:checking> - <qual:checking> - <qual:Checking> - <qual:featureType>WATER</qual:featureType> - </qual:Checking> - </qual:checking> - <qual:checking> - <qual:Checking> - <qual:featureType>LAND</qual:featureType> - </qual:Checking> - </qual:checking> - </qual:Filter> - </qual:filter> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_R_TOO_FEW_POINTS</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_R_NOT_CLOSED</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_R_CONSECUTIVE_POINTS_SAME</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_R_SELF_INTERSECTION</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_NON_PLANAR</qual:requirementType> - <qual:parameter> - <qual:Parameter> - <qual:name>type</qual:name> - <qual:value>distance</qual:value> - </qual:Parameter> - </qual:parameter> - <qual:parameter> - <qual:Parameter> - <qual:name>distanceTolerance</qual:name> - <qual:uom>m</qual:uom> - <qual:value>0.01</qual:value> - </qual:Parameter> - </qual:parameter> - <qual:parameter> - <qual:Parameter> - <qual:name>angleTolerance</qual:name> - <qual:uom>deg</qual:uom> - <qual:value>1</qual:value> - </qual:Parameter> - </qual:parameter> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_INTERIOR_DISCONNECTED</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_INTERSECTING_RINGS</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_HOLE_OUTSIDE</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_ORIENTATION_RINGS_SAME</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_P_INNER_RINGS_NESTED</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_TOO_FEW_POLYGONS</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_NOT_CLOSED</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_NON_MANIFOLD_EDGE</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_POLYGON_WRONG_ORIENTATION</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_NON_MANIFOLD_VERTEX</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_SELF_INTERSECTION</qual:requirementType> - </qual:Requirement> - </qual:requirement> - <qual:requirement> - <qual:Requirement> - <qual:enabled>true</qual:enabled> - <qual:requirementType>R_GE_S_MULTIPLE_CONNECTED_COMPONENTS</qual:requirementType> - </qual:Requirement> - </qual:requirement> - </qual:ValidationPlan> - </qual:validationPlan> + <qual:validationPlan xlink:href="#validationPlanId1"/> </qual:Validation> - </core:cityObjectMember> + </gml:featureMember> + <gml:featureMember> + <qual:ValidationPlan gml:id="validationPlanId1"> + <qual:globalParameters> + <qual:GlobalParameters> + <qual:parameter> + <qual:Parameter> + <qual:name>numberOfRoundingPlaces</qual:name> + <qual:value>8</qual:value> + </qual:Parameter> + </qual:parameter> + <qual:parameter> + <qual:Parameter> + <qual:name>minVertexDistance</qual:name> + <qual:uom>m</qual:uom> + <qual:value>0.0001</qual:value> + </qual:Parameter> + </qual:parameter> + <qual:parameter> + <qual:Parameter> + <qual:name>schematronFile</qual:name> + <qual:value/> + </qual: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> + </gml:featureMember> </core:CityModel> \ No newline at end of file diff --git a/public/1.0.0/qualityAde.xsd b/public/1.0.0/qualityAde.xsd new file mode 100644 index 0000000000000000000000000000000000000000..8dbcb75433df6dd69182f07414706188843e62dc --- /dev/null +++ b/public/1.0.0/qualityAde.xsd @@ -0,0 +1,682 @@ +<?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/1.0.0" elementFormDefault="qualified" targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0" version="1.0.0"> + <import namespace="http://www.opengis.net/citygml/2.0" schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd"/> + <import namespace="http://www.opengis.net/citygml/building/2.0" schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd"/> + <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/> + <!--XML Schema document created by ShapeChange - http://shapechange.net/--> + <element abstract="true" name="AbstractError" substitutionGroup="gml:_Object" type="qual:AbstractErrorType"/> + <complexType abstract="true" name="AbstractErrorType"> + <sequence/> + </complexType> + <complexType name="AbstractErrorPropertyType"> + <sequence> + <element ref="qual:AbstractError"/> + </sequence> + </complexType> + <element abstract="true" name="AbstractGeometryError" substitutionGroup="qual:AbstractError" type="qual:AbstractGeometryErrorType"/> + <complexType abstract="true" name="AbstractGeometryErrorType"> + <complexContent> + <extension base="qual:AbstractErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="AbstractGeometryErrorPropertyType"> + <sequence> + <element ref="qual:AbstractGeometryError"/> + </sequence> + </complexType> + <element abstract="true" name="AbstractPolygonError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractPolygonErrorType"/> + <complexType abstract="true" name="AbstractPolygonErrorType"> + <complexContent> + <extension base="qual:AbstractGeometryErrorType"> + <sequence> + <element name="polygonId" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="AbstractPolygonErrorPropertyType"> + <sequence> + <element ref="qual:AbstractPolygonError"/> + </sequence> + </complexType> + <element abstract="true" name="AbstractRingError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractRingErrorType"/> + <complexType abstract="true" name="AbstractRingErrorType"> + <complexContent> + <extension base="qual:AbstractGeometryErrorType"> + <sequence> + <element name="linearRingId" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="AbstractRingErrorPropertyType"> + <sequence> + <element ref="qual:AbstractRingError"/> + </sequence> + </complexType> + <element abstract="true" name="AbstractSemanticError" substitutionGroup="qual:AbstractError" type="qual:AbstractSemanticErrorType"/> + <complexType abstract="true" name="AbstractSemanticErrorType"> + <complexContent> + <extension base="qual:AbstractErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="AbstractSemanticErrorPropertyType"> + <sequence> + <element ref="qual:AbstractSemanticError"/> + </sequence> + </complexType> + <element abstract="true" name="AbstractSolidError" substitutionGroup="qual:AbstractGeometryError" type="qual:AbstractSolidErrorType"/> + <complexType abstract="true" name="AbstractSolidErrorType"> + <complexContent> + <extension base="qual:AbstractGeometryErrorType"> + <sequence> + <element name="geometryId" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="AbstractSolidErrorPropertyType"> + <sequence> + <element ref="qual:AbstractSolidError"/> + </sequence> + </complexType> + <element name="Checking" substitutionGroup="gml:_Object" type="qual:CheckingType"/> + <complexType name="CheckingType"> + <sequence> + <element name="featureType" type="qual:FeatureTypeType"/> + </sequence> + </complexType> + <complexType name="CheckingPropertyType"> + <sequence> + <element ref="qual:Checking"/> + </sequence> + </complexType> + <element name="Edge" substitutionGroup="gml:_Object" type="qual:EdgeType"/> + <complexType name="EdgeType"> + <sequence> + <element name="from" type="gml:DirectPositionType"/> + <element name="to" type="gml:DirectPositionType"/> + </sequence> + </complexType> + <complexType name="EdgePropertyType"> + <sequence> + <element ref="qual:Edge"/> + </sequence> + </complexType> + <element name="EdgeList" substitutionGroup="gml:_Object" type="qual:EdgeListType"/> + <complexType name="EdgeListType"> + <sequence> + <element maxOccurs="unbounded" name="edge" type="qual:EdgePropertyType"/> + </sequence> + </complexType> + <complexType name="EdgeListPropertyType"> + <sequence> + <element ref="qual:EdgeList"/> + </sequence> + </complexType> + <simpleType name="Enumeration1Type"> + <restriction base="string"/> + </simpleType> + <element name="Error" substitutionGroup="gml:_Object" type="qual:ErrorType"/> + <complexType name="ErrorType"> + <sequence> + <element name="occurrences" type="integer"/> + <element name="name" type="qual:ErrorTypeType"/> + </sequence> + </complexType> + <complexType name="ErrorPropertyType"> + <sequence> + <element ref="qual:Error"/> + </sequence> + </complexType> + <simpleType name="ErrorTypeType"> + <restriction base="string"> + <enumeration value="GE_R_TOO_FEW_POINTS"/> + <enumeration value="GE_R_NOT_CLOSED"/> + <enumeration value="GE_R_CONSECUTIVE_POINTS_SAME"/> + <enumeration value="GE_R_SELF_INTERSECTION"/> + <enumeration value="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"/> + <enumeration value="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"/> + <enumeration value="GE_P_INTERIOR_DISCONNECTED"/> + <enumeration value="GE_P_INTERSECTING_RINGS"/> + <enumeration value="GE_P_HOLE_OUTSIDE"/> + <enumeration value="GE_P_ORIENTATION_RINGS_SAME"/> + <enumeration value="GE_P_INNER_RINGS_NESTED"/> + <enumeration value="GE_S_TOO_FEW_POLYGONS"/> + <enumeration value="GE_S_NOT_CLOSED"/> + <enumeration value="GE_S_NON_MANIFOLD_EDGE"/> + <enumeration value="GE_S_POLYGON_WRONG_ORIENTATION"/> + <enumeration value="GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/> + <enumeration value="GE_S_NON_MANIFOLD_VERTEX"/> + <enumeration value="GE_S_SELF_INTERSECTION"/> + <enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS"/> + <enumeration value="SE_ATTRIBUTE_WRONG_VALUE"/> + <enumeration value="SE_ATTRIBUTE_MISSING"/> + <enumeration value="SE_ATTRIBUTE_INVALID"/> + </restriction> + </simpleType> + <element name="FeatureStatistics" substitutionGroup="gml:_Object" type="qual:FeatureStatisticsType"/> + <complexType name="FeatureStatisticsType"> + <sequence> + <element name="numChecked" type="integer"/> + <element name="numErrors" type="integer"/> + </sequence> + </complexType> + <complexType name="FeatureStatisticsPropertyType"> + <sequence> + <element ref="qual:FeatureStatistics"/> + </sequence> + </complexType> + <simpleType name="FeatureTypeType"> + <restriction base="string"> + <enumeration value="BUILDING"/> + <enumeration value="TRANSPORTATION"/> + <enumeration value="VEGETATION"/> + <enumeration value="BRIDGE"/> + <enumeration value="WATER"/> + <enumeration value="LAND"/> + </restriction> + </simpleType> + <element name="Filter" substitutionGroup="gml:_Object" type="qual:FilterType"/> + <complexType name="FilterType"> + <sequence> + <element maxOccurs="unbounded" minOccurs="0" name="checking" type="qual:CheckingPropertyType"/> + </sequence> + </complexType> + <complexType name="FilterPropertyType"> + <sequence> + <element ref="qual:Filter"/> + </sequence> + </complexType> + <element name="GE_P_HOLE_OUTSIDE" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_HOLE_OUTSIDEType"/> + <complexType name="GE_P_HOLE_OUTSIDEType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="linearRingId" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_HOLE_OUTSIDEPropertyType"> + <sequence> + <element ref="qual:GE_P_HOLE_OUTSIDE"/> + </sequence> + </complexType> + <element name="GE_P_INNER_RINGS_NESTED" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INNER_RINGS_NESTEDType"/> + <complexType name="GE_P_INNER_RINGS_NESTEDType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="linearRingId1" type="string"/> + <element name="linearRingId2" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_INNER_RINGS_NESTEDPropertyType"> + <sequence> + <element ref="qual:GE_P_INNER_RINGS_NESTED"/> + </sequence> + </complexType> + <element name="GE_P_INTERIOR_DISCONNECTED" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INTERIOR_DISCONNECTEDType"/> + <complexType name="GE_P_INTERIOR_DISCONNECTEDType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_INTERIOR_DISCONNECTEDPropertyType"> + <sequence> + <element ref="qual:GE_P_INTERIOR_DISCONNECTED"/> + </sequence> + </complexType> + <element name="GE_P_INTERSECTING_RINGS" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_INTERSECTING_RINGSType"/> + <complexType name="GE_P_INTERSECTING_RINGSType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="linearRingId1" type="string"/> + <element name="linearRingId2" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_INTERSECTING_RINGSPropertyType"> + <sequence> + <element ref="qual:GE_P_INTERSECTING_RINGS"/> + </sequence> + </complexType> + <element name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEType"/> + <complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="distance" type="gml:LengthType"/> + <element name="vertex" type="gml:DirectPositionType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANEPropertyType"> + <sequence> + <element ref="qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"/> + </sequence> + </complexType> + <element name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONType"/> + <complexType name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="deviation" type="gml:AngleType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATIONPropertyType"> + <sequence> + <element ref="qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"/> + </sequence> + </complexType> + <element name="GE_P_ORIENTATION_RINGS_SAME" substitutionGroup="qual:AbstractPolygonError" type="qual:GE_P_ORIENTATION_RINGS_SAMEType"/> + <complexType name="GE_P_ORIENTATION_RINGS_SAMEType"> + <complexContent> + <extension base="qual:AbstractPolygonErrorType"> + <sequence> + <element name="linearRingId" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_P_ORIENTATION_RINGS_SAMEPropertyType"> + <sequence> + <element ref="qual:GE_P_ORIENTATION_RINGS_SAME"/> + </sequence> + </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"> + <complexContent> + <extension base="qual:AbstractRingErrorType"> + <sequence> + <element name="vertex1" type="gml:DirectPositionType"/> + <element name="vertex2" type="gml:DirectPositionType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_R_CONSECUTIVE_POINTS_SAMEPropertyType"> + <sequence> + <element ref="qual:GE_R_CONSECUTIVE_POINTS_SAME"/> + </sequence> + </complexType> + <element name="GE_R_NOT_CLOSED" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_NOT_CLOSEDType"/> + <complexType name="GE_R_NOT_CLOSEDType"> + <complexContent> + <extension base="qual:AbstractRingErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="GE_R_NOT_CLOSEDPropertyType"> + <sequence> + <element ref="qual:GE_R_NOT_CLOSED"/> + </sequence> + </complexType> + <element name="GE_R_SELF_INTERSECTION" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_SELF_INTERSECTIONType"/> + <complexType name="GE_R_SELF_INTERSECTIONType"> + <complexContent> + <extension base="qual:AbstractRingErrorType"> + <sequence> + <element minOccurs="0" name="edge1" type="qual:EdgePropertyType"/> + <element minOccurs="0" name="edge2" type="qual:EdgePropertyType"/> + <element minOccurs="0" name="vertex1" type="gml:DirectPositionType"/> + <element minOccurs="0" name="vertex2" type="gml:DirectPositionType"/> + <element name="type" type="qual:RingSelfIntersectionTypeType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_R_SELF_INTERSECTIONPropertyType"> + <sequence> + <element ref="qual:GE_R_SELF_INTERSECTION"/> + </sequence> + </complexType> + <element name="GE_R_TOO_FEW_POINTS" substitutionGroup="qual:AbstractRingError" type="qual:GE_R_TOO_FEW_POINTSType"/> + <complexType name="GE_R_TOO_FEW_POINTSType"> + <complexContent> + <extension base="qual:AbstractRingErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="GE_R_TOO_FEW_POINTSPropertyType"> + <sequence> + <element ref="qual:GE_R_TOO_FEW_POINTS"/> + </sequence> + </complexType> + <element name="GE_S_ALL_POLYGONS_WRONG_ORIENTATION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATIONType"/> + <complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATIONType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_ALL_POLYGONS_WRONG_ORIENTATIONPropertyType"> + <sequence> + <element ref="qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/> + </sequence> + </complexType> + <element name="GE_S_MULTIPLE_CONNECTED_COMPONENTS" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTSType"/> + <complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTSType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element maxOccurs="unbounded" name="component" type="qual:PolygonIdListPropertyType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_MULTIPLE_CONNECTED_COMPONENTSPropertyType"> + <sequence> + <element ref="qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS"/> + </sequence> + </complexType> + <element name="GE_S_NON_MANIFOLD_EDGE" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NON_MANIFOLD_EDGEType"/> + <complexType name="GE_S_NON_MANIFOLD_EDGEType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element name="edges" type="qual:EdgeListPropertyType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_NON_MANIFOLD_EDGEPropertyType"> + <sequence> + <element ref="qual:GE_S_NON_MANIFOLD_EDGE"/> + </sequence> + </complexType> + <element name="GE_S_NON_MANIFOLD_VERTEX" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NON_MANIFOLD_VERTEXType"/> + <complexType name="GE_S_NON_MANIFOLD_VERTEXType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element name="vertex" type="gml:DirectPositionType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_NON_MANIFOLD_VERTEXPropertyType"> + <sequence> + <element ref="qual:GE_S_NON_MANIFOLD_VERTEX"/> + </sequence> + </complexType> + <element name="GE_S_NOT_CLOSED" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_NOT_CLOSEDType"/> + <complexType name="GE_S_NOT_CLOSEDType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element name="edges" type="qual:EdgeListPropertyType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_NOT_CLOSEDPropertyType"> + <sequence> + <element ref="qual:GE_S_NOT_CLOSED"/> + </sequence> + </complexType> + <element name="GE_S_POLYGON_WRONG_ORIENTATION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_POLYGON_WRONG_ORIENTATIONType"/> + <complexType name="GE_S_POLYGON_WRONG_ORIENTATIONType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element name="edges" type="qual:EdgeListPropertyType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_POLYGON_WRONG_ORIENTATIONPropertyType"> + <sequence> + <element ref="qual:GE_S_POLYGON_WRONG_ORIENTATION"/> + </sequence> + </complexType> + <element name="GE_S_SELF_INTERSECTION" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_SELF_INTERSECTIONType"/> + <complexType name="GE_S_SELF_INTERSECTIONType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence> + <element name="polygonId1" type="string"/> + <element name="polygonId2" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_SELF_INTERSECTIONPropertyType"> + <sequence> + <element ref="qual:GE_S_SELF_INTERSECTION"/> + </sequence> + </complexType> + <element name="GE_S_TOO_FEW_POLYGONS" substitutionGroup="qual:AbstractSolidError" type="qual:GE_S_TOO_FEW_POLYGONSType"/> + <complexType name="GE_S_TOO_FEW_POLYGONSType"> + <complexContent> + <extension base="qual:AbstractSolidErrorType"> + <sequence/> + </extension> + </complexContent> + </complexType> + <complexType name="GE_S_TOO_FEW_POLYGONSPropertyType"> + <sequence> + <element ref="qual:GE_S_TOO_FEW_POLYGONS"/> + </sequence> + </complexType> + <element name="GlobalParameters" substitutionGroup="gml:_Object" type="qual:GlobalParametersType"/> + <complexType name="GlobalParametersType"> + <sequence> + <element maxOccurs="unbounded" minOccurs="0" name="parameter" type="qual:ParameterPropertyType"/> + </sequence> + </complexType> + <complexType name="GlobalParametersPropertyType"> + <sequence> + <element ref="qual:GlobalParameters"/> + </sequence> + </complexType> + <element name="Parameter" substitutionGroup="gml:_Object" type="qual:ParameterType"/> + <complexType name="ParameterType"> + <sequence> + <element name="name" type="string"/> + <element minOccurs="0" name="uom" type="string"/> + <element name="value" type="string"/> + </sequence> + </complexType> + <complexType name="ParameterPropertyType"> + <sequence> + <element ref="qual:Parameter"/> + </sequence> + </complexType> + <element name="PolygonIdList" substitutionGroup="gml:_Object" type="qual:PolygonIdListType"/> + <complexType name="PolygonIdListType"> + <sequence> + <element maxOccurs="unbounded" name="polygonId" type="string"/> + </sequence> + </complexType> + <complexType name="PolygonIdListPropertyType"> + <sequence> + <element ref="qual:PolygonIdList"/> + </sequence> + </complexType> + <element name="Requirement" substitutionGroup="gml:_Object" type="qual:RequirementType"/> + <complexType name="RequirementType"> + <sequence> + <element name="enabled" type="boolean"/> + <element name="requirementType" type="qual:RequirementTypeType"/> + <element maxOccurs="unbounded" minOccurs="0" name="parameter" type="qual:ParameterPropertyType"/> + </sequence> + </complexType> + <complexType name="RequirementPropertyType"> + <sequence> + <element ref="qual:Requirement"/> + </sequence> + </complexType> + <simpleType name="RequirementTypeType"> + <restriction base="string"> + <enumeration value="R_GE_R_TOO_FEW_POINTS"/> + <enumeration value="R_GE_R_NOT_CLOSED"/> + <enumeration value="R_GE_R_CONSECUTIVE_POINTS_SAME"/> + <enumeration value="R_GE_R_SELF_INTERSECTION"/> + <enumeration value="R_GE_P_NON_PLANAR"/> + <enumeration value="R_GE_P_INTERIOR_DISCONNECTED"/> + <enumeration value="R_GE_P_INTERSECTING_RINGS"/> + <enumeration value="R_GE_P_HOLE_OUTSIDE"/> + <enumeration value="R_GE_P_ORIENTATION_RINGS_SAME"/> + <enumeration value="R_GE_P_INNER_RINGS_NESTED"/> + <enumeration value="R_GE_S_TOO_FEW_POLYGONS"/> + <enumeration value="R_GE_S_NOT_CLOSED"/> + <enumeration value="R_GE_S_NON_MANIFOLD_EDGE"/> + <enumeration value="R_GE_S_POLYGON_WRONG_ORIENTATION"/> + <enumeration value="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION"/> + <enumeration value="R_GE_S_NON_MANIFOLD_VERTEX"/> + <enumeration value="R_GE_S_SELF_INTERSECTION"/> + <enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"/> + <enumeration value="R_SE_ATTRIBUTES_EXISTING"/> + <enumeration value="R_SE_ATTRIBUTES_CORRECT"/> + <enumeration value="R_SE_ATTRIBUTES_VALID"/> + </restriction> + </simpleType> + <simpleType name="ResultTypeType"> + <restriction base="string"> + <enumeration value="OK"/> + <enumeration value="ERROR"/> + <enumeration value="NOT_CHECKED"/> + </restriction> + </simpleType> + <simpleType name="RingSelfIntersectionTypeType"> + <restriction base="string"> + <enumeration value="EDGE_INTERSECTION"/> + <enumeration value="VERTEX_TOUCHES_EDGE"/> + <enumeration value="DUPLICATE_POINT"/> + <enumeration value="DEGENERATED_RING"/> + </restriction> + </simpleType> + <element name="SE_ATTRIBUTE_INVALID" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_INVALIDType"/> + <complexType name="SE_ATTRIBUTE_INVALIDType"> + <complexContent> + <extension base="qual:AbstractSemanticErrorType"> + <sequence> + <element name="childId" type="string"/> + <element name="attributeName" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="SE_ATTRIBUTE_INVALIDPropertyType"> + <sequence> + <element ref="qual:SE_ATTRIBUTE_INVALID"/> + </sequence> + </complexType> + <element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/> + <complexType name="SE_ATTRIBUTE_MISSINGType"> + <complexContent> + <extension base="qual:AbstractSemanticErrorType"> + <sequence> + <element name="childId" type="string"/> + <element name="attributeName" type="string"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="SE_ATTRIBUTE_MISSINGPropertyType"> + <sequence> + <element ref="qual:SE_ATTRIBUTE_MISSING"/> + </sequence> + </complexType> + <element name="SE_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_WRONG_VALUEType"/> + <complexType name="SE_ATTRIBUTE_WRONG_VALUEType"> + <complexContent> + <extension base="qual:AbstractSemanticErrorType"> + <sequence> + <element name="childId" type="string"/> + <element name="attributeName" type="string"/> + </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="validationPlanID" type="gml:ReferenceType"/> + </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:_Feature" type="qual:ValidationPlanType"/> + <complexType name="ValidationPlanType"> + <complexContent> + <extension base="gml:AbstractFeatureType"> + <sequence> + <element name="globalParameters" type="qual:GlobalParametersPropertyType"/> + <element name="filter" type="qual:FilterPropertyType"/> + <element maxOccurs="unbounded" name="requirement" type="qual:RequirementPropertyType"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="ValidationPlanPropertyType"> + <sequence minOccurs="0"> + <element ref="qual:ValidationPlan"/> + </sequence> + <attributeGroup ref="gml:AssociationAttributeGroup"/> + </complexType> + <element name="ValidationResult" substitutionGroup="gml:_Object" type="qual:ValidationResultType"/> + <complexType name="ValidationResultType"> + <sequence> + <element name="validationID" type="qual:ValidationPropertyType"/> + <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>