diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java index 20614c43f70d0f8d07857dee6e2267e619d889f1..560748517b1397a6790f0394439d5cf8ab5ed6dd 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java @@ -54,6 +54,7 @@ public final class CompositePolygon extends ConcretePolygon{ public void addCompositeMember(ConcretePolygon p){ compositeMembers.add(p); + p.setPartOfComposite(this); } public List<ConcretePolygon> getCompositeMembers(){ diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java index c57113e2c3581b4baf46871fa43b389d3dff143a..eca5454f2862c31bd7bd0c56ed6d76239fe3083e 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java @@ -49,6 +49,7 @@ public class ConcretePolygon extends Polygon { private List<LinearRing> innerRings; private BoundarySurface partOfSurface; private Installation partfOfInstallation; + private CompositePolygon partOfComposite = null; private Geometry parent; private LinkedPolygon linkedFromPolygon; @@ -138,6 +139,18 @@ public class ConcretePolygon extends Polygon { parent = geometry; } + protected void setPartOfComposite(CompositePolygon comp) { + this.partOfComposite = comp; + } + + public CompositePolygon getPartOfComposite() { + return partOfComposite; + } + + public boolean isCompositeMember() { + return (partOfComposite != null); + } + /* * (non-Javadoc) * diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java index 0ecc8fa974e05c3be0f953911854d1061f707d60..34f6f718f322af6730e0ea4dab4fc7e8d4a572ce 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java @@ -19,8 +19,11 @@ package de.hft.stuttgart.citydoctor2.utils; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import de.hft.stuttgart.citydoctor2.datastructure.*; import org.citygml4j.core.util.geometry.GeometryFactory; import org.locationtech.proj4j.BasicCoordinateTransform; import org.locationtech.proj4j.ProjCoordinate; @@ -32,11 +35,6 @@ import org.xmlobjects.gml.model.geometry.primitives.ShellProperty; import org.xmlobjects.gml.model.geometry.primitives.Solid; import org.xmlobjects.gml.model.geometry.primitives.SurfaceProperty; -import de.hft.stuttgart.citydoctor2.datastructure.Geometry; -import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; -import de.hft.stuttgart.citydoctor2.datastructure.LinearRing; -import de.hft.stuttgart.citydoctor2.datastructure.Polygon; -import de.hft.stuttgart.citydoctor2.datastructure.Vertex; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; /** @@ -81,6 +79,28 @@ public final class CityGmlUtils { return gmlPoly; } + public static CompositeSurface createGmlComposite(GeometryFactory factory, CompositePolygon cdPoly, + ParserConfiguration config) { + List<ConcretePolygon> cdMembers = cdPoly.getCompositeMembers(); + List<SurfaceProperty> surfaces = new ArrayList<>(); + for (ConcretePolygon cd : cdMembers) { + surfaces.add(resolveCompositeMember(factory, cd, config)); + } + if (surfaces.isEmpty()){ + return null; + } + return new CompositeSurface(surfaces); + } + + private static SurfaceProperty resolveCompositeMember(GeometryFactory factory, ConcretePolygon cdPoly, + ParserConfiguration config){ + if (cdPoly instanceof CompositePolygon comp) { + return new SurfaceProperty(createGmlComposite(factory, comp, config)); + } else { + return new SurfaceProperty(createGmlPolygon(factory, cdPoly, config)); + } + } + public static org.xmlobjects.gml.model.geometry.primitives.LinearRing createGmlRing(GeometryFactory factory, ParserConfiguration config, LinearRing lr) { @@ -145,8 +165,13 @@ public final class CityGmlUtils { throw new IllegalArgumentException("This can only handle MultiSurfaces"); } List<SurfaceProperty> surfaces = new ArrayList<>(); + Set<CompositePolygon> compositePolygons = new HashSet<>(); for (Polygon cdPoly : geom.getPolygons()) { - if (!cdPoly.isLink()) { + if (cdPoly instanceof ConcretePolygon conc && conc.isCompositeMember()) { + compositePolygons.add(conc.getPartOfComposite()); + }else if (cdPoly instanceof CompositePolygon composite) { + compositePolygons.add(composite); + } else if (!cdPoly.isLink()) { // is not part of a boundary surface org.xmlobjects.gml.model.geometry.primitives.Polygon gmlPoly = createGmlPolygon(factory, cdPoly, config); if (gmlPoly != null) { @@ -157,6 +182,9 @@ public final class CityGmlUtils { surfaces.add(new SurfaceProperty("#" + cdPoly.getGmlId().getGmlString())); } } + for (CompositePolygon cdPoly : compositePolygons) { + surfaces.add(new SurfaceProperty(createGmlComposite(factory, cdPoly, config))); + } if (surfaces.isEmpty()) { return null; }