Commit 96df162f authored by Numanoglu's avatar Numanoglu
Browse files

WIP checker corrected for real GML sweep tests

parent 68c77dbc
Pipeline #12447 passed with stage
in 2 minutes and 35 seconds
...@@ -15,7 +15,9 @@ import org.junit.Test; ...@@ -15,7 +15,9 @@ import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.CheckError; import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId; import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult; 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.ErrorId;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus; import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration; import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError; import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError;
...@@ -32,31 +34,40 @@ import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException; ...@@ -32,31 +34,40 @@ import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
* @Numanoglu * @Numanoglu
* *
* WIP ! * 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 { public class SweepUtilitiesRealGmlTest {
private static final double POINT_ON_PLANE_TOLERANCE = 0.001; private static final double POINT_ON_PLANE_TOLERANCE = 0.001;
private static final double SWEEP_EDGE_AND_ANGLE_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 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 * normalen Parser, lässt den PlanarCheck laufen und versucht die gefundenen
* DistancePlane-Fehler mit dem aktuellen Sweep-Stand zu heilen. * DistancePlane-Fehler mit dem aktuellen Sweep-Stand zu heilen.
*/ */
...@@ -66,8 +77,8 @@ public class SweepUtilitiesRealGmlTest { ...@@ -66,8 +77,8 @@ public class SweepUtilitiesRealGmlTest {
} }
/** /**
* Reales größeres GML mit bekannten val3dity-Volumenfehlern(AG-Qual). Für den Sweep ist * Reales größeres GML:LoD21005WithVal3dityErrors: mit bekannten val3dity-Volumenfehlern(AG-Qual).
* hier zuerst wichtig, ob zusätzlich passende nicht-planare Polygonfehler vom * 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) * Typ DistancePlane gefunden werden. (Da einzelne Gebäude-Exports mit solchen Fehler 0byte-Daten)
*/ */
@Test @Test
...@@ -77,20 +88,39 @@ public class SweepUtilitiesRealGmlTest { ...@@ -77,20 +88,39 @@ public class SweepUtilitiesRealGmlTest {
"src/test/resources/sweep/non-planar-distance-plane/LoD2_10_05_mit_val3dity_volumenfehlern.gml"); "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) private void checkRealGmlAndTrySweepHealing(String path)
throws CityGmlParseException, IOException, InvalidGmlFileException { throws CityGmlParseException, IOException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig(); ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
config.setSchematronFilePathInGlobalParameters(null); 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); CityDoctorModel model = TestUtil.loadCityModel(path, config);
runPlanarCheck(model); Checker checker = new Checker(config, model);
checker.runChecks();
List<NonPlanarPolygonDistancePlaneError> errors = collectDistancePlaneErrors(model); List<NonPlanarPolygonDistancePlaneError> errors = collectDistancePlaneErrors(model);
Map<ErrorId, Integer> errorCounts = countErrorsById(model); Map<ErrorId, Integer> errorCounts = countErrorsById(model);
System.out.println(); System.out.println();
System.out.println("=== Real-GML Sweep-Test ==="); System.out.println("=== Real-GML Sweep-Test ===");
System.out.println("Datei: " + path); 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("Fehlerzählung nach ErrorId: " + errorCounts);
System.out.println("Gefundene NonPlanarDistancePlane-Fehler: " + errors.size()); System.out.println("Gefundene NonPlanarDistancePlane-Fehler: " + errors.size());
assertFalse("Die Datei muss mindestens einen NonPlanarPolygonDistancePlaneError enthalten.", errors.isEmpty()); assertFalse("Die Datei muss mindestens einen NonPlanarPolygonDistancePlaneError enthalten.", errors.isEmpty());
...@@ -134,21 +164,12 @@ public class SweepUtilitiesRealGmlTest { ...@@ -134,21 +164,12 @@ public class SweepUtilitiesRealGmlTest {
healedCount > 0); healedCount > 0);
} }
private void runPlanarCheck(CityDoctorModel model) { // Evtl.Obsolet
PlanarCheck check = createStrictDistancePlanarCheck();
for (CityObject cityObject : model.createFeatureStream().toList()) {
for (Geometry geometry : cityObject.getGeometries()) {
geometry.accept(check);
check.check(geometry);
}
}
}
private PlanarCheck createStrictDistancePlanarCheck() { private PlanarCheck createStrictDistancePlanarCheck() {
PlanarCheck check = new PlanarCheck(); PlanarCheck check = new PlanarCheck();
Map<CheckId, Map<String, String>> parameters = new HashMap<>(); Map<CheckId, Map<String, String>> parameters = new HashMap<>();
Map<String, String> planarParameters = new HashMap<>(); Map<String, String> planarParameters = new HashMap<>();
planarParameters.put(PlanarCheck.TYPE, PlanarCheck.DISTANCE); planarParameters.put(PlanarCheck.TYPE, PLANAR_CHECK_TYPE);
planarParameters.put(PlanarCheck.DISTANCE_TOLERANCE, STRICT_PLANAR_DISTANCE_TOLERANCE); planarParameters.put(PlanarCheck.DISTANCE_TOLERANCE, STRICT_PLANAR_DISTANCE_TOLERANCE);
parameters.put(CheckId.C_GE_P_NON_PLANAR, planarParameters); parameters.put(CheckId.C_GE_P_NON_PLANAR, planarParameters);
check.init(parameters, null); check.init(parameters, null);
...@@ -183,6 +204,21 @@ public class SweepUtilitiesRealGmlTest { ...@@ -183,6 +204,21 @@ public class SweepUtilitiesRealGmlTest {
return errorCounts; 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) { private boolean isPolygonPlanar(Polygon polygon) {
polygon.clearAllContainedCheckResults(); polygon.clearAllContainedCheckResults();
PlanarCheck check = createStrictDistancePlanarCheck(); PlanarCheck check = createStrictDistancePlanarCheck();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment