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
Commits
38715130
Commit
38715130
authored
Feb 02, 2023
by
Matthias Betz
Browse files
Merge branch 'citygml3'
parents
6cf1abce
bd8f73de
Pipeline
#7210
passed with stage
in 7 seconds
Changes
191
Pipelines
1
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
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment