Commit 06712902 authored by Riegel's avatar Riegel
Browse files

Feat: Add TINRelief parsing

parent a49ef71b
......@@ -156,6 +156,10 @@ public class ReliefObject extends CityObject {
return FeatureType.LAND;
}
public void addComponent(TinObject component) {
components.add(component);
}
public List<TinObject> getComponents() {
return components;
}
......
......@@ -46,6 +46,13 @@ import org.citygml4j.core.model.construction.AbstractConstruction;
import org.citygml4j.core.model.core.*;
import org.citygml4j.core.model.deprecated.transportation.TransportationComplex;
import org.citygml4j.core.model.landuse.LandUse;
import org.citygml4j.core.model.relief.AbstractReliefComponentProperty;
import org.citygml4j.core.model.relief.BreaklineRelief;
import org.citygml4j.core.model.relief.MassPointRelief;
import org.citygml4j.core.model.relief.RasterRelief;
import org.citygml4j.core.model.relief.ReliefFeature;
import org.citygml4j.core.model.relief.TINRelief;
import org.citygml4j.core.model.relief.TinProperty;
import org.citygml4j.core.model.transportation.*;
import org.citygml4j.core.model.tunnel.Tunnel;
import org.citygml4j.core.model.tunnel.*;
......@@ -118,9 +125,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
CityFurniture cf = new CityFurniture();
cf.setGmlObject(gmlCityFurniture);
mapAbstractOccupiedSpace(gmlCityFurniture, cf);
resolveAndClearReferences();
cf.unsetGmlGeometries();
updateEdgesAndVertices(cf);
finishCityObjectConstruction(cf);
model.addCityFurniture(cf);
}
......@@ -141,9 +146,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
}
mapAbstractOccupiedSpace(gos, gco);
resolveAndClearReferences();
gco.unsetGmlGeometries();
updateEdgesAndVertices(gco);
finishCityObjectConstruction(gco);
model.addGenericCityObject(gco);
}
......@@ -158,6 +161,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
BuildingPart part = new BuildingPart(cdBuilding);
readAbstractBuilding(bpProp.getObject(), part);
}
finishCityObjectConstruction(cdBuilding);
model.addBuilding(cdBuilding);
}
......@@ -181,9 +185,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
wo.addBoundarySurface(bs);
}
resolveAndClearReferences();
wo.unsetGmlGeometries();
updateEdgesAndVertices(wo);
finishCityObjectConstruction(wo);
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
updateEdgesAndVertices(bs);
}
......@@ -200,6 +202,67 @@ public class Citygml3FeatureMapper extends ObjectWalker {
model.addLand(lo);
}
public void visit(ReliefFeature relief) {
ReliefObject ro = new ReliefObject(relief);
mapAbstractSpaceBoundary(relief, ro);
mapReliefFeature(relief, ro);
finishCityObjectConstruction(ro);
model.addRelief(ro);
}
public void mapReliefFeature(ReliefFeature relief, ReliefObject reliefObject) {
if (relief.isSetReliefComponents()) {
for (AbstractReliefComponentProperty arcProp : relief.getReliefComponents()) {
if (arcProp.isSetObject()) {
ObjectWalker ow = new ObjectWalker() {
@Override
public void visit(TINRelief rel) {
mapTINRelief(rel, reliefObject);
}
@Override
public void visit(MassPointRelief rel) {
//TODO: Check if implementation is required
}
@Override
public void visit(BreaklineRelief rel) {
//TODO: Check if implementation is required
}
@Override
public void visit(RasterRelief rel) {
//TODO: Check if implementation is required
}
};
arcProp.getObject().accept(ow);
}
}
}
}
public void mapTINRelief(TINRelief relief, ReliefObject reliefObject) {
TinObject to = new TinObject(relief);
Lod reliefLod = switch (relief.getLod()) {
case 1 -> Lod.LOD1;
case 2 -> Lod.LOD2;
case 3 -> Lod.LOD3;
case 4 -> null;
default -> throw new IllegalStateException("TINRelief has unexpected LOD value: " + relief.getLod());
};
if (reliefLod == null) {
logger.warn("IllegalState: TINRelief {} has LOD value 4!", relief.getId());
return;
}
reliefObject.addComponent(to);
Citygml3GeometryMapper tinMapper = new Citygml3GeometryMapper(config, vertexMap);
relief.getTin().getObject().accept(tinMapper);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, reliefLod);
tinMapper.getPolygons().forEach(geom::addPolygon);
to.addGeometry(geom);
}
@Override
public void visit(PlantCover plantCover) {
Vegetation veg = new Vegetation(VegetationType.PLANT_COVER);
......@@ -281,8 +344,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
mapAbstractBridge(gmlBridgePart, bPart);
bo.addBridgePart(bPart);
}
resolveAndClearReferences();
updateEdgesAndVertices(bo);
finishCityObjectConstruction(bo);
for (BridgeObject part : bo.getParts()) {
updateEdgesAndVertices(part);
}
......@@ -337,8 +399,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
for (BoundarySurface bs : bo.getBoundarySurfaces()) {
updateEdgesAndVertices(bs);
}
bo.unsetGmlGeometries();
}
private Installation mapBridgeInstallation(BridgeInstallation gmlBi) {
......@@ -392,8 +452,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
tu.addTunnelPart(tPart);
}
readAbstractTunnel(tunnel, tu);
resolveAndClearReferences();
updateEdgesAndVertices(tu);
finishCityObjectConstruction(tu);
for (TunnelPart part : tu.getTunnelParts()) {
updateEdgesAndVertices(part);
}
......@@ -739,6 +798,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
}
private void finishCityObjectConstruction(CityObject co) {
parseId(co.getGmlObject(), co);
co.unsetGmlGeometries();
resolveAndClearReferences();
updateEdgesAndVertices(co);
......@@ -974,7 +1034,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
AbstractBuilding cdBuilding) {
mapAbstractOccupiedSpace(gmlAb, cdBuilding);
cdBuilding.setGmlObject(gmlAb);
// parse deprecated geometries
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod1MultiSurface(), Lod.LOD1, cdBuilding);
parseAndAddMultiSurface(gmlAb.getDeprecatedProperties().getLod4MultiSurface(), Lod.LOD4, cdBuilding);
......
......@@ -35,6 +35,7 @@ import org.xmlobjects.gml.visitor.GeometryWalker;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
......@@ -76,6 +77,11 @@ public class Citygml3GeometryMapper extends GeometryWalker {
public void visit(PolygonPatch patch) {
parsePolygonPatch(patch, patchCollection);
}
@Override
public void visit(Triangle tri) {
parsePolygon(null, tri.getExterior(), Collections.emptyList());
}
};
surface.getPatches().getObjects().forEach(abstractSurfacePatch -> abstractSurfacePatch.accept(patchCollector));
}
......
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