Commit ed1f8e54 authored by Riegel's avatar Riegel
Browse files

Rework parsing of CompositeSurface

parent 34c26b20
......@@ -24,7 +24,7 @@ public class CompositePolygon extends ConcretePolygon{
private Geometry parent;
private BoundarySurface partOfSurface;
private Installation partOfInstallation;
private List<Polygon> compositeMembers = new ArrayList<>();
private List<ConcretePolygon> compositeMembers = new ArrayList<>();
private LinearRing exterior = null;
@Override
......@@ -74,11 +74,11 @@ public class CompositePolygon extends ConcretePolygon{
}
}
public void addCompositeMember(Polygon p){
public void addCompositeMember(ConcretePolygon p){
compositeMembers.add(p);
}
public List<Polygon> getCompositeMembers(){
public List<ConcretePolygon> getCompositeMembers(){
return compositeMembers;
}
......
......@@ -827,17 +827,20 @@ public class Citygml3FeatureMapper extends ObjectWalker {
continue;
}
// TODO: Insert handling of compPoly dummy objects
if (concPoly instanceof CompositePolygon comp) {}
//
LinkedPolygon lPoly = new LinkedPolygon(concPoly, geom);
if (geom.getParent() instanceof BoundarySurface bs) {
lPoly.setPartOfSurface(bs);
if (bs.getParent() instanceof Installation bi) {
lPoly.setPartOfInstallation(bi);
if (concPoly instanceof CompositePolygon comp) {
resolveCompositePolygon(comp).forEach(geom::addPolygon);
} else {
//
LinkedPolygon lPoly = new LinkedPolygon(concPoly, geom);
if (geom.getParent() instanceof BoundarySurface bs) {
lPoly.setPartOfSurface(bs);
if (bs.getParent() instanceof Installation bi) {
lPoly.setPartOfInstallation(bi);
}
}
geom.addPolygon(lPoly);
}
geom.addPolygon(lPoly);
}
// clear storage for polygons and vertices
......@@ -847,6 +850,18 @@ public class Citygml3FeatureMapper extends ObjectWalker {
polygonMap = new HashMap<>();
}
private List<ConcretePolygon> resolveCompositePolygon(CompositePolygon comp) {
List<ConcretePolygon> polygons = new ArrayList<>();
for (ConcretePolygon conc: comp.getCompositeMembers()){
if (conc instanceof CompositePolygon recComp){
polygons.addAll(resolveCompositePolygon(recComp));
} else {
polygons.add(conc);
}
}
return polygons;
}
private void readAbstractBuilding(org.citygml4j.core.model.building.AbstractBuilding gmlAb,
AbstractBuilding cdBuilding) {
mapAbstractOccupiedSpace(gmlAb, cdBuilding);
......
......@@ -24,21 +24,18 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import de.hft.stuttgart.citydoctor2.datastructure.*;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.locationtech.proj4j.BasicCoordinateTransform;
import org.locationtech.proj4j.ProjCoordinate;
import org.xmlobjects.gml.model.geometry.primitives.AbstractRing;
import org.xmlobjects.gml.model.geometry.primitives.AbstractRingProperty;
import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface;
import org.xmlobjects.gml.model.geometry.primitives.*;
import org.xmlobjects.gml.model.geometry.primitives.Polygon;
import org.xmlobjects.gml.model.geometry.primitives.Ring;
import org.xmlobjects.gml.visitor.GeometryWalker;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.Localization;
......@@ -94,6 +91,34 @@ public class Citygml3GeometryMapper extends GeometryWalker {
cdPoly.addInteriorRing(currentRing);
}
}
@Override
public void visit(CompositeSurface cs){
if (cs.getSurfaceMembers() != null && cs.getSurfaceMembers().isEmpty()) {
logger.warn("CompositeSurface %s is empty", cs.getId());
return;
}
List<SurfaceProperty> surfaceMember = cs.getSurfaceMembers();
Citygml3GeometryMapper recursiveMapper = new Citygml3GeometryMapper(config, vertexMap);
CompositePolygon comp = new CompositePolygon();
if (cs.getId() == null){
comp.setGmlId(GmlId.generateId());
} else {
comp.setGmlId(new GmlId(cs.getId()));
}
for (SurfaceProperty prop : surfaceMember) {
if (prop.getObject() != null) {
AbstractSurface as = prop.getObject();
as.accept(recursiveMapper);
}
}
List<ConcretePolygon> compPolys = recursiveMapper.getPolygons();
compPolys.forEach(comp::addCompositeMember);
polygons.add(comp);
polygons.addAll(compPolys);
}
@Override
public void visit(org.xmlobjects.gml.model.geometry.primitives.LinearRing gmlRing) {
......
......@@ -97,11 +97,6 @@ public class SurfaceMapper extends ObjectWalker {
parseAndAddMultiSurface(afs.getLod2MultiSurface(), Lod.LOD2, o);
parseAndAddMultiSurface(afs.getLod3MultiSurface(), Lod.LOD3, o);
parseAndAddMultiSurface(afs.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, o);
parseAndAddCompositeSurface(afs.getLod0MultiSurface(), Lod.LOD0, o);
parseAndAddCompositeSurface(afs.getLod1MultiSurface(), Lod.LOD1, o);
parseAndAddCompositeSurface(afs.getLod2MultiSurface(), Lod.LOD2, o);
parseAndAddCompositeSurface(afs.getLod3MultiSurface(), Lod.LOD3, o);
parseAndAddCompositeSurface(afs.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, o);
o.unsetGmlGeometries();
}
......@@ -112,12 +107,7 @@ public class SurfaceMapper extends ObjectWalker {
parseAndAddMultiSurface(gmlSurface.getLod2MultiSurface(), Lod.LOD2, cdSurface);
parseAndAddMultiSurface(gmlSurface.getLod3MultiSurface(), Lod.LOD3, cdSurface);
parseAndAddMultiSurface(gmlSurface.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdSurface);
parseAndAddCompositeSurface(gmlSurface.getLod0MultiSurface(), Lod.LOD0, cdSurface);
parseAndAddCompositeSurface(gmlSurface.getLod1MultiSurface(), Lod.LOD1, cdSurface);
parseAndAddCompositeSurface(gmlSurface.getLod2MultiSurface(), Lod.LOD2, cdSurface);
parseAndAddCompositeSurface(gmlSurface.getLod3MultiSurface(), Lod.LOD3, cdSurface);
parseAndAddCompositeSurface(gmlSurface.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdSurface);
}
}
private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject cdSurface) {
if (msp == null || msp.getObject() == null) {
......@@ -134,34 +124,6 @@ public class SurfaceMapper extends ObjectWalker {
return geom;
}
private void parseAndAddCompositeSurface(MultiSurfaceProperty ms, Lod lod, CityObject cdSurface){
if (ms == null || ms.getObject() == null) {
return;
}
List<SurfaceProperty> surfaceMember = ms.getObject().getSurfaceMember();
for (SurfaceProperty surface : surfaceMember) {
if (surface.getObject() instanceof CompositeSurface cs) {
Geometry geom = parseCompositeSurface(cs, lod);
cdSurface.addGeometry(geom);
}
}
}
private Geometry parseCompositeSurface(CompositeSurface cs, Lod lod) {
Geometry geom = new Geometry(GeometryType.COMPOSITE_SURFACE, lod);
Citygml3GeometryMapper geometryMapper = new Citygml3GeometryMapper(config, vertexMap);
readSurfaceMember(geom, geometryMapper, cs.getSurfaceMembers());
if (cs.getId() != null){
CompositePolygon compPoly = new CompositePolygon();
polygonMap.put(cs.getId(), compPoly);
geom.getPolygons().forEach(compPoly::addCompositeMember);
compPoly.setParent(geom);
}
return geom;
}
private void readSurfaceMember(Geometry geom, Citygml3GeometryMapper geometryMapper,
List<SurfaceProperty> surfaceMember) {
......@@ -178,9 +140,14 @@ public class SurfaceMapper extends ObjectWalker {
List<ConcretePolygon> polygons = geometryMapper.getPolygons();
for (ConcretePolygon concretePoly : polygons) {
geom.addPolygon(concretePoly);
if (concretePoly.hasExistingGmlId()) {
polygonMap.put(concretePoly.getGmlId().getGmlString(), concretePoly);
if (concretePoly instanceof CompositePolygon comp) {
references.add(new ResolvableReference(comp.getGmlId().toString(), geom));
polygonMap.put(comp.getGmlId().toString(), comp);
} else {
geom.addPolygon(concretePoly);
if (concretePoly.hasExistingGmlId()) {
polygonMap.put(concretePoly.getGmlId().getGmlString(), concretePoly);
}
}
}
}
......
......@@ -141,7 +141,7 @@ public final class CityGmlUtils {
public static MultiSurface createMultiSurface(Geometry geom, GeometryFactory factory,
ParserConfiguration config) {
if (geom.getType() != GeometryType.MULTI_SURFACE) {
if (geom.getType() != GeometryType.MULTI_SURFACE && geom.getType() != GeometryType.COMPOSITE_SURFACE) {
throw new IllegalArgumentException("This can only handle MultiSurfaces");
}
List<SurfaceProperty> surfaces = new ArrayList<>();
......
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