From 61c6bd73464f93ab3be9609bfba637d584f5f744 Mon Sep 17 00:00:00 2001 From: Riegel Date: Fri, 11 Oct 2024 14:04:13 +0200 Subject: [PATCH] Add parsing of composite surfaces for ImplicitGeometry --- .../citygml3/Citygml3FeatureMapper.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java index c5c9964e..c07a73b4 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java @@ -63,12 +63,14 @@ import org.citygml4j.core.model.vegetation.PlantCover; import org.citygml4j.core.model.vegetation.SolitaryVegetationObject; import org.citygml4j.core.model.waterbody.WaterBody; import org.citygml4j.core.visitor.ObjectWalker; +import org.xmlobjects.gml.adapter.geometry.complexes.CompositeSurfaceAdapter; import org.xmlobjects.gml.model.base.AbstractGML; import org.xmlobjects.gml.model.feature.AbstractFeature; import org.xmlobjects.gml.model.geometry.AbstractGeometry; import org.xmlobjects.gml.model.geometry.GeometryProperty; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty; +import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface; import org.xmlobjects.gml.model.geometry.primitives.AbstractSolid; import org.xmlobjects.gml.model.geometry.primitives.AbstractSurface; import org.xmlobjects.gml.model.geometry.primitives.Shell; @@ -233,9 +235,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); + parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); + parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); + parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); + } @@ -519,9 +525,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); + parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); + parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); + parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); + } private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject co) { @@ -542,6 +552,22 @@ public class Citygml3FeatureMapper extends ObjectWalker { } } + private void parseAndAddCompositeSurface(MultiSurfaceProperty ms, Lod lod, CityObject co){ + if (ms == null || ms.getObject() == null || ms.getObject().getSurfaceMember().isEmpty()) { + return; + } + List surfaces = ms.getObject().getSurfaceMember(); + for (SurfaceProperty surface : surfaces) { + if (surface.getObject() instanceof CompositeSurface cs) { + Geometry geom = parseCompositeSurface(cs, lod); + if (geom != null) { + co.addGeometry(geom); + } + } + } + + } + private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co){ for (int i = 1; i <= 3; i++){ if (aos.getImplicitRepresentation(i) == null){ @@ -579,6 +605,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { geom = parseMultiSurface(ms, lod); } else if (aGeom instanceof Solid s){ geom = parseSolid(s, lod); + } else if (aGeom instanceof CompositeSurface cs){ + geom = parseCompositeSurface(cs, lod); } if (geom != null){ relGeo = RelativeGeometry.of(geom); @@ -948,6 +976,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { } } + public 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()); + return geom; + } + private void updateEdgesAndVertices(CityObject co) { // searching for neighboring vertices, replacing them with one single vertex to // avoid later problems with edges and manifold problems -- GitLab