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