Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
96df162f
Commit
96df162f
authored
Sep 17, 2026
by
Numanoglu
Browse files
WIP checker corrected for real GML sweep tests
parent
68c77dbc
Pipeline
#12447
passed with stage
in 2 minutes and 35 seconds
Changes
2
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/Extensions/CityDoctorHealer/src/test/java/de/hft/stuttgart/citydoctor2/healing/SweepUtilitiesRealGmlTest.java
View file @
96df162f
...
...
@@ -15,7 +15,9 @@ import org.junit.Test;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.check.CheckResult
;
import
de.hft.stuttgart.citydoctor2.check.Checker
;
import
de.hft.stuttgart.citydoctor2.check.ErrorId
;
import
de.hft.stuttgart.citydoctor2.check.Requirement
;
import
de.hft.stuttgart.citydoctor2.check.ResultStatus
;
import
de.hft.stuttgart.citydoctor2.check.ValidationConfiguration
;
import
de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError
;
...
...
@@ -32,31 +34,40 @@ import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
* @Numanoglu
*
* WIP !
*
* Die empfohlenen Daten liegen im Ordner:
* src/test/resources/sweep/non-planar-distance-plane
*
* Aktuell sind folgende Probleme
* Validation via GUI (rendert nicht aber)
* zeigt GebäudeElemente mit NonPlanar-Fehlern an.
* Export ebendieser Gebäude führt zu leeren gml-Objekten
*
* Hierunten lief ich deshalb über das ganze Model anstatt einzelner fehlerhafte Buildings dessen!
* Doch scheinen die Modelle de facto keine Nonplanar-Fehler zu enthalten
*
* Den Test habe ich dennoch weiter entwickelt, sodass im Falle anständiger Daten das Konzept schon steht.
* Fortsetzung folgt...
*
* */
/**
* Export einzelner Buildings funktioniert noch immer nicht
*
* Führt den Planaritätscheck über den normalen CityDoctor-Checker aus.
*
* Wichtig: Der PlanarCheck sollte hier nicht isoliert per
* geometry.accept(check) aufgerufen werden. Der Checker bildet den echten
* Validierungspfad nach: Er initialisiert die Check-Parameter, berücksichtigt
* Abhängigkeiten und bereitet die Geometrien vor. Dadurch entspricht der Test
* eher dem Verhalten aus GUI und regulärer Validierung.
*
* Der Parameter type = both aktiviert beide Planaritätsvarianten:
* distance: Punktabstand zur Regressionsebene, liefert
* GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE.
* angle: Normalenabweichung der triangulierten Teilflächen, liefert
* GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION.
*
* Für den Sweep ist momentan vor allem der DistancePlane-Fehler relevant,
* weil dieser bereits eine Zielebene im NonPlanarPolygonDistancePlaneError
* mitliefert. Die Normalenabweichung wird hier trotzdem mitgeprüft, damit der
* Test sichtbar macht, ob eine reale GUI-Meldung zwar non-planar ist, aber
* noch nicht in den aktuellen Sweep-Pfad fällt.
*/
public
class
SweepUtilitiesRealGmlTest
{
private
static
final
double
POINT_ON_PLANE_TOLERANCE
=
0.001
;
private
static
final
double
SWEEP_EDGE_AND_ANGLE_TOLERANCE
=
0.001
;
private
static
final
String
STRICT_PLANAR_DISTANCE_TOLERANCE
=
"0.001"
;
private
static
final
String
PLANAR_CHECK_TYPE
=
PlanarCheck
.
BOTH
;
/**
* Reales ganzes CityGML . Der Test lädt die Datei über den
* Reales ganzes CityGML
:NpR1
. Der Test lädt die Datei über den
* normalen Parser, lässt den PlanarCheck laufen und versucht die gefundenen
* DistancePlane-Fehler mit dem aktuellen Sweep-Stand zu heilen.
*/
...
...
@@ -66,8 +77,8 @@ public class SweepUtilitiesRealGmlTest {
}
/**
* Reales größeres GML mit bekannten val3dity-Volumenfehlern(AG-Qual).
Für den Sweep ist
* hier zuerst wichtig, ob zusätzlich passende nicht-planare Polygonfehler vom
* Reales größeres GML
:LoD21005WithVal3dityErrors:
mit bekannten val3dity-Volumenfehlern(AG-Qual).
*
Für den Sweep ist
hier zuerst wichtig, ob zusätzlich passende nicht-planare Polygonfehler vom
* Typ DistancePlane gefunden werden. (Da einzelne Gebäude-Exports mit solchen Fehler 0byte-Daten)
*/
@Test
...
...
@@ -77,20 +88,39 @@ public class SweepUtilitiesRealGmlTest {
"src/test/resources/sweep/non-planar-distance-plane/LoD2_10_05_mit_val3dity_volumenfehlern.gml"
);
}
/**
* Reales CityGML: LoD2_426_6002_2_SH. Diese Datei wurde im GUI Starter bereits
* als passend untersucht.
* Es muss NonPlanarDistancePlane-Fehler enthalten!
*/
@Test
public
void
reportsAndTriesSweepForLoD242660022Sh
()
throws
CityGmlParseException
,
IOException
,
InvalidGmlFileException
{
checkRealGmlAndTrySweepHealing
(
"src/test/resources/sweep/non-planar-distance-plane/LoD2_426_6002_2_SH.xml"
);
}
private
void
checkRealGmlAndTrySweepHealing
(
String
path
)
throws
CityGmlParseException
,
IOException
,
InvalidGmlFileException
{
ValidationConfiguration
config
=
ValidationConfiguration
.
loadStandardValidationConfig
();
config
.
setSchematronFilePathInGlobalParameters
(
null
);
config
.
getRequirements
().
get
(
Requirement
.
R_GE_P_NON_PLANAR
.
toString
()).
getParameters
()
.
put
(
PlanarCheck
.
TYPE
,
PLANAR_CHECK_TYPE
);
config
.
getRequirements
().
get
(
Requirement
.
R_GE_P_NON_PLANAR
.
toString
()).
getParameters
()
.
put
(
PlanarCheck
.
DISTANCE_TOLERANCE
,
STRICT_PLANAR_DISTANCE_TOLERANCE
);
CityDoctorModel
model
=
TestUtil
.
loadCityModel
(
path
,
config
);
runPlanarCheck
(
model
);
Checker
checker
=
new
Checker
(
config
,
model
);
checker
.
runChecks
();
List
<
NonPlanarPolygonDistancePlaneError
>
errors
=
collectDistancePlaneErrors
(
model
);
Map
<
ErrorId
,
Integer
>
errorCounts
=
countErrorsById
(
model
);
System
.
out
.
println
();
System
.
out
.
println
(
"=== Real-GML Sweep-Test ==="
);
System
.
out
.
println
(
"Datei: "
+
path
);
System
.
out
.
println
(
"PlanarCheck: Typ distance, distanceTolerance = "
+
STRICT_PLANAR_DISTANCE_TOLERANCE
);
printModelSummary
(
model
);
System
.
out
.
println
(
"PlanarCheck: Typ "
+
PLANAR_CHECK_TYPE
+
", distanceTolerance = "
+
STRICT_PLANAR_DISTANCE_TOLERANCE
);
System
.
out
.
println
(
"Fehlerzählung nach ErrorId: "
+
errorCounts
);
System
.
out
.
println
(
"Gefundene NonPlanarDistancePlane-Fehler: "
+
errors
.
size
());
assertFalse
(
"Die Datei muss mindestens einen NonPlanarPolygonDistancePlaneError enthalten."
,
errors
.
isEmpty
());
...
...
@@ -134,21 +164,12 @@ public class SweepUtilitiesRealGmlTest {
healedCount
>
0
);
}
private
void
runPlanarCheck
(
CityDoctorModel
model
)
{
PlanarCheck
check
=
createStrictDistancePlanarCheck
();
for
(
CityObject
cityObject
:
model
.
createFeatureStream
().
toList
())
{
for
(
Geometry
geometry
:
cityObject
.
getGeometries
())
{
geometry
.
accept
(
check
);
check
.
check
(
geometry
);
}
}
}
// Evtl.Obsolet
private
PlanarCheck
createStrictDistancePlanarCheck
()
{
PlanarCheck
check
=
new
PlanarCheck
();
Map
<
CheckId
,
Map
<
String
,
String
>>
parameters
=
new
HashMap
<>();
Map
<
String
,
String
>
planarParameters
=
new
HashMap
<>();
planarParameters
.
put
(
PlanarCheck
.
TYPE
,
P
lanarCheck
.
DISTANC
E
);
planarParameters
.
put
(
PlanarCheck
.
TYPE
,
P
LANAR_CHECK_TYP
E
);
planarParameters
.
put
(
PlanarCheck
.
DISTANCE_TOLERANCE
,
STRICT_PLANAR_DISTANCE_TOLERANCE
);
parameters
.
put
(
CheckId
.
C_GE_P_NON_PLANAR
,
planarParameters
);
check
.
init
(
parameters
,
null
);
...
...
@@ -183,6 +204,21 @@ public class SweepUtilitiesRealGmlTest {
return
errorCounts
;
}
private
void
printModelSummary
(
CityDoctorModel
model
)
{
List
<
CityObject
>
cityObjects
=
model
.
createFeatureStream
().
toList
();
int
geometryCount
=
0
;
int
polygonCount
=
0
;
for
(
CityObject
cityObject
:
cityObjects
)
{
geometryCount
+=
cityObject
.
getGeometries
().
size
();
for
(
Geometry
geometry
:
cityObject
.
getGeometries
())
{
polygonCount
+=
geometry
.
getPolygons
().
size
();
}
}
System
.
out
.
println
(
"Geladene Features: "
+
cityObjects
.
size
());
System
.
out
.
println
(
"Geladene Geometrien: "
+
geometryCount
);
System
.
out
.
println
(
"Geladene Polygone: "
+
polygonCount
);
}
private
boolean
isPolygonPlanar
(
Polygon
polygon
)
{
polygon
.
clearAllContainedCheckResults
();
PlanarCheck
check
=
createStrictDistancePlanarCheck
();
...
...
CityDoctorParent/Extensions/CityDoctorHealer/src/test/resources/sweep/non-planar-distance-plane/LoD2_426_6002_2_SH.xml
0 → 100644
View file @
96df162f
This diff is collapsed.
Click to expand it.
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