/*
* citygml4j - The Open Source Java API for CityGML
* https://github.com/citygml4j
*
* Copyright 2013-2017 Claus Nagel <claus.nagel@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.citygml4j.CityGMLContext;
import org.citygml4j.builder.CityGMLBuilder;
import org.citygml4j.factory.GMLGeometryFactory;
import org.citygml4j.model.citygml.CityGMLClass;
import org.citygml4j.model.citygml.building.AbstractBoundarySurface;
import org.citygml4j.model.citygml.building.BoundarySurfaceProperty;
import org.citygml4j.model.citygml.building.Building;
import org.citygml4j.model.citygml.building.GroundSurface;
import org.citygml4j.model.citygml.building.RoofSurface;
import org.citygml4j.model.citygml.building.WallSurface;
import org.citygml4j.model.citygml.core.CityModel;
import org.citygml4j.model.citygml.core.CityObjectMember;
import org.citygml4j.model.gml.geometry.aggregates.MultiSurface;
import org.citygml4j.model.gml.geometry.aggregates.MultiSurfaceProperty;
import org.citygml4j.model.gml.geometry.complexes.CompositeSurface;
import org.citygml4j.model.gml.geometry.primitives.Polygon;
import org.citygml4j.model.gml.geometry.primitives.Solid;
import org.citygml4j.model.gml.geometry.primitives.SolidProperty;
import org.citygml4j.model.gml.geometry.primitives.SurfaceProperty;
import org.citygml4j.model.module.citygml.CityGMLVersion;
import org.citygml4j.util.gmlid.DefaultGMLIdManager;
import org.citygml4j.util.gmlid.GMLIdManager;
import org.citygml4j.xml.io.CityGMLOutputFactory;
import org.citygml4j.xml.io.writer.CityGMLWriter;
public class BuildingCreator {
public static void main(String[] args) throws Exception {
new BuildingCreator().doMain();
}
public void doMain() throws Exception {
SimpleDateFormat df = new SimpleDateFormat("[HH:mm:ss] ");
System.out.println(df.format(new Date()) + "setting up citygml4j context and JAXB builder");
CityGMLContext ctx = new CityGMLContext();
CityGMLBuilder builder = ctx.createCityGMLBuilder();
System.out.println(df.format(new Date()) + "creating LOD2 building as citygml4j in-memory object tree");
GMLGeometryFactory geom = new GMLGeometryFactory();
GMLIdManager gmlIdManager = DefaultGMLIdManager.getInstance();
Building building = new Building();
Polygon ground = geom.createLinearPolygon(new double[] {0,0,0, 0,12,0, 6,12,0, 6,0,0, 0,0,0}, 3);
Polygon wall_1 = geom.createLinearPolygon(new double[] {6,0,0, 6,12,0, 6,12,6, 6,0,6, 6,0,0}, 3);
Polygon wall_2 = geom.createLinearPolygon(new double[] {0,0,0, 0,0,6, 0,12,6, 0,12,0, 0,0,0}, 3);
Polygon wall_3 = geom.createLinearPolygon(new double[] {0,0,0, 6,0,0, 6,0,6, 3,0,9, 0,0,6, 0,0,0}, 3);
Polygon wall_4 = geom.createLinearPolygon(new double[] {6,12,0, 0,12,0, 0,12,6, 3,12,9, 6,12,6, 6,12,0}, 3);
Polygon roof_1 = geom.createLinearPolygon(new double[] {6,0,6, 6,12,6, 3,12,9, 3,0,9, 6,0,6}, 3);
Polygon roof_2 = geom.createLinearPolygon(new double[] {0,0,6, 3,0,9, 3,12,9, 0,12,6, 0,0,6}, 3);
ground.setId(gmlIdManager.generateUUID());
wall_1.setId(gmlIdManager.generateUUID());
wall_2.setId(gmlIdManager.generateUUID());
wall_3.setId(gmlIdManager.generateUUID());
wall_4.setId(gmlIdManager.generateUUID());
roof_1.setId(gmlIdManager.generateUUID());
roof_2.setId(gmlIdManager.generateUUID());
// lod2 solid
List<SurfaceProperty> surfaceMember = new ArrayList<SurfaceProperty>();
surfaceMember.add(new SurfaceProperty('#' + ground.getId()));
surfaceMember.add(new SurfaceProperty('#' + wall_1.getId()));
surfaceMember.add(new SurfaceProperty('#' + wall_2.getId()));
surfaceMember.add(new SurfaceProperty('#' + wall_3.getId()));
surfaceMember.add(new SurfaceProperty('#' + wall_4.getId()));
surfaceMember.add(new SurfaceProperty('#' + roof_1.getId()));
surfaceMember.add(new SurfaceProperty('#' + roof_2.getId()));
CompositeSurface compositeSurface = new CompositeSurface();
compositeSurface.setSurfaceMember(surfaceMember);
Solid solid = new Solid();
solid.setExterior(new SurfaceProperty(compositeSurface));
building.setLod2Solid(new SolidProperty(solid));
// thematic boundary surfaces
List<BoundarySurfaceProperty> boundedBy = new ArrayList<BoundarySurfaceProperty>();
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_GROUND_SURFACE, ground));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_WALL_SURFACE, wall_1));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_WALL_SURFACE, wall_2));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_WALL_SURFACE, wall_3));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_WALL_SURFACE, wall_4));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_ROOF_SURFACE, roof_1));
boundedBy.add(createBoundarySurface(CityGMLClass.BUILDING_ROOF_SURFACE, roof_2));
building.setBoundedBySurface(boundedBy);
CityModel cityModel = new CityModel();
cityModel.setBoundedBy(building.calcBoundedBy(false));
cityModel.addCityObjectMember(new CityObjectMember(building));
System.out.println(df.format(new Date()) + "writing citygml4j object tree");
CityGMLOutputFactory out = builder.createCityGMLOutputFactory(CityGMLVersion.DEFAULT);
CityGMLWriter writer = out.createCityGMLWriter(new File("LOD2_Building_v200.gml"));
writer.setPrefixes(CityGMLVersion.DEFAULT);
writer.setSchemaLocations(CityGMLVersion.DEFAULT);
writer.setIndentString(" ");
writer.write(cityModel);
writer.close();
System.out.println(df.format(new Date()) + "CityGML file LOD2_Building_v200.gml written");
System.out.println(df.format(new Date()) + "sample citygml4j application successfully finished");
}
private BoundarySurfaceProperty createBoundarySurface(CityGMLClass type, Polygon geometry) {
AbstractBoundarySurface boundarySurface = null;
switch (type) {
case BUILDING_WALL_SURFACE:
boundarySurface = new WallSurface();
break;
case BUILDING_ROOF_SURFACE:
boundarySurface = new RoofSurface();
break;
case BUILDING_GROUND_SURFACE:
boundarySurface = new GroundSurface();
break;
default:
break;
}
if (boundarySurface != null) {
boundarySurface.setLod2MultiSurface(new MultiSurfaceProperty(new MultiSurface(geometry)));
return new BoundarySurfaceProperty(boundarySurface);
}
return null;
}
}