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

Add parsing of composite surfaces for ImplicitGeometry

parent ab203d0b
...@@ -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