Commit 61c6bd73 authored by Riegel's avatar Riegel
Browse files

Add parsing of composite surfaces for ImplicitGeometry

parent ab203d0b
This commit is part of merge request !11. Comments created here will be created in the context of that merge request.
...@@ -63,12 +63,14 @@ import org.citygml4j.core.model.vegetation.PlantCover; ...@@ -63,12 +63,14 @@ import org.citygml4j.core.model.vegetation.PlantCover;
import org.citygml4j.core.model.vegetation.SolitaryVegetationObject; import org.citygml4j.core.model.vegetation.SolitaryVegetationObject;
import org.citygml4j.core.model.waterbody.WaterBody; import org.citygml4j.core.model.waterbody.WaterBody;
import org.citygml4j.core.visitor.ObjectWalker; 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.base.AbstractGML;
import org.xmlobjects.gml.model.feature.AbstractFeature; import org.xmlobjects.gml.model.feature.AbstractFeature;
import org.xmlobjects.gml.model.geometry.AbstractGeometry; import org.xmlobjects.gml.model.geometry.AbstractGeometry;
import org.xmlobjects.gml.model.geometry.GeometryProperty; import org.xmlobjects.gml.model.geometry.GeometryProperty;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface; import org.xmlobjects.gml.model.geometry.aggregates.MultiSurface;
import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty; 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.AbstractSolid;
import org.xmlobjects.gml.model.geometry.primitives.AbstractSurface; import org.xmlobjects.gml.model.geometry.primitives.AbstractSurface;
import org.xmlobjects.gml.model.geometry.primitives.Shell; import org.xmlobjects.gml.model.geometry.primitives.Shell;
...@@ -233,9 +235,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -233,9 +235,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, 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.getLod1Solid(), Lod.LOD1, co);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co);
} }
...@@ -519,9 +525,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -519,9 +525,13 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, 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.getLod1Solid(), Lod.LOD1, co);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co);
} }
private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject co) { private void parseAndAddMultiSurface(MultiSurfaceProperty msp, Lod lod, CityObject co) {
...@@ -542,6 +552,22 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -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<SurfaceProperty> 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){ private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co){
for (int i = 1; i <= 3; i++){ for (int i = 1; i <= 3; i++){
if (aos.getImplicitRepresentation(i) == null){ if (aos.getImplicitRepresentation(i) == null){
...@@ -579,6 +605,8 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -579,6 +605,8 @@ public class Citygml3FeatureMapper extends ObjectWalker {
geom = parseMultiSurface(ms, lod); geom = parseMultiSurface(ms, lod);
} else if (aGeom instanceof Solid s){ } else if (aGeom instanceof Solid s){
geom = parseSolid(s, lod); geom = parseSolid(s, lod);
} else if (aGeom instanceof CompositeSurface cs){
geom = parseCompositeSurface(cs, lod);
} }
if (geom != null){ if (geom != null){
relGeo = RelativeGeometry.of(geom); relGeo = RelativeGeometry.of(geom);
...@@ -948,6 +976,13 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -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) { private void updateEdgesAndVertices(CityObject co) {
// searching for neighboring vertices, replacing them with one single vertex to // searching for neighboring vertices, replacing them with one single vertex to
// avoid later problems with edges and manifold problems // avoid later problems with edges and manifold problems
......
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