Commit 37c28627 authored by Luna Riegel's avatar Luna Riegel
Browse files

Refactor: Extract nested static class

parent be7abbb1
...@@ -12,6 +12,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry; ...@@ -12,6 +12,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement; import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId; import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon; import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import de.hft.stuttgart.citydoctor2.utils.CollisionRecord;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -19,38 +20,38 @@ import java.util.StringJoiner; ...@@ -19,38 +20,38 @@ import java.util.StringJoiner;
public class FeatureCollisionError implements CheckError { public class FeatureCollisionError implements CheckError {
private final CityObject subjectFeature;
private final Geometry subjectGeom; private final CollisionRecord collisionRecord;
private final Geometry collidingGeom; private final CityObject subject;
private final GmlId collidingFeatureId;
private final Map<Polygon, List<Polygon>> collisionMap; public FeatureCollisionError(CollisionRecord collisionRecord, CityObject subject) {
this.collisionRecord = collisionRecord;
public FeatureCollisionError(CityObject subjectFeature, Geometry subjectGeom, GmlId collidingFeatureId, Geometry collidingGeom, Map<Polygon, List<Polygon>> collisionMap) { this.subject = subject;
this.subjectFeature = subjectFeature;
this.subjectGeom = subjectGeom;
this.collidingFeatureId = collidingFeatureId;
this.collidingGeom = collidingGeom;
this.collisionMap = collisionMap;
} }
public CityObject getSubjectFeature() {
return subjectFeature; public GmlId getSubjectFeatureId() {
return collisionRecord.getSubjectFeatureId();
} }
public Geometry getSubjectGeom() { public Geometry getSubjectGeom() {
return subjectGeom; return collisionRecord.getSubjectGeom();
} }
public Geometry getCollidingGeom() { public Geometry getCollidingGeom() {
return collidingGeom; return collisionRecord.getCollidingGeom();
} }
public GmlId getCollidingFeatureId() { public GmlId getCollidingFeatureId() {
return collidingFeatureId; return collisionRecord.getCollidingFeatureId();
} }
public Map<Polygon, List<Polygon>> getCollisionMap() { public Map<Polygon, List<Polygon>> getCollisionMap() {
return collisionMap; return collisionRecord.getCollisionMap();
}
public CollisionRecord getCollisionRecord() {
return collisionRecord;
} }
@Override @Override
...@@ -65,9 +66,10 @@ public class FeatureCollisionError implements CheckError { ...@@ -65,9 +66,10 @@ public class FeatureCollisionError implements CheckError {
@Override @Override
public GmlElement getFeature() { public GmlElement getFeature() {
return subjectFeature; return subject;
} }
@Override @Override
public void accept(ErrorVisitor errorVisitor) { public void accept(ErrorVisitor errorVisitor) {
errorVisitor.visit(this); errorVisitor.visit(this);
...@@ -81,15 +83,16 @@ public class FeatureCollisionError implements CheckError { ...@@ -81,15 +83,16 @@ public class FeatureCollisionError implements CheckError {
@Override @Override
public void report(ErrorReport report) { public void report(ErrorReport report) {
report.add("Geometry", subjectGeom.getGmlId().toString()); report.add("Geometry", collisionRecord.getSubjectGeom().getGmlId().toString());
report.add("Colliding with Feature", collidingFeatureId.toString()); report.add("Colliding with Feature", collisionRecord.getCollidingFeatureId().toString());
report.add("In Geometry", collidingGeom.getGmlId().toString()); report.add("In Geometry", collisionRecord.getCollidingGeom().getGmlId().toString());
collisionMap.forEach((subjectPoly, collisionList) -> { for (Map.Entry<Polygon, List<Polygon>> entry : collisionRecord.getCollisionMap().entrySet()) {
StringJoiner sj = new StringJoiner(", "); StringJoiner sj = new StringJoiner(", ");
collisionList.forEach(polygon -> sj.add(polygon.getGmlId().toString())); entry.getValue().forEach(polygon -> sj.add(polygon.getGmlId().toString()));
report.add("On Subject Polygon", subjectPoly.toString()); report.add("On Subject Polygon", entry.getKey().getGmlId().toString());
report.add("With Polygons", sj.toString()); report.add("With Polygons", sj.toString());
});
}
} }
} }
package de.hft.stuttgart.citydoctor2.utils;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CollisionRecord implements Serializable {
private final Geometry subjectGeom;
private final Geometry collidingGeom;
private final GmlId subjectFeatureId;
private final GmlId collidingFeatureId;
private final Map<Polygon, List<Polygon>> collisionMap;
public CollisionRecord(Geometry subjectGeom, Geometry collidingGeom, CityObject subjectFeature,
CityObject collidingFeature, List<Pair<Polygon, Polygon>> collisionPairs) {
this.subjectGeom = subjectGeom;
this.collidingGeom = collidingGeom;
this.subjectFeatureId = subjectFeature.getGmlId();
this.collidingFeatureId = collidingFeature.getGmlId();
this.collisionMap = new HashMap<>();
collisionPairs.forEach(pair -> addCollision(pair.getValue0(), pair.getValue1()));
}
private void addCollision(Polygon subjectPoly, Polygon collidingPoly){
List<Polygon> polyList = collisionMap.computeIfAbsent(subjectPoly, k -> new ArrayList<>());
polyList.add(collidingPoly);
}
public Map<Polygon, List<Polygon>> getCollisionMap() {
return Collections.unmodifiableMap(collisionMap);
}
public Geometry getSubjectGeom() {
return subjectGeom;
}
public Geometry getCollidingGeom() {
return collidingGeom;
}
public GmlId getSubjectFeatureId() {
return subjectFeatureId;
}
public GmlId getCollidingFeatureId() {
return collidingFeatureId;
}
}
...@@ -29,12 +29,14 @@ import de.hft.stuttgart.citydoctor2.datastructure.TopLevelTransportFeature; ...@@ -29,12 +29,14 @@ import de.hft.stuttgart.citydoctor2.datastructure.TopLevelTransportFeature;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation; import de.hft.stuttgart.citydoctor2.datastructure.Vegetation;
import de.hft.stuttgart.citydoctor2.edge.PolygonPolygonIntersection; import de.hft.stuttgart.citydoctor2.edge.PolygonPolygonIntersection;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.CollisionRecord;
import de.hft.stuttgart.citydoctor2.utils.Pair;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection; import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -137,51 +139,42 @@ public class FeatureCollisionCheck extends Check{ ...@@ -137,51 +139,42 @@ public class FeatureCollisionCheck extends Check{
} }
}); });
List<CollisionRecord> collisions = new ArrayList<>(); List<CollisionRecord> collisions = new ArrayList<>();
subjGeoms.forEach(sGeo ->{
candidates.forEach(candidate ->{ for (Geometry sGeo : subjGeoms) {
if (candidate.getGmlId().equals(subject.getGmlId())) return; for (CityObject candidate : candidates) {
if (candidate.getGmlId().equals(subject.getGmlId())) {
continue;
}
candidate.accept(new CheckableUtilsVisitor() { candidate.accept(new CheckableUtilsVisitor() {
@Override @Override
public void check(Geometry geom) { public void check(Geometry geom) {
List<PolygonIntersection> intersections = getPolygonIntersections(sGeo, geom); List<Pair<Polygon, Polygon>> collisionPairs = getCollisionPairs(sGeo, geom);
if (!intersections.isEmpty()){ if(!collisionPairs.isEmpty()) {
CollisionRecord collRec = new CollisionRecord(sGeo, geom, candidate); collisions.add(new CollisionRecord(sGeo, geom, subject, candidate, collisionPairs));
for (PolygonIntersection intersection : intersections) {
if(intersection.getType() == PolygonIntersection.IntersectionType.NONE){
continue;
}
collRec.addCollision(intersection.getP1(), intersection.getP2());
}
if(!collRec.getCollisionMap().isEmpty()) collisions.add(collRec);
} }
// List<PolygonPolygonIntersection> intersections =
// GeometryCollisionUtil.getGeometryIntersections(sGeo, geom, epsilon);
// if(!intersections.isEmpty()){
// CollisionRecord collRec = new CollisionRecord(sGeo, geom, candidate);
// intersections.forEach(ppi ->
// collRec.addCollision(ppi.getPolygon1().getOriginal(), ppi.getPolygon2().getOriginal()));
// collisions.add(collRec);
// }
} }
}); });
}); }
}); }
if(collisions.isEmpty()){ if(collisions.isEmpty()){
subject.addCheckResult(new CheckResult(this, ResultStatus.OK,null)); subject.addCheckResult(new CheckResult(this, ResultStatus.OK,null));
} else { } else {
for(CollisionRecord collRec : collisions){ collisions.forEach(collision ->
subject.addCheckResult(new CheckResult(this, ResultStatus.ERROR, subject.addCheckResult( new CheckResult(this,
new FeatureCollisionError( ResultStatus.ERROR, new FeatureCollisionError(collision, subject))));
subject, collRec.getSubjectGeom(), collRec.getCollidingFeatureId(), collRec.getCollidingGeom(),
collRec.getCollisionMap())
));
}
} }
} }
private List<Pair<Polygon,Polygon>> getCollisionPairs(Geometry subjectGeom, Geometry candidateGeom){
List<PolygonIntersection> intersections = getPolygonIntersections(subjectGeom, candidateGeom);
return intersections.stream()
.filter( polySect -> polySect.getType() != PolygonIntersection.IntersectionType.NONE)
.map(polySect -> new Pair<>(polySect.getP1(), polySect.getP2()))
.toList();
}
private List<PolygonIntersection> getPolygonIntersections(Geometry subject, Geometry candidate){ private List<PolygonIntersection> getPolygonIntersections(Geometry subject, Geometry candidate){
List<PolygonIntersection> intersections = new ArrayList<>(); List<PolygonIntersection> intersections = new ArrayList<>();
...@@ -194,44 +187,6 @@ public class FeatureCollisionCheck extends Check{ ...@@ -194,44 +187,6 @@ public class FeatureCollisionCheck extends Check{
} }
private static class CollisionRecord{
private final Geometry subjectGeom;
private final Geometry collidingGeom;
private final GmlId collidingFeatureId;
private final Map<Polygon, List<Polygon>> collisionMap;
public CollisionRecord(Geometry subjectGeom, Geometry collidingGeom, CityObject collidingFeature){
this.subjectGeom = subjectGeom;
this.collidingGeom = collidingGeom;
this.collidingFeatureId = collidingFeature.getGmlId();
this.collisionMap = new HashMap<>();
}
public void addCollision(Polygon subjectPoly, Polygon collidingPoly){
List<Polygon> polyList = collisionMap.computeIfAbsent(subjectPoly, k -> new ArrayList<>());
polyList.add(collidingPoly);
}
public Map<Polygon, List<Polygon>> getCollisionMap() {
return collisionMap;
}
public Geometry getSubjectGeom() {
return subjectGeom;
}
public Geometry getCollidingGeom() {
return collidingGeom;
}
public GmlId getCollidingFeatureId() {
return collidingFeatureId;
}
}
@Override @Override
public Check createNewInstance() { public Check createNewInstance() {
......
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