Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
QualityADE
Compare Revisions
6cf1abceed5418abff6c75ad984f5bc73b9ccef6...38715130e20ca66ba3991059cbd2ca6148cd5c20
Hide whitespace changes
Inline
Side-by-side
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidNotClosedError.java
0 → 100644
View file @
38715130
/*-
* 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
);
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
jaxb
/SolidSelfIntersection
Type
.java
→
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
types
/SolidSelfIntersection
Error
.java
View file @
38715130
/*-
* Copyright 202
0
Hochschule für Technik Stuttgart
* Copyright 202
2
Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -13,30 +13,37 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
de.hft.stuttgart.quality.model.
jaxb
;
package
de.hft.stuttgart.quality.model.
types
;
import
javax.xml.bind.annotation.XmlRootElement
;
import
de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor
;
@XmlRootElement
(
name
=
"GE_S_SELF_INTERSECTION"
)
public
class
SolidSelfIntersectionType
extends
SolidErrorType
{
public
class
SolidSelfIntersectionError
extends
AbstractSolidError
{
private
static
final
long
serialVersionUID
=
5070991901664859830L
;
private
String
polygonId1
;
private
String
polygonId2
;
public
String
getPolygonId1
()
{
return
polygonId1
;
}
public
void
setPolygonId1
(
String
polygonId1
)
{
this
.
polygonId1
=
polygonId1
;
}
public
void
setPolygonId2
(
String
p
olygonId2
)
{
this
.
polygonId2
=
polygonId2
;
public
String
getP
olygonId2
(
)
{
return
polygonId2
;
}
public
String
getP
olygonId
1
(
)
{
return
polygonId
1
;
public
void
setPolygonId2
(
String
p
olygonId
2
)
{
this
.
polygonId2
=
polygonId
2
;
}
public
String
getPolygonId2
()
{
return
polygonId2
;
@Override
public
void
accept
(
ValidationErrorVisitor
visitor
)
{
super
.
accept
(
visitor
);
visitor
.
visit
(
this
);
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidTooFewPolygonsError.java
0 → 100644
View file @
38715130
/*-
* 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
;
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Statistics.java
0 → 100644
View file @
38715130
/*-
* 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
);
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
jaxb
/Validation
Type
.java
→
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
types
/Validation.java
View file @
38715130
/*-
* Copyright 202
0
Hochschule für Technik Stuttgart
* Copyright 202
2
Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -13,43 +13,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
de.hft.stuttgart.quality.model.
jaxb
;
package
de.hft.stuttgart.quality.model.
types
;
import
java.time.ZonedDateTime
;
import
javax.xml.bind.annotation.XmlType
;
import
javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
;
import
org.citygml4j.core.model.ade.ADEObject
;
import
org.citygml4j.core.model.core.AbstractFeature
;
import
de.hft.stuttgart.quality.m
arshaller.ZonedDateTimeAdapter
;
import
net.opengis.gml.AbstractGMLType
;
import
de.hft.stuttgart.quality.m
odel.properties.StatisticsProperty
;
import
de.hft.stuttgart.quality.model.properties.ValidationPlanProperty
;
@XmlType
(
name
=
"validation"
)
public
class
ValidationType
extends
AbstractGMLType
{
public
class
Validation
extends
AbstractFeature
implements
ADEObject
{
@XmlJavaTypeAdapter
(
ZonedDateTimeAdapter
.
class
)
private
ZonedDateTime
validationDate
;
private
static
final
long
serialVersionUID
=
7821104529898548535L
;
private
ZonedDateTime
validationDate
;
private
String
validationSoftware
;
private
ValidationPlan
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
;
}
private
StatisticsProperty
statistics
;
private
ValidationPlanProperty
validationPlan
;
public
ZonedDateTime
getValidationDate
()
{
return
validationDate
;
...
...
@@ -67,4 +48,20 @@ public class ValidationType extends AbstractGMLType {
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
);
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
jaxb
/ValidationPlan.java
→
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
types
/ValidationPlan.java
View file @
38715130
/*-
* Copyright 202
0
Hochschule für Technik Stuttgart
* Copyright 202
2
Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -13,53 +13,52 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
de.hft.stuttgart.quality.model.
jaxb
;
package
de.hft.stuttgart.quality.model.
types
;
import
java.io.Serializable
;
import
java.util.ArrayList
;
import
java.util.List
;
import
javax.xml.bind.annotation.XmlAccessType
;
import
javax.xml.bind.annotation.XmlAccessorType
;
import
javax.xml.bind.annotation.XmlElement
;
import
javax.xml.bind.annotation.XmlElementWrapper
;
import
javax.xml.bind.annotation.XmlType
;
import
org.citygml4j.core.model.ade.ADEObject
;
import
org.xmlobjects.gml.model.GMLObject
;
import
org.xmlobjects.model.ChildList
;
@XmlType
(
name
=
"validationPlan"
)
@XmlAccessorType
(
XmlAccessType
.
FIELD
)
public
class
ValidationPlan
implements
Serializable
{
import
de.hft.stuttgart.quality.model.properties.FilterProperty
;
import
de.hft.stuttgart.quality.model.properties.GlobalParametersProperty
;
import
de.hft.stuttgart.quality.model.properties.RequirementProperty
;
private
static
final
long
serialVersionUID
=
199908444294536261L
;
public
class
ValidationPlan
extends
GMLObject
implements
ADEObject
{
@XmlElementWrapper
(
name
=
"globalParameters"
)
@XmlElement
(
name
=
"parameter"
)
private
List
<
Parameter
>
globalParameters
;
private
static
final
long
serialVersionUID
=
434443226848485642L
;
@XmlElement
(
name
=
"requirement"
)
private
List
<
Requirement
>
requirements
;
private
GlobalParametersProperty
globalParameters
;
private
FilterProperty
filter
;
private
List
<
RequirementProperty
>
requirement
;
@XmlElementWrapper
(
name
=
"filter"
)
@XmlElement
(
name
=
"checking"
)
private
List
<
Checking
>
filter
;
public
List
<
Checking
>
getFilter
()
{
if
(
filter
==
null
)
{
filter
=
new
ArrayList
<>();
}
public
GlobalParametersProperty
getGlobalParameters
()
{
return
globalParameters
;
}
public
void
setGlobalParameters
(
GlobalParametersProperty
globalParameters
)
{
this
.
globalParameters
=
asChild
(
globalParameters
);
}
public
FilterProperty
getFilter
()
{
return
filter
;
}
public
List
<
Requirement
>
getRequirements
()
{
if
(
requirements
==
null
)
{
requirements
=
new
ArrayList
<>();
}
return
requirements
;
public
void
setFilter
(
FilterProperty
filter
)
{
this
.
filter
=
asChild
(
filter
);
}
public
List
<
Parameter
>
getGlobalParameter
s
()
{
if
(
globalParameters
==
null
)
{
globalParameters
=
new
Array
List
<>();
public
List
<
RequirementProperty
>
getRequirement
s
()
{
if
(
requirement
==
null
)
{
requirement
=
new
Child
List
<>(
this
);
}
return
globalParameters
;
return
requirement
;
}
public
void
setRequirements
(
List
<
RequirementProperty
>
requirement
)
{
this
.
requirement
=
asChild
(
requirement
);
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
jaxb
/ValidationResult
Type
.java
→
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/
types
/ValidationResult.java
View file @
38715130
/*-
* Copyright 202
0
Hochschule für Technik Stuttgart
* Copyright 202
2
Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -13,41 +13,61 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
de.hft.stuttgart.quality.model.
jaxb
;
package
de.hft.stuttgart.quality.model.
types
;
import
java.util.ArrayList
;
import
java.util.List
;
import
javax.xml.bind.annotation.XmlAttribute
;
import
javax.xml.bind.annotation.XmlElementRef
;
import
org.citygml4j.core.model.ade.ADEObject
;
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
ValidationResult
Type
extends
AbstractFeatureType
{
public
class
ValidationResult
extends
GMLObject
implements
ADEObject
{
@XmlAttribute
(
name
=
"result"
)
private
ResultType
result
;
private
static
final
long
serialVersionUID
=
4867627296196445082L
;
@XmlElementRef
private
List
<
ValidationErrorType
>
errors
;
private
Reference
validationPlanID
;
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
)
{
errors
=
new
Array
List
<>(
2
);
errors
=
new
Child
List
<>(
this
);
}
return
errors
;
}
public
void
set
Result
(
ResultType
result
)
{
this
.
result
=
result
;
public
void
set
Errors
(
List
<
AbstractErrorProperty
>
errors
)
{
this
.
errors
=
errors
;
}
public
ResultType
getResult
()
{
return
result
;
public
ResultType
getResult
Type
()
{
return
result
Type
;
}
public
boolean
isSetErrors
()
{
return
errors
!=
null
&&
!
errors
.
isEmpty
();
public
void
setResultType
(
ResultType
resultType
)
{
this
.
resultType
=
resultType
;
}
public
void
accept
(
ValidationErrorVisitor
visitor
)
{
for
(
AbstractErrorProperty
errorProp
:
errors
)
{
if
(
errorProp
.
getObject
()
==
null
)
{
continue
;
}
errorProp
.
getObject
().
accept
(
visitor
);
}
}
}
citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java
0 → 100644
View file @
38715130
/*-
* 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
)
{
}
}
citygml4j-quality-ade/src/main/resources/META-INF/services/org.citygml4j.
model.citygml.ade.binding.ADEContext
→
citygml4j-quality-ade/src/main/resources/META-INF/services/org.citygml4j.
core.ade.ADE
View file @
38715130
File moved
citygml4j-quality-ade/src/main/resources/qualityAde.xsd
View file @
38715130
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<schema
xmlns=
"http://www.w3.org/2001/XMLSchema"
xmlns:qual=
"https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3"
targetNamespace=
"https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3"
xmlns:core=
"http://www.opengis.net/citygml/2.0"
xmlns:bldg=
"http://www.opengis.net/citygml/building/2.0"
xmlns:gml=
"http://www.opengis.net/gml"
elementFormDefault=
"qualified"
version=
"1.0"
>
<import
namespace=
"http://www.opengis.net/citygml/2.0"
schemaLocation=
"http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd"
/>
<import
namespace=
"http://www.opengis.net/citygml/building/2.0"
schemaLocation=
"http://schemas.opengis.net/citygml/building/2.0/building.xsd"
/>
<import
namespace=
"http://www.opengis.net/citygml/appearance/2.0"
schemaLocation=
"http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd"
/>
<import
namespace=
"http://www.opengis.net/citygml/generics/2.0"
schemaLocation=
"http://schemas.opengis.net/citygml/generics/2.0/generics.xsd"
/>
<import
namespace=
"http://www.opengis.net/gml"
schemaLocation=
"http://schemas.opengis.net/gml/2.1.2/gml.xsd"
/>
<element
name=
"validationResult"
type=
"qual:validationResultType"
substitutionGroup=
"core:_GenericApplicationPropertyOfCityObject"
/>
<simpleType
name=
"result"
final=
"restriction"
>
<annotation>
<documentation>
Enumeration for status of check result
</documentation>
</annotation>
<restriction
base=
"string"
>
<enumeration
value=
"ERROR"
>
<annotation>
<documentation>
One or more errors were found
</documentation>
</annotation>
</enumeration>
<enumeration
value=
"NOT_CHECKED"
>
<annotation>
<documentation>
Feature was not checked
</documentation>
</annotation>
</enumeration>
<enumeration
value=
"OK"
>
<annotation>
<documentation>
No errors were found
</documentation>
</annotation>
</enumeration>
</restriction>
</simpleType>
<complexType
name=
"ValidationError"
>
</complexType>
<complexType
name=
"RingError"
>
<complexContent>
<extension
base=
"qual:ValidationError"
>
<sequence>
<element
name=
"linearRingId"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_R_CONSECUTIVE_POINTS_SAME"
>
<annotation>
<documentation>
Consecutive point are the same
</documentation>
</annotation>
<complexContent>
<extension
base=
"qual:RingError"
>
<sequence>
<element
name=
"vertex1"
type=
"gml:DirectPositionType"
/>
<element
name=
"vertex2"
type=
"gml:DirectPositionType"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_R_TOO_FEW_POINTS"
>
<complexContent>
<extension
base=
"qual:RingError"
/>
</complexContent>
</complexType>
<complexType
name=
"GE_R_SELF_INTERSECTION"
>
<complexContent>
<extension
base=
"qual:RingError"
>
<sequence>
<element
name=
"type"
type=
"qual:ringSelfIntType"
/>
<element
name=
"edge1"
type=
"qual:edgeType"
minOccurs=
"0"
/>
<element
name=
"edge2"
type=
"qual:edgeType"
minOccurs=
"0"
/>
<element
name=
"vertex1"
type=
"gml:DirectPositionType"
minOccurs=
"0"
/>
<element
name=
"vertex2"
type=
"gml:DirectPositionType"
minOccurs=
"0"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<simpleType
name=
"ringSelfIntType"
>
<restriction
base=
"string"
>
<enumeration
value=
"DUPLICATE_POINT"
/>
<enumeration
value=
"POINT_TOUCHES_EDGE"
/>
<enumeration
value=
"EDGE_INTERSECTS_EDGE"
/>
</restriction>
</simpleType>
<complexType
name=
"edgeType"
>
<sequence>
<element
name=
"from"
type=
"gml:DirectPositionType"
/>
<element
name=
"to"
type=
"gml:DirectPositionType"
/>
</sequence>
</complexType>
<complexType
name=
"GE_R_NOT_CLOSED"
>
<complexContent>
<extension
base=
"qual:RingError"
/>
</complexContent>
</complexType>
<complexType
name=
"PolygonError"
>
<sequence>
<element
name=
"polygonId"
type=
"string"
/>
</sequence>
</complexType>
<complexType
name=
"GE_P_INTERIOR_DISCONNECTED"
>
<complexContent>
<extension
base=
"qual:PolygonError"
/>
</complexContent>
</complexType>
<complexType
name=
"GE_P_INTERSECTING_RINGS"
>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"linearRingId1"
type=
"string"
/>
<element
name=
"linearRingId2"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_P_INNER_RINGS_NESTED"
>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"linearRingId1"
type=
"string"
/>
<element
name=
"linearRingId2"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_P_HOLE_OUTSIDE"
>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"linearRingId"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"
>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"deviation"
type=
"gml:AngleType"
></element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_P_ORIENTATION_RINGS_SAME"
>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"linearRingId"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"SolidError"
>
<sequence>
<element
name=
"geometryId"
type=
"string"
/>
</sequence>
</complexType>
<complexType
name=
"GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
>
<complexContent>
<extension
base=
"qual:SolidError"
/>
</complexContent>
</complexType>
<complexType
name=
"GE_S_POLYGON_WRONG_ORIENTATION"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"edges"
type=
"qual:EdgeList"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"EdgeList"
>
<sequence>
<element
name=
"edge"
type=
"qual:edgeType"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<complexType
name=
"GE_S_SELF_INTERSECTION"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"polygonId1"
type=
"string"
/>
<element
name=
"polygonId2"
type=
"string"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_S_NON_MANIFOLD_VERTEX"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"vertex"
type=
"gml:DirectPositionType"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_S_NON_MANIFOLD_EDGE"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"edges"
type=
"qual:EdgeList"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_S_NOT_CLOSED"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"edges"
type=
"qual:EdgeList"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"GE_S_TOO_FEW_POLYGONS"
>
<complexContent>
<extension
base=
"qual:SolidError"
/>
</complexContent>
</complexType>
<complexType
name=
"GE_S_MULTIPLE_CONNECTED_COMPONENTS"
>
<complexContent>
<extension
base=
"qual:SolidError"
>
<sequence>
<element
name=
"components"
type=
"qual:ComponentList"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"ComponentList"
>
<sequence>
<element
name=
"component"
type=
"qual:componentType"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<complexType
name=
"componentType"
>
<sequence>
<element
name=
"polygonId"
type=
"string"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<complexType
name=
"GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"
>
<annotation>
<documentation>
A planarity error with a point too far from the
regression plane
</documentation>
</annotation>
<complexContent>
<extension
base=
"qual:PolygonError"
>
<sequence>
<element
name=
"vertex"
type=
"gml:DirectPositionType"
/>
<element
name=
"distance"
type=
"gml:LengthType"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"SemanticError"
>
</complexType>
<complexType
name=
"SE_ATTRIBUTE_WRONG_VALUE"
>
<complexContent>
<extension
base=
"qual:SemanticError"
>
<sequence>
<element
name=
"childId"
type=
"string"
minOccurs=
"0"
/>
<element
name=
"attributeName"
type=
"string"
/>
<element
name=
"generic"
type=
"boolean"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"SE_ATTRIBUTE_MISSING"
>
<complexContent>
<extension
base=
"qual:SemanticError"
>
<sequence>
<element
name=
"childId"
type=
"string"
minOccurs=
"0"
/>
<element
name=
"attributeName"
type=
"string"
/>
<element
name=
"generic"
type=
"boolean"
/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType
name=
"validationResultType"
>
<annotation>
<documentation>
Data structure containing validation results for
features
</documentation>
</annotation>
<sequence>
<element
name=
"GE_P_HOLE_OUTSIDE"
type=
"qual:GE_P_HOLE_OUTSIDE"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_INNER_RINGS_NESTED"
type=
"qual:GE_P_INNER_RINGS_NESTED"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_INTERIOR_DISCONNECTED"
type=
"qual:GE_P_INTERIOR_DISCONNECTED"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_INTERSECTING_RINGS"
type=
"qual:GE_P_INTERSECTING_RINGS"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"
type=
"qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"
type=
"qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_P_ORIENTATION_RINGS_SAME"
type=
"qual:GE_P_ORIENTATION_RINGS_SAME"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_R_CONSECUTIVE_POINTS_SAME"
type=
"qual:GE_R_CONSECUTIVE_POINTS_SAME"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_R_NOT_CLOSED"
type=
"qual:GE_R_NOT_CLOSED"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_R_SELF_INTERSECTION"
type=
"qual:GE_R_SELF_INTERSECTION"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_R_TOO_FEW_POINTS"
type=
"qual:GE_R_TOO_FEW_POINTS"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
type=
"qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_MULTIPLE_CONNECTED_COMPONENTS"
type=
"qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_NON_MANIFOLD_EDGE"
type=
"qual:GE_S_NON_MANIFOLD_EDGE"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_NON_MANIFOLD_VERTEX"
type=
"qual:GE_S_NON_MANIFOLD_VERTEX"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_NOT_CLOSED"
type=
"qual:GE_S_NOT_CLOSED"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_POLYGON_WRONG_ORIENTATION"
type=
"qual:GE_S_POLYGON_WRONG_ORIENTATION"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_SELF_INTERSECTION"
type=
"qual:GE_S_SELF_INTERSECTION"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"GE_S_TOO_FEW_POLYGONS"
type=
"qual:GE_S_TOO_FEW_POLYGONS"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"SE_ATTRIBUTE_MISSING"
type=
"qual:SE_ATTRIBUTE_MISSING"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
<element
name=
"SE_ATTRIBUTE_WRONG_VALUE"
type=
"qual:SE_ATTRIBUTE_WRONG_VALUE"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
</sequence>
<attribute
name=
"result"
type=
"qual:result"
/>
</complexType>
<simpleType
name=
"requirementID"
final=
"restriction"
>
<annotation>
<documentation>
Enumeration for available requirements
</documentation>
</annotation>
<restriction
base=
"string"
>
<enumeration
value=
"R_GE_R_TOO_FEW_POINTS"
/>
<enumeration
value=
"R_GE_R_NOT_CLOSED"
/>
<enumeration
value=
"R_GE_R_CONSECUTIVE_POINTS_SAME"
/>
<enumeration
value=
"R_GE_R_SELF_INTERSECTION"
/>
<enumeration
value=
"R_GE_P_NON_PLANAR"
/>
<enumeration
value=
"R_GE_P_INTERIOR_DISCONNECTED"
/>
<enumeration
value=
"R_GE_P_INTERSECTING_RINGS"
/>
<enumeration
value=
"R_GE_P_HOLE_OUTSIDE"
/>
<enumeration
value=
"R_GE_P_ORIENTATION_RINGS_SAME"
/>
<enumeration
value=
"R_GE_P_INNER_RINGS_NESTED"
/>
<enumeration
value=
"R_GE_S_TOO_FEW_POLYGONS"
/>
<enumeration
value=
"R_GE_S_NOT_CLOSED"
/>
<enumeration
value=
"R_GE_S_NON_MANIFOLD_EDGE"
/>
<enumeration
value=
"R_GE_S_POLYGON_WRONG_ORIENTATION"
/>
<enumeration
value=
"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
/>
<enumeration
value=
"R_GE_S_NON_MANIFOLD_VERTEX"
/>
<enumeration
value=
"R_GE_S_SELF_INTERSECTION"
/>
<enumeration
value=
"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"
/>
<enumeration
value=
"R_SE_ATTRIBUTES_EXISTING"
/>
<enumeration
value=
"R_SE_ATTRIBUTES_CORRECT"
/>
</restriction>
</simpleType>
<complexType
name=
"parameter"
>
<simpleContent>
<extension
base=
"string"
>
<attribute
name=
"name"
type=
"string"
use=
"required"
/>
<attribute
name=
"uom"
type=
"string"
use=
"optional"
/>
</extension>
</simpleContent>
</complexType>
<complexType
name=
"requirementType"
>
<annotation>
<documentation>
Requirement structure for configuration purposes
</documentation>
</annotation>
<sequence>
<element
name=
"parameter"
type=
"qual:parameter"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
</sequence>
<attribute
name=
"name"
type=
"qual:requirementID"
/>
<attribute
name=
"enabled"
type=
"boolean"
/>
</complexType>
<complexType
name=
"validationPlanType"
>
<annotation>
<documentation>
Validation plan structure containing information about
the parameters used to perform the checks
</documentation>
</annotation>
<sequence>
<element
name=
"globalParameters"
type=
"qual:globalParameterType"
/>
<element
name=
"requirement"
type=
"qual:requirementType"
maxOccurs=
"unbounded"
/>
<element
name=
"filter"
type=
"qual:filterType"
minOccurs=
"1"
maxOccurs=
"1"
/>
</sequence>
</complexType>
<complexType
name=
"filterType"
>
<sequence>
<element
name=
"checking"
type=
"qual:featureType"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<simpleType
name=
"featureType"
>
<restriction
base=
"string"
>
<enumeration
value=
"BUILDING"
></enumeration>
<enumeration
value=
"TRANSPORTATION"
></enumeration>
<enumeration
value=
"VEGETATION"
></enumeration>
<enumeration
value=
"BRIDGE"
></enumeration>
<enumeration
value=
"WATER"
></enumeration>
<enumeration
value=
"LAND"
></enumeration>
</restriction>
</simpleType>
<complexType
name=
"globalParameterType"
>
<sequence>
<element
name=
"parameter"
type=
"qual:parameter"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<complexType
name=
"statisticsType"
>
<annotation>
<documentation>
Statistics structure containing information about end
result of checking process
</documentation>
</annotation>
<sequence>
<element
name=
"numErrorBuildings"
type=
"qual:featureStatistics"
/>
<element
name=
"numErrorVegetation"
type=
"qual:featureStatistics"
/>
<element
name=
"numErrorLandObjects"
type=
"qual:featureStatistics"
/>
<element
name=
"numErrorBridgeObjects"
type=
"qual:featureStatistics"
/>
<element
name=
"numErrorWaterObjects"
type=
"qual:featureStatistics"
/>
<element
name=
"numErrorTransportation"
type=
"qual:featureStatistics"
/>
<element
name=
"errorStatistics"
type=
"qual:errorStatisticsType"
/>
</sequence>
</complexType>
<complexType
name=
"errorStatisticsType"
>
<sequence>
<element
name=
"error"
type=
"qual:errorType"
minOccurs=
"0"
maxOccurs=
"unbounded"
/>
</sequence>
</complexType>
<complexType
name=
"errorType"
>
<simpleContent>
<extension
base=
"int"
>
<attribute
name=
"name"
type=
"qual:errorId"
></attribute>
</extension>
</simpleContent>
</complexType>
<simpleType
name=
"errorId"
>
<restriction
base=
"string"
>
<enumeration
value=
"GE_R_TOO_FEW_POINTS"
/>
<enumeration
value=
"GE_R_NOT_CLOSED"
/>
<enumeration
value=
"GE_R_CONSECUTIVE_POINTS_SAME"
/>
<enumeration
value=
"GE_R_SELF_INTERSECTION"
/>
<enumeration
value=
"GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"
/>
<enumeration
value=
"GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"
/>
<enumeration
value=
"GE_P_INTERIOR_DISCONNECTED"
/>
<enumeration
value=
"GE_P_INTERSECTING_RINGS"
/>
<enumeration
value=
"GE_P_HOLE_OUTSIDE"
/>
<enumeration
value=
"GE_P_ORIENTATION_RINGS_SAME"
/>
<enumeration
value=
"GE_P_INNER_RINGS_NESTED"
/>
<enumeration
value=
"GE_S_TOO_FEW_POLYGONS"
/>
<enumeration
value=
"GE_S_NOT_CLOSED"
/>
<enumeration
value=
"GE_S_NON_MANIFOLD_EDGE"
/>
<enumeration
value=
"GE_S_POLYGON_WRONG_ORIENTATION"
/>
<enumeration
value=
"GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
/>
<enumeration
value=
"GE_S_NON_MANIFOLD_VERTEX"
/>
<enumeration
value=
"GE_S_SELF_INTERSECTION"
/>
<enumeration
value=
"GE_S_MULTIPLE_CONNECTED_COMPONENTS"
/>
<enumeration
value=
"SE_ATTRIBUTE_WRONG_VALUE"
/>
<enumeration
value=
"SE_ATTRIBUTE_MISSING"
/>
</restriction>
</simpleType>
<complexType
name=
"featureStatistics"
>
<simpleContent>
<extension
base=
"int"
>
<attribute
name=
"numChecked"
type=
"int"
/>
</extension>
</simpleContent>
</complexType>
<element
name=
"validation"
type=
"qual:validationType"
substitutionGroup=
"core:_GenericApplicationPropertyOfCityModel"
/>
<complexType
name=
"validationType"
>
<annotation>
<documentation>
Data structure containing the validation plan and
statistics of a validation process
</documentation>
</annotation>
<sequence>
<element
name=
"validationDate"
type=
"dateTime"
/>
<element
name=
"validationSoftware"
type=
"string"
/>
<element
name=
"validationPlan"
type=
"qual:validationPlanType"
maxOccurs=
"1"
/>
<element
name=
"statistics"
type=
"qual:statisticsType"
maxOccurs=
"1"
/>
</sequence>
</complexType>
</schema>
\ No newline at end of file
<?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"
>
<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>
<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"
/>
</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"
/>
</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_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"
/>
<element
name=
"generic"
type=
"boolean"
/>
</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"
/>
<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>
citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java
View file @
38715130
/*-
* Copyright 202
0
Hochschule für Technik Stuttgart
* Copyright 202
2
Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
...
...
@@ -15,1395 +15,588 @@
*/
package
de.hft.stuttgart.quality
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertFalse
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNotNull
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertNull
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.nio.charset.StandardCharsets
;
import
java.time.ZonedDateTime
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.ServiceLoader
;
import
org.citygml4j.CityGMLContext
;
import
org.citygml4j.builder.jaxb.CityGMLBuilder
;
import
org.citygml4j.builder.jaxb.CityGMLBuilderException
;
import
org.citygml4j.model.citygml.ade.ADEComponent
;
import
org.citygml4j.model.citygml.ade.ADEException
;
import
org.citygml4j.model.citygml.ade.binding.ADEContext
;
import
org.citygml4j.model.citygml.building.Building
;
import
org.citygml4j.model.citygml.core.AbstractCityObject
;
import
org.citygml4j.model.citygml.core.CityModel
;
import
org.citygml4j.model.citygml.core.CityObjectMember
;
import
org.citygml4j.model.gml.geometry.primitives.DirectPosition
;
import
org.citygml4j.model.gml.measures.Angle
;
import
org.citygml4j.model.gml.measures.Length
;
import
org.citygml4j.model.module.citygml.CityGMLVersion
;
import
org.citygml4j.xml.io.CityGMLInputFactory
;
import
org.citygml4j.xml.io.CityGMLOutputFactory
;
import
org.citygml4j.xml.io.reader.CityGMLReadException
;
import
org.citygml4j.xml.io.reader.CityGMLReader
;
import
org.citygml4j.xml.io.reader.FeatureReadMode
;
import
org.citygml4j.xml.io.writer.CityGMLWriteException
;
import
org.citygml4j.xml.io.writer.CityGMLWriter
;
import
java.util.Locale
;
import
javax.xml.XMLConstants
;
import
javax.xml.namespace.QName
;
import
javax.xml.transform.Source
;
import
javax.xml.transform.stream.StreamSource
;
import
javax.xml.validation.Schema
;
import
javax.xml.validation.SchemaFactory
;
import
javax.xml.validation.Validator
;
import
org.citygml4j.core.ade.ADEException
;
import
org.citygml4j.core.ade.ADERegistry
;
import
org.citygml4j.core.model.CityGMLVersion
;
import
org.citygml4j.core.model.building.Building
;
import
org.citygml4j.core.model.core.AbstractCityObjectProperty
;
import
org.citygml4j.core.model.core.AbstractFeatureProperty
;
import
org.citygml4j.core.model.core.CityModel
;
import
org.citygml4j.core.util.CityGMLConstants
;
import
org.citygml4j.xml.CityGMLContext
;
import
org.citygml4j.xml.CityGMLContextException
;
import
org.citygml4j.xml.module.citygml.CoreModule
;
import
org.citygml4j.xml.schema.CityGMLSchemaHandler
;
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
de.hft.stuttgart.quality.model.AllPolygonsWrongOrientation
;
import
de.hft.stuttgart.quality.model.AttributeMissing
;
import
de.hft.stuttgart.quality.model.AttributeWrongValue
;
import
de.hft.stuttgart.quality.model.ConsecutivePointsSame
;
import
de.hft.stuttgart.quality.model.Edge
;
import
de.hft.stuttgart.quality.model.HoleOutside
;
import
de.hft.stuttgart.quality.model.InnerRingsNested
;
import
de.hft.stuttgart.quality.model.InteriorDisconnected
;
import
de.hft.stuttgart.quality.model.IntersectingRings
;
import
de.hft.stuttgart.quality.model.MultipleConnectedComponents
;
import
de.hft.stuttgart.quality.model.NonManifoldEdge
;
import
de.hft.stuttgart.quality.model.NonManifoldVertex
;
import
de.hft.stuttgart.quality.model.NonPlanarDistancePlane
;
import
de.hft.stuttgart.quality.model.NonPlanarNormalsDeviation
;
import
de.hft.stuttgart.quality.model.OrientationRingsSame
;
import
de.hft.stuttgart.quality.model.PolygonWrongOrientation
;
import
de.hft.stuttgart.quality.model.RingNotClosed
;
import
de.hft.stuttgart.quality.model.RingSelfIntersection
;
import
de.hft.stuttgart.quality.model.SolidNotClosed
;
import
de.hft.stuttgart.quality.model.TooFewPoints
;
import
de.hft.stuttgart.quality.model.TooFewPolygons
;
import
de.hft.stuttgart.quality.model.Validation
;
import
de.hft.stuttgart.quality.model.ValidationError
;
import
de.hft.stuttgart.quality.model.ValidationResult
;
import
de.hft.stuttgart.quality.model.jaxb.Checking
;
import
de.hft.stuttgart.quality.model.jaxb.Component
;
import
de.hft.stuttgart.quality.model.jaxb.ErrorId
;
import
de.hft.stuttgart.quality.model.jaxb.ErrorStatistics
;
import
de.hft.stuttgart.quality.model.jaxb.FeatureStatistics
;
import
de.hft.stuttgart.quality.model.jaxb.Parameter
;
import
de.hft.stuttgart.quality.model.jaxb.Requirement
;
import
de.hft.stuttgart.quality.model.jaxb.RequirementId
;
import
de.hft.stuttgart.quality.model.jaxb.ResultType
;
import
de.hft.stuttgart.quality.model.jaxb.RingSelfIntType
;
import
de.hft.stuttgart.quality.model.jaxb.Statistics
;
import
de.hft.stuttgart.quality.model.jaxb.TopLevelFeatureType
;
import
de.hft.stuttgart.quality.model.jaxb.ValidationPlan
;
import
org.xml.sax.ErrorHandler
;
import
org.xml.sax.SAXException
;
import
org.xml.sax.SAXParseException
;
import
org.xmlobjects.gml.model.base.Reference
;
import
org.xmlobjects.gml.model.geometry.DirectPosition
;
import
org.xmlobjects.gml.model.measures.Angle
;
import
org.xmlobjects.gml.model.measures.Length
;
import
org.xmlobjects.schema.SchemaHandlerException
;
import
de.hft.stuttgart.quality.model.enums.ErrorId
;
import
de.hft.stuttgart.quality.model.enums.RequirementId
;
import
de.hft.stuttgart.quality.model.enums.ResultType
;
import
de.hft.stuttgart.quality.model.enums.RingSelfIntType
;
import
de.hft.stuttgart.quality.model.enums.TopLevelFeatureType
;
import
de.hft.stuttgart.quality.model.properties.AbstractErrorProperty
;
import
de.hft.stuttgart.quality.model.properties.CheckingProperty
;
import
de.hft.stuttgart.quality.model.properties.EdgeListProperty
;
import
de.hft.stuttgart.quality.model.properties.EdgeProperty
;
import
de.hft.stuttgart.quality.model.properties.ErrorProperty
;
import
de.hft.stuttgart.quality.model.properties.FeatureStatisticsProperty
;
import
de.hft.stuttgart.quality.model.properties.FilterProperty
;
import
de.hft.stuttgart.quality.model.properties.GlobalParametersProperty
;
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
;
import
de.hft.stuttgart.quality.model.types.CityObjectProperties
;
import
de.hft.stuttgart.quality.model.types.ConsecutivePointsSameError
;
import
de.hft.stuttgart.quality.model.types.Edge
;
import
de.hft.stuttgart.quality.model.types.EdgeList
;
import
de.hft.stuttgart.quality.model.types.FeatureStatistics
;
import
de.hft.stuttgart.quality.model.types.Filter
;
import
de.hft.stuttgart.quality.model.types.GlobalParameters
;
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
{
@Test
void
testReadingConsecutiveSameError
()
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
);
}
private
static
final
String
CITY_OBJECT_MEMBER
=
"cityObjectMember"
;
private
static
List
<
QName
>
chunkProperties
=
new
ArrayList
<>();
@Test
void
testReadingTooFewPointsError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_TooFewPoints.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
TooFewPoints
);
TooFewPoints
err
=
(
TooFewPoints
)
validationError
;
assertEquals
(
"_Simple_BD.1_PG.6_LR.1"
,
err
.
getLinearRingId
());
static
{
chunkProperties
.
add
(
new
QName
(
CityGMLConstants
.
CITYGML_1_0_CORE_NAMESPACE
,
CITY_OBJECT_MEMBER
));
chunkProperties
.
add
(
new
QName
(
CityGMLConstants
.
CITYGML_2_0_CORE_NAMESPACE
,
CITY_OBJECT_MEMBER
));
chunkProperties
.
add
(
new
QName
(
CityGMLConstants
.
CITYGML_3_0_CORE_NAMESPACE
,
CITY_OBJECT_MEMBER
));
}
@Test
void
testReadingRingSelfIntersectionError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_RingSelfIntersection.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
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
());
@BeforeAll
static
void
setUsLocale
()
throws
ADEException
{
Locale
.
setDefault
(
Locale
.
US
);
ADERegistry
.
getInstance
().
loadADE
(
new
QualityADEContext
());
}
@Test
void
testReadingRingNotClosedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_RingNotClosed.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
RingNotClosed
);
RingNotClosed
err
=
(
RingNotClosed
)
validationError
;
assertEquals
(
"_Simple_BD.1_PG.6_LR.1"
,
err
.
getLinearRingId
());
}
void
testAllPolygonsOrientedWrong
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandlerException
{
CityModel
model
=
new
CityModel
();
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testReadingInteriorDisconnectedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
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
());
}
AllPolygonsOrientedWrongError
err
=
new
AllPolygonsOrientedWrongError
();
err
.
setGeometryId
(
"geomId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testReadingIntersectingRingsError
()
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
());
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
testReadingNonPlanarPolygonDistancePlaneError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.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
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
());
}
void
testConsecutivePointsSameError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandlerException
{
CityModel
model
=
new
CityModel
();
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testReadingInnerRingsNestedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_InnerRingNested.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
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
());
}
ConsecutivePointsSameError
err
=
new
ConsecutivePointsSameError
();
err
.
setLinearRingId
(
"ringId"
);
err
.
setVertex1
(
new
DirectPosition
(
1
,
2
,
3
));
err
.
setVertex2
(
new
DirectPosition
(
5
,
6
,
7
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testReadingHoleOutsideError
()
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
());
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
testReadingNonPlanarNormalsDeviationError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.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
NonPlanarNormalsDeviation
);
NonPlanarNormalsDeviation
err
=
(
NonPlanarNormalsDeviation
)
validationError
;
assertEquals
(
"_Simple_BD.1_PG.1"
,
err
.
getPolygonId
());
assertEquals
(
1.0
,
err
.
getDeviation
().
getValue
());
assertEquals
(
"deg"
,
err
.
getDeviation
().
getUom
());
}
void
testHoleOutsideError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandlerException
{
CityModel
model
=
new
CityModel
();
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testReadingOrientationRingsSameError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_OrientationRingsSame.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
OrientationRingsSame
);
OrientationRingsSame
err
=
(
OrientationRingsSame
)
validationError
;
assertEquals
(
"_Simple_BD.1_PG.1"
,
err
.
getPolygonId
());
assertEquals
(
"_Simple_BD.1_PG.1_Ring1"
,
err
.
getLinearRingId
());
}
HoleOutsideError
err
=
new
HoleOutsideError
();
err
.
setLinearRingId
(
"ringId"
);
err
.
setPolygonId
(
"polyId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testReadingAllPolygonsWrongOrientationError
()
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
());
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
testReadingPolygonWrongOrientationError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_PolygonWrongOrientation.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
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
);
}
void
testInnerRingsNestedError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandlerException
{
CityModel
model
=
new
CityModel
();
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testReadingNonManifoldVertexError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_NonManifoldVertex.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
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
);
}
InnerRingsNestedError
err
=
new
InnerRingsNestedError
();
err
.
setLinearRingId1
(
"ringId1"
);
err
.
setLinearRingId2
(
"ringId2"
);
err
.
setPolygonId
(
"polyId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testReadingNonManifoldEdgeError
()
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
);
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
testReadingSolidNotClosedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
CityModel
cityModel
=
readCityGml
(
"src/test/resources/SimpleSolid_SolidNotClosed.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
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
);
}
void
testInteriorDisconnectedError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandlerException
{
CityModel
model
=
new
CityModel
();
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testReadingTooFewPolygonsError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
,
FileNotFoundException
{
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
());
}
InteriorDisconnectedError
err
=
new
InteriorDisconnectedError
();
err
.
setPolygonId
(
"polyId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testReadingMultipleConnectedComponentsError
()
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
());
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingMultipleConnectedComponentsError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
IntersectingRingsError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
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
));
}
ValidationResult
res
=
fillCityModel
(
model
);
@Test
void
testWritingTooFewPolygonsError
()
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
);
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
());
}
IntersectingRingsError
err
=
new
IntersectingRingsError
();
err
.
setLinearRingId1
(
"ringId1"
);
err
.
setLinearRingId2
(
"ringId2"
);
err
.
setPolygonId
(
"polyId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
@Test
void
testWritingSolidNotClosedError
()
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
);
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingNonManifoldEdgeError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
MultipleComponentsError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
NonManifoldEdge
error
=
new
NonManifoldEdge
();
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
);
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
);
ValidationResult
res
=
fillCityModel
(
model
);
MultipleComponentsError
err
=
new
MultipleComponentsError
();
err
.
setGeometryId
(
"geomId"
);
PolygonIdList
polygons
=
new
PolygonIdList
();
polygons
.
getPolygonIds
().
add
(
"test1"
);
polygons
.
getPolygonIds
().
add
(
"test2"
);
err
.
getComponents
().
add
(
new
PolygonIdListProperty
(
polygons
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
Writing
NonManifold
Vertex
Error
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
testNonManifold
Edge
Error
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
NonManifoldVertex
error
=
new
NonManifoldVertex
();
error
.
setGeometryId
(
"TestGeometry"
);
DirectPosition
vertex
=
new
DirectPosition
();
vertex
.
getValue
().
add
(
10.0
);
error
.
setVertex
(
vertex
);
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
);
NonManifoldVertex
error2
=
(
NonManifoldVertex
)
valError
;
assertEquals
(
error
.
getGeometryId
(),
error2
.
getGeometryId
());
assertEquals
(
error
.
getVertex
().
getValue
().
get
(
0
),
error2
.
getVertex
().
getValue
().
get
(
0
));
ValidationResult
res
=
fillCityModel
(
model
);
NonManifoldEdgeError
err
=
new
NonManifoldEdgeError
();
err
.
setGeometryId
(
"geomId"
);
EdgeList
edges
=
new
EdgeList
();
Edge
edge
=
new
Edge
();
edge
.
setFrom
(
new
DirectPosition
(
1
,
2
,
3
));
edge
.
setTo
(
new
DirectPosition
(
5
,
6
,
7
));
edges
.
getEdges
().
add
(
new
EdgeProperty
(
edge
));
err
.
setEdges
(
new
EdgeListProperty
(
edges
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingPolygonWrongOrientationError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
NonManifoldVertexError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
PolygonWrongOrientation
error
=
new
PolygonWrongOrientation
();
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
);
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
);
ValidationResult
res
=
fillCityModel
(
model
);
NonManifoldVertexError
err
=
new
NonManifoldVertexError
();
err
.
setGeometryId
(
"geomId"
);
err
.
setVertex
(
new
DirectPosition
(
1
,
2
,
3
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
W
ri
tingAllPolygonsWrongOrientationError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
O
ri
entationRingsSameError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
AllPolygonsWrongOrientation
error
=
new
AllPolygonsWrongOrientation
();
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
);
AllPolygonsWrongOrientation
error2
=
(
AllPolygonsWrongOrientation
)
valError
;
assertEquals
(
error
.
getGeometryId
(),
error2
.
getGeometryId
());
ValidationResult
res
=
fillCityModel
(
model
);
OrientationRingsSameError
err
=
new
OrientationRingsSameError
();
err
.
setLinearRing
(
"ring1"
);
err
.
setPolygonId
(
"polyId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingOrientationRingsSameError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
PlanarDistancePlaneError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
OrientationRingsSame
error
=
new
OrientationRingsSame
();
error
.
setPolygonId
(
"TestPolygon"
);
error
.
setLinearRingId
(
"TestRing"
);
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
);
OrientationRingsSame
error2
=
(
OrientationRingsSame
)
valError
;
assertEquals
(
error
.
getPolygonId
(),
error2
.
getPolygonId
());
assertEquals
(
error
.
getLinearRingId
(),
error2
.
getLinearRingId
());
ValidationResult
res
=
fillCityModel
(
model
);
PlanarDistancePlaneError
err
=
new
PlanarDistancePlaneError
();
err
.
setPolygonId
(
"polyId"
);
err
.
setDistance
(
new
Length
(
5
d
,
"m"
));
err
.
setVertex
(
new
DirectPosition
(
1
,
2
,
3
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingNon
PlanarNormalsDeviationError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
testPlanarNormalsDeviationError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
NonPlanarNormalsDeviation
error
=
new
NonPlanarNormalsDeviation
();
error
.
setPolygonId
(
"TestPolygon"
);
Angle
deviation
=
new
Angle
();
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
());
ValidationResult
res
=
fillCityModel
(
model
);
PlanarNormalsDeviationError
err
=
new
PlanarNormalsDeviationError
();
err
.
setPolygonId
(
"polyId"
);
err
.
setDeviation
(
new
Angle
(
5
d
,
"deg"
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingHoleOutsideError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
PolygonWrongOrientationError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
HoleOutside
error
=
new
HoleOutside
();
error
.
setPolygonId
(
"TestPolygon"
);
error
.
setLinearRingId
(
"TestRing1"
);
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
);
HoleOutside
error2
=
(
HoleOutside
)
valError
;
assertEquals
(
error
.
getPolygonId
(),
error2
.
getPolygonId
());
assertEquals
(
error
.
getLinearRingId
(),
error2
.
getLinearRingId
());
ValidationResult
res
=
fillCityModel
(
model
);
PolygonWrongOrientationError
err
=
new
PolygonWrongOrientationError
();
err
.
setGeometryId
(
"geomId"
);
EdgeList
edges
=
new
EdgeList
();
Edge
edge
=
new
Edge
();
edge
.
setFrom
(
new
DirectPosition
(
1
,
2
,
3
));
edge
.
setTo
(
new
DirectPosition
(
5
,
6
,
7
));
edges
.
getEdges
().
add
(
new
EdgeProperty
(
edge
));
err
.
setEdges
(
new
EdgeListProperty
(
edges
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingInnerRingsNestedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
RingNotClosedError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
InnerRingsNested
error
=
new
InnerRingsNested
();
error
.
setPolygonId
(
"TestPolygon"
);
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
());
ValidationResult
res
=
fillCityModel
(
model
);
RingNotClosedError
err
=
new
RingNotClosedError
();
err
.
setLinearRingId
(
"ringId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingNonPlanarDistancePlaneError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
RingSelfIntersectionError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
NonPlanarDistancePlane
error
=
new
NonPlanarDistancePlane
();
error
.
setPolygonId
(
"TestPolygon"
);
DirectPosition
vertex
=
new
DirectPosition
();
vertex
.
getValue
().
add
(
1.0
);
error
.
setVertex
(
vertex
);
Length
distance
=
new
Length
(
0.1
);
distance
.
setUom
(
"m"
);
error
.
setDistance
(
distance
);
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
);
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
);
ValidationResult
res
=
fillCityModel
(
model
);
RingSelfIntersectionError
err
=
new
RingSelfIntersectionError
();
err
.
setLinearRingId
(
"ringId"
);
Edge
edge
=
new
Edge
();
edge
.
setFrom
(
new
DirectPosition
(
1
,
2
,
3
));
edge
.
setTo
(
new
DirectPosition
(
5
,
6
,
7
));
err
.
setEdge1
(
new
EdgeProperty
(
edge
));
err
.
setEdge2
(
new
EdgeProperty
(
edge
));
err
.
setType
(
RingSelfIntType
.
EDGE_INTERSECTION
);
err
.
setVertex1
(
new
DirectPosition
(
1
,
2
,
3
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
Writing
Intersecti
ngRingsError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
RingSelf
Intersecti
onErrorDegenerateRing
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
IntersectingRings
error
=
new
IntersectingRings
();
error
.
setPolygonId
(
"TestPolygon"
);
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
);
IntersectingRings
error2
=
(
IntersectingRings
)
valError
;
assertEquals
(
error
.
getPolygonId
(),
error2
.
getPolygonId
());
assertEquals
(
error
.
getLinearRingId1
(),
error2
.
getLinearRingId1
());
assertEquals
(
error
.
getLinearRingId2
(),
error2
.
getLinearRingId2
());
ValidationResult
res
=
fillCityModel
(
model
);
RingSelfIntersectionError
err
=
new
RingSelfIntersectionError
();
err
.
setLinearRingId
(
"ringId"
);
err
.
setType
(
RingSelfIntType
.
DEGENERATED_RING
);
err
.
setVertex1
(
new
DirectPosition
(
1
,
2
,
3
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingInteriorDisconnectedError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
RingTooFewPointsError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
InteriorDisconnected
error
=
new
InteriorDisconnected
();
error
.
setPolygonId
(
"TestPolygon"
);
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
());
ValidationResult
res
=
fillCityModel
(
model
);
RingTooFewPointsError
err
=
new
RingTooFewPointsError
();
err
.
setLinearRingId
(
"ringId"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingRingNotClosedError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
SemanticAttributeMissingError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
RingNotClosed
error
=
new
RingNotClosed
();
error
.
setLinearRingId
(
"TestRing"
);
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
);
RingNotClosed
error2
=
(
RingNotClosed
)
valError
;
assertEquals
(
error
.
getLinearRingId
(),
error2
.
getLinearRingId
());
ValidationResult
res
=
fillCityModel
(
model
);
SemanticAttributeMissingError
err
=
new
SemanticAttributeMissingError
();
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
test
WritingTooFewPointsError
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
SemanticAttributeWrongValueError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
TooFewPoints
error
=
new
TooFewPoints
();
error
.
setLinearRingId
(
"TestRing"
);
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
);
TooFewPoints
error2
=
(
TooFewPoints
)
valError
;
assertEquals
(
error
.
getLinearRingId
(),
error2
.
getLinearRingId
());
ValidationResult
res
=
fillCityModel
(
model
);
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
test
WritingConsecutiveSameError
()
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
SolidNotClosedError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAXException
,
IOException
,
SchemaHandler
Exception
{
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
);
ConsecutivePointsSame
error
=
new
ConsecutivePointsSame
();
error
.
setLinearRingId
(
"TestRing"
);
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
);
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
));
ValidationResult
res
=
fillCityModel
(
model
);
SolidNotClosedError
err
=
new
SolidNotClosedError
();
err
.
setGeometryId
(
"geomId"
);
EdgeList
edges
=
new
EdgeList
();
Edge
edge
=
new
Edge
();
edge
.
setFrom
(
new
DirectPosition
(
1
,
2
,
3
));
edge
.
setTo
(
new
DirectPosition
(
5
,
6
,
7
));
edges
.
getEdges
().
add
(
new
EdgeProperty
(
edge
));
err
.
setEdges
(
new
EdgeListProperty
(
edges
));
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingRing
SelfIntersection
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
Solid
SelfIntersection
Error
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
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
);
RingSelfIntersection
error
=
new
RingSelfIntersection
();
error
.
setType
(
RingSelfIntType
.
DUPLICATE_POINT
);
error
.
setLinearRingId
(
"TestRing"
);
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
));
ValidationResult
res
=
fillCityModel
(
model
);
SolidSelfIntersectionError
err
=
new
SolidSelfIntersectionError
();
err
.
setGeometryId
(
"geomId"
);
err
.
setPolygonId1
(
"poly1"
);
err
.
setPolygonId2
(
"poly2"
);
res
.
getErrors
().
add
(
new
AbstractErrorProperty
(
err
));
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
@Test
void
test
WritingValidationPlan
()
throws
ADE
Exception
,
CityGMLBuilderException
,
CityGMLWriteException
,
CityGMLRead
Exception
{
void
test
SolidTooFewPolygonsError
()
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
,
SAX
Exception
,
IOException
,
SchemaHandler
Exception
{
CityModel
model
=
new
CityModel
();
Validation
val
=
new
Validation
();
model
.
addGenericApplicationPropertyOfCityModel
(
val
);
ValidationResult
res
=
fillCityModel
(
model
);
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
);
val
.
setValidationSoftware
(
"CityDoctor2"
);
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
);
byte
[]
buf
=
writeModel
(
model
);
assertTrue
(
validate
(
new
ByteArrayInputStream
(
buf
)));
}
private
CityModel
readCityGml
(
InputStream
input
)
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
{
CityGMLContext
context
=
CityGMLContext
.
getInstance
();
List
<
ADEContext
>
adeContexts
=
context
.
getADEContexts
();
if
(
adeContexts
.
isEmpty
())
{
for
(
ADEContext
adeContext
:
ServiceLoader
.
load
(
ADEContext
.
class
))
{
context
.
registerADEContext
(
adeContext
);
private
boolean
validate
(
InputStream
stream
)
throws
SAXException
,
IOException
,
CityGMLContextException
,
SchemaHandlerException
{
CityGMLContext
context
=
CityGMLContext
.
newInstance
();
CityGMLSchemaHandler
schemaHandler
=
context
.
getDefaultSchemaHandler
();
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
();
CityGMLInputFactory
in
=
builder
.
createCityGMLInputFactory
();
in
.
setProperty
(
CityGMLInputFactory
.
USE_VALIDATION
,
true
);
in
.
setProperty
(
CityGMLInputFactory
.
FEATURE_READ_MODE
,
FeatureReadMode
.
NO_SPLIT
);
in
.
setValidationEventHandler
(
event
->
{
System
.
out
.
print
(
"["
+
event
.
getLocator
().
getLineNumber
()
+
","
+
event
.
getLocator
().
getColumnNumber
()
+
"] "
);
System
.
out
.
println
(
event
.
getMessage
()
);
throw
new
IllegalStateException
(
event
.
getLinkedException
());
@Override
public
void
warning
(
SAXParseException
exception
)
{
error
(
exception
);
}
@Override
public
void
fatalError
(
SAXParseException
exception
)
{
error
(
exception
);
}
});
CityModel
cityModel
;
try
(
CityGMLReader
reader
=
in
.
createCityGMLReader
(
"?"
,
input
))
{
cityModel
=
(
CityModel
)
reader
.
nextFeature
();
}
return
cityModel
;
}
private
CityModel
readCityGml
(
File
f
)
throws
FileNotFoundException
,
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
{
return
readCityGml
(
new
FileInputStream
(
f
));
validator
.
validate
(
new
StreamSource
(
stream
));
return
!
foundErrors
[
0
];
}
private
CityModel
readCityGml
(
String
fileName
)
throws
FileNotFoundException
,
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
{
return
readCityGml
(
new
File
(
fileName
));
}
private
byte
[]
writeModel
(
CityModel
model
)
throws
ADEException
,
CityGMLContextException
,
CityGMLWriteException
{
private
CityModel
readCityGml
(
byte
[]
bytes
)
throws
ADEException
,
CityGMLBuilderException
,
CityGMLReadException
{
return
readCityGml
(
new
ByteArrayInputStream
(
bytes
));
CityGMLContext
context
=
CityGMLContext
.
newInstance
();
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
)
{
assertFalse
(
cityModel
.
getGenericApplicationPropertyOfCityModel
().
isEmpty
());
List
<
ADEComponent
>
ades
=
cityModel
.
getGenericApplicationPropertyOfCityModel
();
ADEComponent
adeComponent
=
ades
.
get
(
0
);
assertTrue
(
adeComponent
instanceof
Validation
);
Validation
val
=
(
Validation
)
adeComponent
;
ZonedDateTime
expectedDate
=
LocalDateTime
.
of
(
2002
,
5
,
30
,
9
,
0
).
atZone
(
ZoneId
.
systemDefault
());
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
ValidationResult
fillCityModel
(
CityModel
model
)
{
Validation
v
=
new
Validation
();
v
.
setId
(
"planId"
);
model
.
getFeatureMembers
().
add
(
new
AbstractFeatureProperty
(
v
));
v
.
setValidationSoftware
(
"testSoftware"
);
v
.
setValidationDate
(
ZonedDateTime
.
now
());
ValidationPlan
plan
=
new
ValidationPlan
();
private
byte
[]
writeCityGml
(
CityModel
model
)
throws
ADEException
,
CityGMLBuilderException
,
CityGMLWriteException
{
CityGMLContext
context
=
CityGMLContext
.
getInstance
();
List
<
ADEContext
>
adeContexts
=
context
.
getADEContexts
();
if
(
adeContexts
==
null
||
adeContexts
.
isEmpty
())
{
for
(
ADEContext
adeContext
:
ServiceLoader
.
load
(
ADEContext
.
class
))
{
context
.
registerADEContext
(
adeContext
);
}
}
Statistics
stats
=
new
Statistics
();
FeatureStatistics
fStats
=
new
FeatureStatistics
();
fStats
.
setNumChecked
(
5
);
fStats
.
setNumErrors
(
2
);
stats
.
setNumErrorBridgeObjects
(
new
FeatureStatisticsProperty
(
fStats
));
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
();
CityGMLOutputFactory
outputFactory
=
builder
.
createCityGMLOutputFactory
(
CityGMLVersion
.
DEFAULT
);
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
();
}
}
Building
b
=
new
Building
();
b
.
setId
(
"testId"
);
model
.
getCityObjectMembers
().
add
(
new
AbstractCityObjectProperty
(
b
));
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
;
}
}
citygml4j-quality-ade/src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml
View file @
38715130
<?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
Modell
iert
m
it
Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
<!--
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
referenz
iert
C
it
yGML 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: -->
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>
<core:cityObjectMember>
<bldg:Building
gml:id=
"_Simple_BD.1"
>
<qual:validationResult
result=
"ERROR"
>
<qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:linearRingId>
_Simple_BD.1_PG.6_LR.1
</qual:linearRingId>
<qual:vertex1>
11.5 10.0 4.5
</qual:vertex1>
<qual:vertex2>
11.5 10.0 4.5
</qual:vertex2>
</qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:validationResult>
<qual:ValidationResult>
<qual:validationPlanID
xlink:href=
"#idvalue0"
/>
<qual:error>
<qual:GE_R_CONSECUTIVE_POINTS_SAME>
<qual:linearRingId>
_Simple_BD.1_PG.6_LR.1
</qual:linearRingId>
<qual:vertex1>
11.5 10.0 4.5
</qual:vertex1>
<qual:vertex2>
11.5 10.0 4.5
</qual:vertex2>
</qual:GE_R_CONSECUTIVE_POINTS_SAME>
</qual:error>
<qual:resultType>
ERROR
</qual:resultType>
</qual:ValidationResult>
</qual:validationResult>
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.1"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.2"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.3"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.4"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.5"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.6"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.7"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.1"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.2"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.3"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.4"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.5"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.6"
/>
<gml:surfaceMember
xlink:href=
"#_Simple_BD.1_PG.7"
/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
...
...
@@ -77,7 +87,8 @@ Lizenz:
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
10.0
15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
...
...
@@ -124,7 +135,8 @@ Lizenz:
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
13.0
10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
...
...
@@ -148,8 +160,9 @@ Lizenz:
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
10.0
10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
...
...
@@ -199,59 +212,245 @@ Lizenz:
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
<qual:validation>
<qual:validationDate>
2002-05-30T09:00:00
</qual:validationDate>
<qual:validationSoftware>
CityDoctor2
</qual:validationSoftware>
<qual:validationPlan>
<qual:globalParameters>
<qual:parameter
name=
"numberOfRoundingPlaces"
>
8
</qual:parameter>
<qual:parameter
name=
"minVertexDistance"
uom=
"m"
>
0.0001
</qual:parameter>
<qual:parameter
name=
"schematronFile"
></qual:parameter>
</qual:globalParameters>
<qual:requirement
name=
"R_GE_R_TOO_FEW_POINTS"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_R_NOT_CLOSED"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_R_CONSECUTIVE_POINTS_SAME"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_R_SELF_INTERSECTION"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_R_NOT_CLOSED"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_P_NON_PLANAR"
enabled=
"true"
>
<qual:parameter
name=
"type"
>
distance
</qual:parameter>
<qual:parameter
name=
"distanceTolerance"
uom=
"m"
>
0.01
</qual:parameter>
<qual:parameter
name=
"angleTolerance"
uom=
"deg"
>
1
</qual:parameter>
<qual:parameter
name=
"degeneratedPolygonTolerance"
uom=
"m"
>
0.0000
</qual:parameter>
</qual:requirement>
<qual:requirement
name=
"R_GE_P_INTERIOR_DISCONNECTED"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_P_INTERSECTING_RINGS"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_P_HOLE_OUTSIDE"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_P_ORIENTATION_RINGS_SAME"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_P_INNER_RINGS_NESTED"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_TOO_FEW_POLYGONS"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_NOT_CLOSED"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_NON_MANIFOLD_EDGE"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_POLYGON_WRONG_ORIENTATION"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_NON_MANIFOLD_VERTEX"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_SELF_INTERSECTION"
enabled=
"true"
/>
<qual:requirement
name=
"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"
enabled=
"true"
/>
<qual:filter>
<qual:checking>
BUILDING
</qual:checking>
<qual:checking>
TRANSPORTATION
</qual:checking>
<qual:checking>
VEGETATION
</qual:checking>
<qual:checking>
BRIDGE
</qual:checking>
<qual:checking>
WATER
</qual:checking>
<qual:checking>
LAND
</qual:checking>
</qual:filter>
</qual:validationPlan>
<qual:statistics>
<qual:numErrorBuildings
numChecked=
"1"
>
1
</qual:numErrorBuildings>
<qual:numErrorVegetation
numChecked=
"0"
>
0
</qual:numErrorVegetation>
<qual:numErrorLandObjects
numChecked=
"0"
>
0
</qual:numErrorLandObjects>
<qual:numErrorBridgeObjects
numChecked=
"0"
>
0
</qual:numErrorBridgeObjects>
<qual:numErrorWaterObjects
numChecked=
"0"
>
0
</qual:numErrorWaterObjects>
<qual:numErrorTransportation
numChecked=
"0"
>
0
</qual:numErrorTransportation>
<qual:errorStatistics>
<qual:error
name=
"GE_R_CONSECUTIVE_POINTS_SAME"
>
1
</qual:error>
</qual:errorStatistics>
</qual:statistics>
</qual:validation>
<core:cityObjectMember>
<qual:Validation
gml:id=
"idvalue0"
>
<qual:validationDate>
2002-05-30T09:00:00
</qual:validationDate>
<qual:validationSoftware>
CityDoctor2
</qual:validationSoftware>
<qual:statistics>
<qual:Statistics>
<qual:numErrorBuildings>
<qual:FeatureStatistics>
<qual:numChecked>
1
</qual:numChecked>
<qual:numErrors>
1
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorBuildings>
<qual:numErrorVegetation>
<qual:FeatureStatistics>
<qual:numChecked>
0
</qual:numChecked>
<qual:numErrors>
0
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorVegetation>
<qual:numErrorLandObjects>
<qual:FeatureStatistics>
<qual:numChecked>
0
</qual:numChecked>
<qual:numErrors>
0
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorLandObjects>
<qual:numErrorBridgeObjects>
<qual:FeatureStatistics>
<qual:numChecked>
0
</qual:numChecked>
<qual:numErrors>
0
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorBridgeObjects>
<qual:numErrorWaterObjects>
<qual:FeatureStatistics>
<qual:numChecked>
0
</qual:numChecked>
<qual:numErrors>
0
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorWaterObjects>
<qual:numErrorTransportation>
<qual:FeatureStatistics>
<qual:numChecked>
0
</qual:numChecked>
<qual:numErrors>
0
</qual:numErrors>
</qual:FeatureStatistics>
</qual:numErrorTransportation>
<qual:error>
<qual:Error>
<qual:occurrences>
1
</qual:occurrences>
<qual:name>
GE_R_CONSECUTIVE_POINTS_SAME
</qual:name>
</qual:Error>
</qual:error>
</qual:Statistics>
</qual:statistics>
<qual:validationPlan>
<qual:ValidationPlan>
<qual:globalParameters>
<qual:GlobalParameters>
<qual:parameter>
<qual:Parameter>
<qual:name>
numberOfRoundingPlaces
</qual:name>
<qual:value>
8
</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>
minVertexDistance
</qual:name>
<qual:uom>
m
</qual:uom>
<qual:value>
0.0001
</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>
schematronFile
</qual:name>
<qual:value></qual:value>
</qual:Parameter>
</qual:parameter>
</qual:GlobalParameters>
</qual:globalParameters>
<qual:filter>
<qual:Filter>
<qual:checking>
<qual:Checking>
<qual:featureType>
BUILDING
</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>
TRANSPORTATION
</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>
VEGETATION
</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>
BRIDGE
</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>
WATER
</qual:featureType>
</qual:Checking>
</qual:checking>
<qual:checking>
<qual:Checking>
<qual:featureType>
LAND
</qual:featureType>
</qual:Checking>
</qual:checking>
</qual:Filter>
</qual:filter>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_R_TOO_FEW_POINTS
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_R_NOT_CLOSED
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_R_CONSECUTIVE_POINTS_SAME
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_R_SELF_INTERSECTION
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_NON_PLANAR
</qual:requirementType>
<qual:parameter>
<qual:Parameter>
<qual:name>
type
</qual:name>
<qual:value>
distance
</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>
distanceTolerance
</qual:name>
<qual:uom>
m
</qual:uom>
<qual:value>
0.01
</qual:value>
</qual:Parameter>
</qual:parameter>
<qual:parameter>
<qual:Parameter>
<qual:name>
angleTolerance
</qual:name>
<qual:uom>
deg
</qual:uom>
<qual:value>
1
</qual:value>
</qual:Parameter>
</qual:parameter>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_INTERIOR_DISCONNECTED
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_INTERSECTING_RINGS
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_HOLE_OUTSIDE
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_ORIENTATION_RINGS_SAME
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_P_INNER_RINGS_NESTED
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_TOO_FEW_POLYGONS
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_NOT_CLOSED
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_NON_MANIFOLD_EDGE
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_POLYGON_WRONG_ORIENTATION
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_NON_MANIFOLD_VERTEX
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_SELF_INTERSECTION
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
<qual:requirement>
<qual:Requirement>
<qual:enabled>
true
</qual:enabled>
<qual:requirementType>
R_GE_S_MULTIPLE_CONNECTED_COMPONENTS
</qual:requirementType>
</qual:Requirement>
</qual:requirement>
</qual:ValidationPlan>
</qual:validationPlan>
</qual:Validation>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
citygml4j-quality-ade/src/test/resources/SimpleSolid_HoleOutside.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_InnerRingNested.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_InteriorDisconnected.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_IntersectingRings.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_MultipleConnectedComponents.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldEdge.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldVertex.gml
deleted
100644 → 0
View file @
6cf1abce
<?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
Prev
1
…
5
6
7
8
9
10
Next