Commit 2459496d authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev_gui_features_zip_loading' into 'dev'

Add ZIP-archive support

See merge request !26
parents ca7fe768 b75c2602
Pipeline #10995 passed with stage
in 1 minute and 29 seconds
<?xml version="1.0" encoding="UTF-8"?>
<core:CityModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:core="http://www.opengis.net/citygml/2.0"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:tran="http://www.opengis.net/citygml/transportation/2.0"
xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0"
xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language"
xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0"
xmlns:luse="http://www.opengis.net/citygml/landuse/2.0"
xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0"
xmlns:app="http://www.opengis.net/citygml/appearance/2.0"
xmlns:tex="http://www.opengis.net/citygml/texturedsurface/2.0"
xmlns:smil20="http://www.w3.org/2001/SMIL20/"
xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"
xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xmlns:dem="http://www.opengis.net/citygml/relief/2.0"
xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0"
xmlns:brid="http://www.opengis.net/citygml/bridge/2.0"
xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0"
xmlns:gen="http://www.opengis.net/citygml/generics/2.0"
xmlns:wfs="http://www.opengis.net/wfs"
xsi:schemaLocation="http://www.opengis.net/citygml/landuse/2.0 http://schemas.opengis.net/citygml/landuse/2.0/landUse.xsd http://www.opengis.net/citygml/cityfurniture/2.0 http://schemas.opengis.net/citygml/cityfurniture/2.0/cityFurniture.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/texturedsurface/2.0 http://schemas.opengis.net/citygml/texturedsurface/2.0/texturedSurface.xsd http://www.opengis.net/citygml/transportation/2.0 http://schemas.opengis.net/citygml/transportation/2.0/transportation.xsd http://www.opengis.net/citygml/waterbody/2.0 http://schemas.opengis.net/citygml/waterbody/2.0/waterBody.xsd http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/vegetation/2.0 http://schemas.opengis.net/citygml/vegetation/2.0/vegetation.xsd http://www.opengis.net/citygml/cityobjectgroup/2.0 http://schemas.opengis.net/citygml/cityobjectgroup/2.0/cityObjectGroup.xsd http://www.opengis.net/citygml/bridge/2.0 http://schemas.opengis.net/citygml/bridge/2.0/bridge.xsd http://www.opengis.net/citygml/tunnel/2.0 http://schemas.opengis.net/citygml/tunnel/2.0/tunnel.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<gml:description>Testdataset</gml:description>
<gml:name>ImplicitGeometry zipfile testdata</gml:name>
<core:cityObjectMember>
<gen:GenericCityObject>
<gml:description>CPA_Symbol</gml:description>
<gml:name>Implicit2</gml:name>
<gen:lod2Geometry>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-5">
<gml:exterior>
<gml:LinearRing gml:id="ringID-5">
<gml:posList srsDimension="3">-0.049000 0.085000 1.162000 -0.098000 0.000000 1.162000 -0.049000 -0.085000 1.162000 0.049000 -0.085000 1.162000 0.098000 0.000000 1.162000 0.049000 0.085000 1.162000 -0.049000 0.085000 1.162000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-5_1">
<gml:posList srsDimension="3">-0.052000 0.030000 1.162000 0.000000 0.060000 1.162000 0.052000 0.030000 1.162000 0.052000 -0.030000 1.162000 0.000000 -0.060000 1.162000 -0.052000 -0.030000 1.162000 -0.052000 0.030000 1.162000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-6">
<gml:exterior>
<gml:LinearRing gml:id="ringID-6">
<gml:posList srsDimension="3">-0.049000 0.085000 0.000000 -0.049000 0.085000 1.162000 0.049000 0.085000 1.162000 0.049000 0.085000 0.000000 -0.049000 0.085000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-7">
<gml:exterior>
<gml:LinearRing gml:id="ringID-7">
<gml:posList srsDimension="3">-0.098000 0.000000 0.000000 -0.098000 0.000000 1.162000 -0.049000 0.085000 1.162000 -0.049000 0.085000 0.000000 -0.098000 0.000000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-8">
<gml:exterior>
<gml:LinearRing gml:id="ringID-8">
<gml:posList srsDimension="3">0.098000 0.000000 0.000000 0.098000 0.000000 1.162000 0.049000 -0.085000 1.162000 0.049000 -0.085000 0.000000 0.098000 0.000000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-9">
<gml:exterior>
<gml:LinearRing gml:id="ringID-9">
<gml:posList srsDimension="3">-0.049000 -0.085000 0.000000 -0.049000 -0.085000 1.162000 -0.098000 0.000000 1.162000 -0.098000 0.000000 0.000000 -0.049000 -0.085000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-10">
<gml:exterior>
<gml:LinearRing gml:id="ringID-10">
<gml:posList srsDimension="3">0.049000 0.085000 0.000000 0.049000 0.085000 1.162000 0.098000 0.000000 1.162000 0.098000 0.000000 0.000000 0.049000 0.085000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-11">
<gml:exterior>
<gml:LinearRing gml:id="ringID-11">
<gml:posList srsDimension="3">0.049000 -0.085000 0.000000 0.049000 -0.085000 1.162000 -0.049000 -0.085000 1.162000 -0.049000 -0.085000 0.000000 0.049000 -0.085000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-12">
<gml:exterior>
<gml:LinearRing gml:id="ringID-12">
<gml:posList srsDimension="3">0.000000 0.408000 4.880000 0.353000 0.205000 4.880000 0.353000 0.205000 4.830000 0.000000 0.408000 4.830000 0.000000 0.408000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-13">
<gml:exterior>
<gml:LinearRing gml:id="ringID-13">
<gml:posList srsDimension="3">0.000000 0.408000 4.880000 0.000000 0.001000 5.000000 0.353000 0.205000 4.880000 0.000000 0.408000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-14">
<gml:exterior>
<gml:LinearRing gml:id="ringID-14">
<gml:posList srsDimension="3">-0.353000 -0.202000 4.880000 0.000000 -0.406000 4.880000 0.000000 0.001000 5.000000 -0.353000 -0.202000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-15">
<gml:exterior>
<gml:LinearRing gml:id="ringID-15">
<gml:posList srsDimension="3">0.000000 0.001000 5.000000 0.000000 0.408000 4.880000 -0.353000 0.205000 4.880000 0.000000 0.001000 5.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-16">
<gml:exterior>
<gml:LinearRing gml:id="ringID-16">
<gml:posList srsDimension="3">0.000000 -0.406000 4.880000 -0.353000 -0.202000 4.880000 -0.353000 -0.202000 4.830000 0.000000 -0.406000 4.830000 0.000000 -0.406000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-17">
<gml:exterior>
<gml:LinearRing gml:id="ringID-17">
<gml:posList srsDimension="3">0.353000 -0.202000 4.880000 0.353000 0.205000 4.880000 0.000000 0.001000 5.000000 0.353000 -0.202000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-18">
<gml:exterior>
<gml:LinearRing gml:id="ringID-18">
<gml:posList srsDimension="3">0.353000 0.205000 4.880000 0.353000 -0.202000 4.880000 0.353000 -0.202000 4.830000 0.353000 0.205000 4.830000 0.353000 0.205000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-19">
<gml:exterior>
<gml:LinearRing gml:id="ringID-19">
<gml:posList srsDimension="3">0.353000 -0.202000 4.880000 0.000000 0.001000 5.000000 0.000000 -0.406000 4.880000 0.353000 -0.202000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-20">
<gml:exterior>
<gml:LinearRing gml:id="ringID-20">
<gml:posList srsDimension="3">-0.353000 0.205000 4.880000 -0.353000 -0.202000 4.880000 0.000000 0.001000 5.000000 -0.353000 0.205000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-21">
<gml:exterior>
<gml:LinearRing gml:id="ringID-21">
<gml:posList srsDimension="3">0.000000 0.080000 3.982000 0.069000 0.040000 3.982000 0.069000 0.040000 3.892000 0.000000 0.080000 3.892000 0.000000 0.080000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-22">
<gml:exterior>
<gml:LinearRing gml:id="ringID-22">
<gml:posList srsDimension="3">0.069000 0.040000 3.982000 0.069000 -0.040000 3.982000 0.069000 -0.040000 3.892000 0.069000 0.040000 3.892000 0.069000 0.040000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-23">
<gml:exterior>
<gml:LinearRing gml:id="ringID-23">
<gml:posList srsDimension="3">0.353000 -0.202000 4.880000 0.000000 -0.406000 4.880000 0.000000 -0.406000 4.830000 0.353000 -0.202000 4.830000 0.353000 -0.202000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-24">
<gml:exterior>
<gml:LinearRing gml:id="ringID-24">
<gml:posList srsDimension="3">-0.069000 0.040000 3.982000 0.000000 0.080000 3.982000 0.000000 0.080000 3.892000 -0.069000 0.040000 3.892000 -0.069000 0.040000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-25">
<gml:exterior>
<gml:LinearRing gml:id="ringID-25">
<gml:posList srsDimension="3">0.000000 -0.080000 3.982000 -0.069000 -0.040000 3.982000 -0.069000 -0.040000 3.892000 0.000000 -0.080000 3.892000 0.000000 -0.080000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-26">
<gml:exterior>
<gml:LinearRing gml:id="ringID-26">
<gml:posList srsDimension="3">-0.353000 -0.202000 4.880000 -0.353000 0.205000 4.880000 -0.353000 0.205000 4.830000 -0.353000 -0.202000 4.830000 -0.353000 -0.202000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-27">
<gml:exterior>
<gml:LinearRing gml:id="ringID-27">
<gml:posList srsDimension="3">-0.353000 0.205000 4.880000 0.000000 0.408000 4.880000 0.000000 0.408000 4.830000 -0.353000 0.205000 4.830000 -0.353000 0.205000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-28">
<gml:exterior>
<gml:LinearRing gml:id="ringID-28">
<gml:posList srsDimension="3">-0.069000 -0.040000 3.982000 -0.069000 0.040000 3.982000 -0.069000 0.040000 3.892000 -0.069000 -0.040000 3.892000 -0.069000 -0.040000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-29">
<gml:exterior>
<gml:LinearRing gml:id="ringID-29">
<gml:posList srsDimension="3">0.000000 -0.080000 3.892000 -0.069000 -0.040000 3.892000 -0.069000 0.040000 3.892000 0.000000 0.080000 3.892000 0.069000 0.040000 3.892000 0.069000 -0.040000 3.892000 0.000000 -0.080000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-29_1">
<gml:posList srsDimension="3">-0.052000 0.030000 3.892000 -0.052000 -0.030000 3.892000 0.000000 -0.060000 3.892000 0.052000 -0.030000 3.892000 0.052000 0.030000 3.892000 0.000000 0.060000 3.892000 -0.052000 0.030000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-30">
<gml:exterior>
<gml:LinearRing gml:id="ringID-30">
<gml:posList srsDimension="3">-0.052000 -0.030000 3.892000 -0.052000 -0.030000 1.162000 0.000000 -0.060000 1.162000 0.000000 -0.060000 3.892000 -0.052000 -0.030000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-31">
<gml:exterior>
<gml:LinearRing gml:id="ringID-31">
<gml:posList srsDimension="3">0.052000 0.030000 3.892000 0.052000 0.030000 1.162000 0.000000 0.060000 1.162000 0.000000 0.060000 3.892000 0.052000 0.030000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-32">
<gml:exterior>
<gml:LinearRing gml:id="ringID-32">
<gml:posList srsDimension="3">0.000000 0.060000 3.892000 0.000000 0.060000 1.162000 -0.052000 0.030000 1.162000 -0.052000 0.030000 3.892000 0.000000 0.060000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-33">
<gml:exterior>
<gml:LinearRing gml:id="ringID-33">
<gml:posList srsDimension="3">-0.052000 0.030000 3.892000 -0.052000 0.030000 1.162000 -0.052000 -0.030000 1.162000 -0.052000 -0.030000 3.892000 -0.052000 0.030000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-34">
<gml:exterior>
<gml:LinearRing gml:id="ringID-34">
<gml:posList srsDimension="3">0.069000 -0.040000 3.982000 0.000000 -0.080000 3.982000 0.000000 -0.080000 3.892000 0.069000 -0.040000 3.892000 0.069000 -0.040000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-35">
<gml:exterior>
<gml:LinearRing gml:id="ringID-35">
<gml:posList srsDimension="3">-0.286000 0.166000 4.880000 -0.181000 0.105000 4.117000 -0.181000 -0.104000 4.117000 -0.286000 -0.164000 4.880000 -0.286000 0.166000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-36">
<gml:exterior>
<gml:LinearRing gml:id="ringID-36">
<gml:posList srsDimension="3">-0.171000 -0.099000 4.050000 -0.138000 -0.080000 3.982000 0.000000 -0.160000 3.982000 0.000000 -0.197000 4.050000 -0.171000 -0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-37">
<gml:exterior>
<gml:LinearRing gml:id="ringID-37">
<gml:posList srsDimension="3">0.286000 -0.164000 4.880000 0.181000 -0.104000 4.117000 0.181000 0.105000 4.117000 0.286000 0.166000 4.880000 0.286000 -0.164000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-38">
<gml:exterior>
<gml:LinearRing gml:id="ringID-38">
<gml:posList srsDimension="3">0.138000 -0.080000 3.982000 0.171000 -0.099000 4.050000 0.000000 -0.197000 4.050000 0.000000 -0.160000 3.982000 0.138000 -0.080000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-39">
<gml:exterior>
<gml:LinearRing gml:id="ringID-39">
<gml:posList srsDimension="3">0.000000 -0.329000 4.880000 0.000000 -0.208000 4.117000 0.181000 -0.104000 4.117000 0.286000 -0.164000 4.880000 0.000000 -0.329000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-40">
<gml:exterior>
<gml:LinearRing gml:id="ringID-40">
<gml:posList srsDimension="3">0.171000 -0.099000 4.050000 0.138000 -0.080000 3.982000 0.138000 0.080000 3.982000 0.171000 0.099000 4.050000 0.171000 -0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-41">
<gml:exterior>
<gml:LinearRing gml:id="ringID-41">
<gml:posList srsDimension="3">0.171000 0.099000 4.050000 0.181000 0.105000 4.117000 0.181000 -0.104000 4.117000 0.171000 -0.099000 4.050000 0.171000 0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-42">
<gml:exterior>
<gml:LinearRing gml:id="ringID-42">
<gml:posList srsDimension="3">0.171000 -0.099000 4.050000 0.181000 -0.104000 4.117000 0.000000 -0.208000 4.117000 0.000000 -0.197000 4.050000 0.171000 -0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-43">
<gml:exterior>
<gml:LinearRing gml:id="ringID-43">
<gml:posList srsDimension="3">-0.138000 0.080000 3.982000 -0.171000 0.099000 4.050000 0.000000 0.198000 4.050000 0.000000 0.160000 3.982000 -0.138000 0.080000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-44">
<gml:exterior>
<gml:LinearRing gml:id="ringID-44">
<gml:posList srsDimension="3">0.000000 -0.060000 3.892000 0.000000 -0.060000 1.162000 0.052000 -0.030000 1.162000 0.052000 -0.030000 3.892000 0.000000 -0.060000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-45">
<gml:exterior>
<gml:LinearRing gml:id="ringID-45">
<gml:posList srsDimension="3">-0.286000 -0.164000 4.880000 -0.181000 -0.104000 4.117000 0.000000 -0.208000 4.117000 0.000000 -0.329000 4.880000 -0.286000 -0.164000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-46">
<gml:exterior>
<gml:LinearRing gml:id="ringID-46">
<gml:posList srsDimension="3">0.171000 0.099000 4.050000 0.138000 0.080000 3.982000 0.000000 0.160000 3.982000 0.000000 0.198000 4.050000 0.171000 0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-47">
<gml:exterior>
<gml:LinearRing gml:id="ringID-47">
<gml:posList srsDimension="3">0.000000 0.198000 4.050000 0.000000 0.209000 4.117000 0.181000 0.105000 4.117000 0.171000 0.099000 4.050000 0.000000 0.198000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-48">
<gml:exterior>
<gml:LinearRing gml:id="ringID-48">
<gml:posList srsDimension="3">-0.171000 -0.099000 4.050000 -0.181000 -0.104000 4.117000 -0.181000 0.105000 4.117000 -0.171000 0.099000 4.050000 -0.171000 -0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-49">
<gml:exterior>
<gml:LinearRing gml:id="ringID-49">
<gml:posList srsDimension="3">-0.171000 0.099000 4.050000 -0.138000 0.080000 3.982000 -0.138000 -0.080000 3.982000 -0.171000 -0.099000 4.050000 -0.171000 0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-50">
<gml:exterior>
<gml:LinearRing gml:id="ringID-50">
<gml:posList srsDimension="3">-0.171000 0.099000 4.050000 -0.181000 0.105000 4.117000 0.000000 0.209000 4.117000 0.000000 0.198000 4.050000 -0.171000 0.099000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-51">
<gml:exterior>
<gml:LinearRing gml:id="ringID-51">
<gml:posList srsDimension="3">0.000000 0.331000 4.880000 0.000000 0.209000 4.117000 -0.181000 0.105000 4.117000 -0.286000 0.166000 4.880000 0.000000 0.331000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-52">
<gml:exterior>
<gml:LinearRing gml:id="ringID-52">
<gml:posList srsDimension="3">-0.138000 0.080000 3.982000 0.000000 0.160000 3.982000 0.138000 0.080000 3.982000 0.138000 -0.080000 3.982000 0.000000 -0.160000 3.982000 -0.138000 -0.080000 3.982000 -0.138000 0.080000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-52_1">
<gml:posList srsDimension="3">0.069000 0.040000 3.982000 0.000000 0.080000 3.982000 -0.069000 0.040000 3.982000 -0.069000 -0.040000 3.982000 0.000000 -0.080000 3.982000 0.069000 -0.040000 3.982000 0.069000 0.040000 3.982000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-53">
<gml:exterior>
<gml:LinearRing gml:id="ringID-53">
<gml:posList srsDimension="3">0.052000 -0.030000 3.892000 0.052000 -0.030000 1.162000 0.052000 0.030000 1.162000 0.052000 0.030000 3.892000 0.052000 -0.030000 3.892000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-54">
<gml:exterior>
<gml:LinearRing gml:id="ringID-54">
<gml:posList srsDimension="3">0.000000 -0.197000 4.050000 0.000000 -0.208000 4.117000 -0.181000 -0.104000 4.117000 -0.171000 -0.099000 4.050000 0.000000 -0.197000 4.050000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-55">
<gml:exterior>
<gml:LinearRing gml:id="ringID-55">
<gml:posList srsDimension="3">0.286000 0.166000 4.880000 0.181000 0.105000 4.117000 0.000000 0.209000 4.117000 0.000000 0.331000 4.880000 0.286000 0.166000 4.880000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</gen:lod2Geometry>
</gen:GenericCityObject>
</core:cityObjectMember>
</core:CityModel>
<?xml version="1.0" encoding="UTF-8"?>
<core:CityModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:core="http://www.opengis.net/citygml/2.0"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:tran="http://www.opengis.net/citygml/transportation/2.0"
xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0"
xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language"
xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0"
xmlns:luse="http://www.opengis.net/citygml/landuse/2.0"
xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0"
xmlns:app="http://www.opengis.net/citygml/appearance/2.0"
xmlns:tex="http://www.opengis.net/citygml/texturedsurface/2.0"
xmlns:smil20="http://www.w3.org/2001/SMIL20/"
xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"
xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xmlns:dem="http://www.opengis.net/citygml/relief/2.0"
xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0"
xmlns:brid="http://www.opengis.net/citygml/bridge/2.0"
xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0"
xmlns:gen="http://www.opengis.net/citygml/generics/2.0"
xmlns:wfs="http://www.opengis.net/wfs"
xsi:schemaLocation="http://www.opengis.net/citygml/landuse/2.0 http://schemas.opengis.net/citygml/landuse/2.0/landUse.xsd http://www.opengis.net/citygml/cityfurniture/2.0 http://schemas.opengis.net/citygml/cityfurniture/2.0/cityFurniture.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/texturedsurface/2.0 http://schemas.opengis.net/citygml/texturedsurface/2.0/texturedSurface.xsd http://www.opengis.net/citygml/transportation/2.0 http://schemas.opengis.net/citygml/transportation/2.0/transportation.xsd http://www.opengis.net/citygml/waterbody/2.0 http://schemas.opengis.net/citygml/waterbody/2.0/waterBody.xsd http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/vegetation/2.0 http://schemas.opengis.net/citygml/vegetation/2.0/vegetation.xsd http://www.opengis.net/citygml/cityobjectgroup/2.0 http://schemas.opengis.net/citygml/cityobjectgroup/2.0/cityObjectGroup.xsd http://www.opengis.net/citygml/bridge/2.0 http://schemas.opengis.net/citygml/bridge/2.0/bridge.xsd http://www.opengis.net/citygml/tunnel/2.0 http://schemas.opengis.net/citygml/tunnel/2.0/tunnel.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<gml:description>G:\62\GIS_tui\Produkte\3D\Zusammenarbeit_Universitäten\HFT Stuttgart\Testdatensatz_28062022\Export_Wiesdorf.gml</gml:description>
<gml:name>G:\62\GIS_tui\Produkte\3D\Zusammenarbeit_Universitäten\HFT Stuttgart\Testdatensatz_28062022\Export_Wiesdorf.gml</gml:name>
<gml:boundedBy>
<gml:Envelope srsDimension="3" srsName="urn:ogc:def:crs:EPSG::25832">
<gml:lowerCorner>357978.09 5654873.32 0.00</gml:lowerCorner>
<gml:upperCorner>359213.91 5656013.49 0.00</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC40f8b818-84e2-4bf7-bbfa-22af5f20f9f3">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>359134.053 5655248.918 46.90999985</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC40f8b818-84e2-4bf7-bbfa-22af5f20f9f3"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC40f8b818-84e2-4bf7-bbfa-22af5f20f9f3"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC40f8b818-84e2-4bf7-bbfa-22af5f20f9f3"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC18370283-fc17-4a8d-812e-ac677b3cc6aa">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358805.594 5655223.78 46.59999847</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC18370283-fc17-4a8d-812e-ac677b3cc6aa"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC18370283-fc17-4a8d-812e-ac677b3cc6aa"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC18370283-fc17-4a8d-812e-ac677b3cc6aa"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="ICf9ac1d5a-4be4-466c-934e-58cdce2cb082">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358528.544 5655634.731 44.45999908</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#ICf9ac1d5a-4be4-466c-934e-58cdce2cb082"/>
<gen:lod3ImplicitRepresentation xlink:href="#ICf9ac1d5a-4be4-466c-934e-58cdce2cb082"/>
<gen:lod4ImplicitRepresentation xlink:href="#ICf9ac1d5a-4be4-466c-934e-58cdce2cb082"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC1f5d078e-869e-4adc-95bf-6e1ada98105d">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358921.258 5655754.859 44.00999832</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC1f5d078e-869e-4adc-95bf-6e1ada98105d"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC1f5d078e-869e-4adc-95bf-6e1ada98105d"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC1f5d078e-869e-4adc-95bf-6e1ada98105d"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC15f429a4-4997-4e7f-8eca-e5c6087ed869">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358566.979 5655138.757 46.36000061</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC15f429a4-4997-4e7f-8eca-e5c6087ed869"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC15f429a4-4997-4e7f-8eca-e5c6087ed869"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC15f429a4-4997-4e7f-8eca-e5c6087ed869"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="ICf9cb14cc-99a2-4bf2-ac68-75e876aebe1a">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358503.967 5655267.126 46.91999817</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#ICf9cb14cc-99a2-4bf2-ac68-75e876aebe1a"/>
<gen:lod3ImplicitRepresentation xlink:href="#ICf9cb14cc-99a2-4bf2-ac68-75e876aebe1a"/>
<gen:lod4ImplicitRepresentation xlink:href="#ICf9cb14cc-99a2-4bf2-ac68-75e876aebe1a"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC2df38958-7c1d-4804-aaea-93ea742e62c1">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>359055.978 5655849.151 42.93000031</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC2df38958-7c1d-4804-aaea-93ea742e62c1"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC2df38958-7c1d-4804-aaea-93ea742e62c1"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC2df38958-7c1d-4804-aaea-93ea742e62c1"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC6cd916e8-1916-4e68-ae19-2b48b02a3cd9">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358551.225 5655559.56 44.58000183</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC6cd916e8-1916-4e68-ae19-2b48b02a3cd9"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC6cd916e8-1916-4e68-ae19-2b48b02a3cd9"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC6cd916e8-1916-4e68-ae19-2b48b02a3cd9"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC9926fd28-fa21-4a5c-8829-9baf2100ee74">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>359050.629 5655010.897 45.25999832</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC9926fd28-fa21-4a5c-8829-9baf2100ee74"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC9926fd28-fa21-4a5c-8829-9baf2100ee74"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC9926fd28-fa21-4a5c-8829-9baf2100ee74"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC860511a3-6d12-4d5e-9ecc-c8c8ab866d48">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358445.815 5655744.757 43.90999985</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC860511a3-6d12-4d5e-9ecc-c8c8ab866d48"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC860511a3-6d12-4d5e-9ecc-c8c8ab866d48"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC860511a3-6d12-4d5e-9ecc-c8c8ab866d48"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC9a67f98b-ea7c-4650-a76b-70ddf055693e">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>357980.349 5655498.896 46.88999939</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC9a67f98b-ea7c-4650-a76b-70ddf055693e"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC9a67f98b-ea7c-4650-a76b-70ddf055693e"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC9a67f98b-ea7c-4650-a76b-70ddf055693e"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC574549b9-5daf-4404-922f-ad143f772cf5">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358828.134 5655492.423 45.84000015</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC574549b9-5daf-4404-922f-ad143f772cf5"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC574549b9-5daf-4404-922f-ad143f772cf5"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC574549b9-5daf-4404-922f-ad143f772cf5"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC16de12fd-a52a-4c99-91e1-6466bf223c35">
<core:transformationMatrix>
1.0 0.0 0 0
-0.0 1.0 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit2.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358872.807 5655511.242 45.72999954</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC16de12fd-a52a-4c99-91e1-6466bf223c35"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC16de12fd-a52a-4c99-91e1-6466bf223c35"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC16de12fd-a52a-4c99-91e1-6466bf223c35"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC06c0a1de-c757-41d1-8142-eb43b941c06e">
<core:transformationMatrix>
0.9444916824817261 -0.3285353279676911 0 0
0.3285353279676911 0.9444916824817261 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit1.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358600.899 5655436.227 46.47575902257221</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC06c0a1de-c757-41d1-8142-eb43b941c06e"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC06c0a1de-c757-41d1-8142-eb43b941c06e"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC06c0a1de-c757-41d1-8142-eb43b941c06e"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="ICe37a46d4-dd5c-4da4-bc63-4fd64104fa7f">
<core:transformationMatrix>
-0.9667328231176867 0.2557882888384602 0 0
-0.2557882888384602 -0.9667328231176867 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit1.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358564.214 5655406.122 46.67377932584644</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#ICe37a46d4-dd5c-4da4-bc63-4fd64104fa7f"/>
<gen:lod3ImplicitRepresentation xlink:href="#ICe37a46d4-dd5c-4da4-bc63-4fd64104fa7f"/>
<gen:lod4ImplicitRepresentation xlink:href="#ICe37a46d4-dd5c-4da4-bc63-4fd64104fa7f"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="ICd0cefddc-7ed8-44c4-8ef2-a7f517e374c5">
<core:transformationMatrix>
0.4199574315257782 0.9075438037396715 0 0
-0.9075438037396715 0.4199574315257782 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>Implicit1.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358996.371 5655511.698 47.731653352198045</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#ICd0cefddc-7ed8-44c4-8ef2-a7f517e374c5"/>
<gen:lod3ImplicitRepresentation xlink:href="#ICd0cefddc-7ed8-44c4-8ef2-a7f517e374c5"/>
<gen:lod4ImplicitRepresentation xlink:href="#ICd0cefddc-7ed8-44c4-8ef2-a7f517e374c5"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="IC8f1f5e1b-2612-49d8-b3a1-76a304142566">
<core:transformationMatrix>
-0.3960952573399263 -0.9182094244304061 0 0
0.9182094244304061 -0.3960952573399263 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>subdir/Implicit3.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358965.209 5655485.702 47.407838617376704</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#IC8f1f5e1b-2612-49d8-b3a1-76a304142566"/>
<gen:lod3ImplicitRepresentation xlink:href="#IC8f1f5e1b-2612-49d8-b3a1-76a304142566"/>
<gen:lod4ImplicitRepresentation xlink:href="#IC8f1f5e1b-2612-49d8-b3a1-76a304142566"/>
</gen:GenericCityObject>
</core:cityObjectMember>
<core:cityObjectMember>
<gen:GenericCityObject>
<gen:lod1ImplicitRepresentation>
<core:ImplicitGeometry gml:id="ICe80df500-b965-49be-b06a-3993f02370ce">
<core:transformationMatrix>
-0.35611833267672716 -0.9344408665782699 0 0
0.9344408665782699 -0.35611833267672716 0 0
0 0 1.0 0
0 0 0 1
</core:transformationMatrix>
<core:libraryObject>subdir/Implicit3.gml</core:libraryObject>
<core:referencePoint>
<gml:Point>
<gml:pos>358973.349 5655464.637 47.32017288640677</gml:pos>
</gml:Point>
</core:referencePoint>
</core:ImplicitGeometry>
</gen:lod1ImplicitRepresentation>
<gen:lod2ImplicitRepresentation xlink:href="#ICe80df500-b965-49be-b06a-3993f02370ce"/>
<gen:lod3ImplicitRepresentation xlink:href="#ICe80df500-b965-49be-b06a-3993f02370ce"/>
<gen:lod4ImplicitRepresentation xlink:href="#ICe80df500-b965-49be-b06a-3993f02370ce"/>
</gen:GenericCityObject>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<core:CityModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:core="http://www.opengis.net/citygml/2.0"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:tran="http://www.opengis.net/citygml/transportation/2.0"
xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0"
xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language"
xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0"
xmlns:luse="http://www.opengis.net/citygml/landuse/2.0"
xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0"
xmlns:app="http://www.opengis.net/citygml/appearance/2.0"
xmlns:tex="http://www.opengis.net/citygml/texturedsurface/2.0"
xmlns:smil20="http://www.w3.org/2001/SMIL20/"
xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"
xmlns:bldg="http://www.opengis.net/citygml/building/2.0"
xmlns:dem="http://www.opengis.net/citygml/relief/2.0"
xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0"
xmlns:brid="http://www.opengis.net/citygml/bridge/2.0"
xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0"
xmlns:gen="http://www.opengis.net/citygml/generics/2.0"
xmlns:wfs="http://www.opengis.net/wfs"
xsi:schemaLocation="http://www.opengis.net/citygml/landuse/2.0 http://schemas.opengis.net/citygml/landuse/2.0/landUse.xsd http://www.opengis.net/citygml/cityfurniture/2.0 http://schemas.opengis.net/citygml/cityfurniture/2.0/cityFurniture.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/texturedsurface/2.0 http://schemas.opengis.net/citygml/texturedsurface/2.0/texturedSurface.xsd http://www.opengis.net/citygml/transportation/2.0 http://schemas.opengis.net/citygml/transportation/2.0/transportation.xsd http://www.opengis.net/citygml/waterbody/2.0 http://schemas.opengis.net/citygml/waterbody/2.0/waterBody.xsd http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/vegetation/2.0 http://schemas.opengis.net/citygml/vegetation/2.0/vegetation.xsd http://www.opengis.net/citygml/cityobjectgroup/2.0 http://schemas.opengis.net/citygml/cityobjectgroup/2.0/cityObjectGroup.xsd http://www.opengis.net/citygml/bridge/2.0 http://schemas.opengis.net/citygml/bridge/2.0/bridge.xsd http://www.opengis.net/citygml/tunnel/2.0 http://schemas.opengis.net/citygml/tunnel/2.0/tunnel.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<gml:description>Testdataset</gml:description>
<gml:name>ImplicitGeometry zipfile testdata</gml:name>
<core:cityObjectMember>
<gen:GenericCityObject>
<gml:description>CPA_Symbol</gml:description>
<gml:name>Implicit3</gml:name>
<gen:lod2Geometry>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-5">
<gml:exterior>
<gml:LinearRing gml:id="ringID-5">
<gml:posList srsDimension="3">-0.147000 0.860000 1.282000 -0.147000 0.860000 1.232000 -1.238000 0.860000 1.232000 -1.238000 0.860000 1.282000 -0.147000 0.860000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-6">
<gml:exterior>
<gml:LinearRing gml:id="ringID-6">
<gml:posList srsDimension="3">-1.440000 0.760000 0.000000 -1.440000 0.760000 2.100000 -1.441000 -0.890000 2.100000 -1.441000 -0.890000 2.190000 -1.441000 -0.820000 2.260000 -1.440000 0.790000 2.260000 -1.440000 0.860000 2.190000 -1.440000 0.860000 0.000000 -1.440000 0.760000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-7">
<gml:exterior>
<gml:LinearRing gml:id="ringID-7">
<gml:posList srsDimension="3">-0.049000 -0.890000 2.100000 -0.049000 -0.890000 2.190000 -1.441000 -0.890000 2.190000 -1.441000 -0.890000 2.100000 -0.049000 -0.890000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-8">
<gml:exterior>
<gml:LinearRing gml:id="ringID-8">
<gml:posList srsDimension="3">-1.441000 -0.820000 2.260000 -1.441000 -0.890000 2.190000 -0.049000 -0.890000 2.190000 -0.049000 -0.820000 2.260000 -1.441000 -0.820000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-9">
<gml:exterior>
<gml:LinearRing gml:id="ringID-9">
<gml:posList srsDimension="3">-1.440000 0.860000 2.190000 -1.440000 0.790000 2.260000 -0.049000 0.790000 2.260000 -0.049000 0.860000 2.190000 -1.440000 0.860000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-10">
<gml:exterior>
<gml:LinearRing gml:id="ringID-10">
<gml:posList srsDimension="3">-1.238000 0.860000 1.132000 -1.238000 0.860000 1.182000 -0.147000 0.860000 1.182000 -0.147000 0.860000 1.132000 -1.238000 0.860000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-11">
<gml:exterior>
<gml:LinearRing gml:id="ringID-11">
<gml:posList srsDimension="3">-0.049000 0.790000 2.260000 -1.440000 0.790000 2.260000 -1.441000 -0.820000 2.260000 -0.049000 -0.820000 2.260000 -0.049000 0.790000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-12">
<gml:exterior>
<gml:LinearRing gml:id="ringID-12">
<gml:posList srsDimension="3">-1.342000 0.760000 2.100000 -1.440000 0.760000 2.100000 -1.440000 0.760000 0.000000 -1.342000 0.760000 0.000000 -1.342000 0.760000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-13">
<gml:exterior>
<gml:LinearRing gml:id="ringID-13">
<gml:posList srsDimension="3">-1.441000 -0.890000 2.100000 -1.440000 0.760000 2.100000 -1.342000 0.760000 2.100000 -1.342000 0.860000 2.100000 -0.049000 0.860000 2.100000 -0.049000 -0.890000 2.100000 -1.441000 -0.890000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-14">
<gml:exterior>
<gml:LinearRing gml:id="ringID-14">
<gml:posList srsDimension="3">-1.440000 0.860000 2.190000 -0.049000 0.860000 2.190000 -0.049000 0.860000 2.100000 -1.342000 0.860000 2.100000 -1.342000 0.860000 0.547000 -1.342000 0.860000 0.504000 -1.342000 0.860000 0.300000 -1.342000 0.860000 0.220000 -1.342000 0.860000 0.000000 -1.440000 0.860000 0.000000 -1.440000 0.860000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-15">
<gml:exterior>
<gml:LinearRing gml:id="ringID-15">
<gml:posList srsDimension="3">-1.342000 0.860000 0.220000 -1.342000 0.860000 0.300000 -0.049000 0.860000 0.300000 -0.049000 0.860000 0.220000 -1.342000 0.860000 0.220000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-16">
<gml:exterior>
<gml:LinearRing gml:id="ringID-16">
<gml:posList srsDimension="3">-1.342000 0.860000 2.100000 -1.342000 0.760000 2.100000 -1.342000 0.760000 0.000000 -1.342000 0.860000 0.000000 -1.342000 0.860000 0.220000 -1.342000 0.860000 0.300000 -1.342000 0.860000 0.504000 -1.342000 0.860000 0.547000 -1.342000 0.860000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-17">
<gml:exterior>
<gml:LinearRing gml:id="ringID-17">
<gml:posList srsDimension="3">-1.342000 0.860000 0.547000 -1.342000 0.860000 0.504000 -1.242000 0.860000 0.504000 -1.242000 0.860000 0.547000 -1.342000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-18">
<gml:exterior>
<gml:LinearRing gml:id="ringID-18">
<gml:posList srsDimension="3">-1.242000 0.860000 0.504000 -1.242000 0.535000 0.504000 -1.242000 0.535000 0.547000 -1.242000 0.860000 0.547000 -1.242000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-19">
<gml:exterior>
<gml:LinearRing gml:id="ringID-19">
<gml:posList srsDimension="3">-1.192000 0.535000 0.504000 -1.192000 0.860000 0.504000 -1.192000 0.860000 0.547000 -1.192000 0.535000 0.547000 -1.192000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-20">
<gml:exterior>
<gml:LinearRing gml:id="ringID-20">
<gml:posList srsDimension="3">-1.242000 0.535000 0.547000 -1.242000 0.535000 0.504000 -1.192000 0.535000 0.504000 -1.192000 0.535000 0.547000 -1.242000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-21">
<gml:exterior>
<gml:LinearRing gml:id="ringID-21">
<gml:posList srsDimension="3">-1.242000 0.860000 0.547000 -1.242000 0.535000 0.547000 -1.192000 0.535000 0.547000 -1.192000 0.860000 0.547000 -1.242000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-22">
<gml:exterior>
<gml:LinearRing gml:id="ringID-22">
<gml:posList srsDimension="3">-0.199000 0.860000 0.504000 -0.199000 0.535000 0.504000 -0.199000 0.535000 0.547000 -0.199000 0.860000 0.547000 -0.199000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-23">
<gml:exterior>
<gml:LinearRing gml:id="ringID-23">
<gml:posList srsDimension="3">-0.149000 0.535000 0.504000 -0.149000 0.535000 0.547000 -0.199000 0.535000 0.547000 -0.199000 0.535000 0.504000 -0.149000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-24">
<gml:exterior>
<gml:LinearRing gml:id="ringID-24">
<gml:posList srsDimension="3">-0.149000 0.535000 0.547000 -0.149000 0.860000 0.547000 -0.199000 0.860000 0.547000 -0.199000 0.535000 0.547000 -0.149000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-25">
<gml:exterior>
<gml:LinearRing gml:id="ringID-25">
<gml:posList srsDimension="3">-0.892000 0.860000 0.547000 -0.892000 0.535000 0.547000 -0.842000 0.535000 0.547000 -0.842000 0.860000 0.547000 -0.892000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-26">
<gml:exterior>
<gml:LinearRing gml:id="ringID-26">
<gml:posList srsDimension="3">-0.892000 0.535000 0.547000 -0.892000 0.535000 0.504000 -0.842000 0.535000 0.504000 -0.842000 0.535000 0.547000 -0.892000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-27">
<gml:exterior>
<gml:LinearRing gml:id="ringID-27">
<gml:posList srsDimension="3">-0.842000 0.535000 0.504000 -0.842000 0.860000 0.504000 -0.842000 0.860000 0.547000 -0.842000 0.535000 0.547000 -0.842000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-28">
<gml:exterior>
<gml:LinearRing gml:id="ringID-28">
<gml:posList srsDimension="3">-0.892000 0.860000 0.504000 -0.892000 0.535000 0.504000 -0.892000 0.535000 0.547000 -0.892000 0.860000 0.547000 -0.892000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-29">
<gml:exterior>
<gml:LinearRing gml:id="ringID-29">
<gml:posList srsDimension="3">-0.552000 0.535000 0.547000 -0.552000 0.535000 0.504000 -0.502000 0.535000 0.504000 -0.502000 0.535000 0.547000 -0.552000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-30">
<gml:exterior>
<gml:LinearRing gml:id="ringID-30">
<gml:posList srsDimension="3">-0.502000 0.535000 0.504000 -0.502000 0.860000 0.504000 -0.502000 0.860000 0.547000 -0.502000 0.535000 0.547000 -0.502000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-31">
<gml:exterior>
<gml:LinearRing gml:id="ringID-31">
<gml:posList srsDimension="3">-0.552000 0.860000 0.547000 -0.552000 0.535000 0.547000 -0.502000 0.535000 0.547000 -0.502000 0.860000 0.547000 -0.552000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-32">
<gml:exterior>
<gml:LinearRing gml:id="ringID-32">
<gml:posList srsDimension="3">-1.172000 0.840000 0.547000 -1.172000 0.535000 0.547000 -0.912000 0.535000 0.547000 -0.912000 0.840000 0.547000 -1.172000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-33">
<gml:exterior>
<gml:LinearRing gml:id="ringID-33">
<gml:posList srsDimension="3">-1.172000 0.535000 0.520000 -1.172000 0.840000 0.520000 -0.912000 0.840000 0.520000 -0.912000 0.535000 0.520000 -1.172000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-34">
<gml:exterior>
<gml:LinearRing gml:id="ringID-34">
<gml:posList srsDimension="3">-1.172000 0.535000 0.547000 -1.172000 0.840000 0.547000 -1.172000 0.840000 0.520000 -1.172000 0.535000 0.520000 -1.172000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-35">
<gml:exterior>
<gml:LinearRing gml:id="ringID-35">
<gml:posList srsDimension="3">-1.172000 0.840000 0.547000 -0.912000 0.840000 0.547000 -0.912000 0.840000 0.520000 -1.172000 0.840000 0.520000 -1.172000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-36">
<gml:exterior>
<gml:LinearRing gml:id="ringID-36">
<gml:posList srsDimension="3">-0.912000 0.840000 0.547000 -0.912000 0.535000 0.547000 -0.912000 0.535000 0.520000 -0.912000 0.840000 0.520000 -0.912000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-37">
<gml:exterior>
<gml:LinearRing gml:id="ringID-37">
<gml:posList srsDimension="3">-0.912000 0.535000 0.547000 -1.172000 0.535000 0.547000 -1.172000 0.535000 0.520000 -0.912000 0.535000 0.520000 -0.912000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-38">
<gml:exterior>
<gml:LinearRing gml:id="ringID-38">
<gml:posList srsDimension="3">-0.552000 0.860000 0.504000 -0.552000 0.535000 0.504000 -0.552000 0.535000 0.547000 -0.552000 0.860000 0.547000 -0.552000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-39">
<gml:exterior>
<gml:LinearRing gml:id="ringID-39">
<gml:posList srsDimension="3">-0.828000 0.840000 0.547000 -0.568000 0.840000 0.547000 -0.568000 0.840000 0.520000 -0.828000 0.840000 0.520000 -0.828000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-40">
<gml:exterior>
<gml:LinearRing gml:id="ringID-40">
<gml:posList srsDimension="3">-0.828000 0.535000 0.520000 -0.828000 0.840000 0.520000 -0.568000 0.840000 0.520000 -0.568000 0.535000 0.520000 -0.828000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-41">
<gml:exterior>
<gml:LinearRing gml:id="ringID-41">
<gml:posList srsDimension="3">-0.828000 0.535000 0.547000 -0.828000 0.840000 0.547000 -0.828000 0.840000 0.520000 -0.828000 0.535000 0.520000 -0.828000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-42">
<gml:exterior>
<gml:LinearRing gml:id="ringID-42">
<gml:posList srsDimension="3">-0.568000 0.535000 0.547000 -0.828000 0.535000 0.547000 -0.828000 0.535000 0.520000 -0.568000 0.535000 0.520000 -0.568000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-43">
<gml:exterior>
<gml:LinearRing gml:id="ringID-43">
<gml:posList srsDimension="3">-0.568000 0.840000 0.547000 -0.568000 0.535000 0.547000 -0.568000 0.535000 0.520000 -0.568000 0.840000 0.520000 -0.568000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-44">
<gml:exterior>
<gml:LinearRing gml:id="ringID-44">
<gml:posList srsDimension="3">-0.828000 0.840000 0.547000 -0.828000 0.535000 0.547000 -0.568000 0.535000 0.547000 -0.568000 0.840000 0.547000 -0.828000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-45">
<gml:exterior>
<gml:LinearRing gml:id="ringID-45">
<gml:posList srsDimension="3">-0.481000 0.840000 0.547000 -0.481000 0.535000 0.547000 -0.221000 0.535000 0.547000 -0.221000 0.840000 0.547000 -0.481000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-46">
<gml:exterior>
<gml:LinearRing gml:id="ringID-46">
<gml:posList srsDimension="3">-0.221000 0.840000 0.547000 -0.221000 0.535000 0.547000 -0.221000 0.535000 0.520000 -0.221000 0.840000 0.520000 -0.221000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-47">
<gml:exterior>
<gml:LinearRing gml:id="ringID-47">
<gml:posList srsDimension="3">-0.481000 0.535000 0.520000 -0.481000 0.840000 0.520000 -0.221000 0.840000 0.520000 -0.221000 0.535000 0.520000 -0.481000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-48">
<gml:exterior>
<gml:LinearRing gml:id="ringID-48">
<gml:posList srsDimension="3">-0.221000 0.535000 0.547000 -0.481000 0.535000 0.547000 -0.481000 0.535000 0.520000 -0.221000 0.535000 0.520000 -0.221000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-49">
<gml:exterior>
<gml:LinearRing gml:id="ringID-49">
<gml:posList srsDimension="3">-0.481000 0.840000 0.547000 -0.221000 0.840000 0.547000 -0.221000 0.840000 0.520000 -0.481000 0.840000 0.520000 -0.481000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-50">
<gml:exterior>
<gml:LinearRing gml:id="ringID-50">
<gml:posList srsDimension="3">-0.481000 0.535000 0.547000 -0.481000 0.840000 0.547000 -0.481000 0.840000 0.520000 -0.481000 0.535000 0.520000 -0.481000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-51">
<gml:exterior>
<gml:LinearRing gml:id="ringID-51">
<gml:posList srsDimension="3">-0.149000 0.535000 0.504000 -0.149000 0.860000 0.504000 -0.149000 0.860000 0.547000 -0.149000 0.535000 0.547000 -0.149000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-52">
<gml:exterior>
<gml:LinearRing gml:id="ringID-52">
<gml:posList srsDimension="3">-0.502000 0.860000 0.547000 -0.502000 0.860000 0.504000 -0.552000 0.860000 0.504000 -0.552000 0.860000 0.547000 -0.502000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-53">
<gml:exterior>
<gml:LinearRing gml:id="ringID-53">
<gml:posList srsDimension="3">-0.842000 0.860000 0.547000 -0.842000 0.860000 0.504000 -0.892000 0.860000 0.504000 -0.892000 0.860000 0.547000 -0.842000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-54">
<gml:exterior>
<gml:LinearRing gml:id="ringID-54">
<gml:posList srsDimension="3">-0.149000 0.860000 0.504000 -0.199000 0.860000 0.504000 -0.199000 0.860000 0.547000 -0.149000 0.860000 0.547000 -0.149000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-55">
<gml:exterior>
<gml:LinearRing gml:id="ringID-55">
<gml:posList srsDimension="3">-1.192000 0.860000 0.504000 -1.242000 0.860000 0.504000 -1.242000 0.860000 0.547000 -1.192000 0.860000 0.547000 -1.192000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-56">
<gml:exterior>
<gml:LinearRing gml:id="ringID-56">
<gml:posList srsDimension="3">-1.242000 0.860000 0.504000 -1.192000 0.860000 0.504000 -0.892000 0.860000 0.504000 -0.842000 0.860000 0.504000 -0.552000 0.860000 0.504000 -0.502000 0.860000 0.504000 -0.199000 0.860000 0.504000 -0.149000 0.860000 0.504000 -0.049000 0.860000 0.504000 -0.049000 0.860000 0.300000 -1.342000 0.860000 0.300000 -1.342000 0.860000 0.504000 -1.242000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-57">
<gml:exterior>
<gml:LinearRing gml:id="ringID-57">
<gml:posList srsDimension="3">-0.842000 0.860000 0.547000 -0.842000 0.860000 0.504000 -0.552000 0.860000 0.504000 -0.552000 0.860000 0.547000 -0.842000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-58">
<gml:exterior>
<gml:LinearRing gml:id="ringID-58">
<gml:posList srsDimension="3">-1.192000 0.860000 0.547000 -1.192000 0.860000 0.504000 -0.892000 0.860000 0.504000 -0.892000 0.860000 0.547000 -1.192000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-59">
<gml:exterior>
<gml:LinearRing gml:id="ringID-59">
<gml:posList srsDimension="3">-0.502000 0.860000 0.547000 -0.502000 0.860000 0.504000 -0.199000 0.860000 0.504000 -0.199000 0.860000 0.547000 -0.502000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-60">
<gml:exterior>
<gml:LinearRing gml:id="ringID-60">
<gml:posList srsDimension="3">-0.149000 0.860000 0.547000 -0.149000 0.860000 0.504000 -0.049000 0.860000 0.504000 -0.049000 0.860000 0.547000 -0.149000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-61">
<gml:exterior>
<gml:LinearRing gml:id="ringID-61">
<gml:posList srsDimension="3">-0.049000 0.860000 2.100000 -0.049000 0.860000 0.547000 -0.149000 0.860000 0.547000 -0.199000 0.860000 0.547000 -0.502000 0.860000 0.547000 -0.552000 0.860000 0.547000 -0.842000 0.860000 0.547000 -0.892000 0.860000 0.547000 -1.192000 0.860000 0.547000 -1.242000 0.860000 0.547000 -1.342000 0.860000 0.547000 -1.342000 0.860000 2.100000 -0.049000 0.860000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-61_1">
<gml:posList srsDimension="3">-0.147000 0.860000 1.182000 -1.238000 0.860000 1.182000 -1.238000 0.860000 1.132000 -0.147000 0.860000 1.132000 -0.147000 0.860000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-61_2">
<gml:posList srsDimension="3">-1.238000 0.860000 1.282000 -1.238000 0.860000 1.232000 -0.147000 0.860000 1.232000 -0.147000 0.860000 1.282000 -1.238000 0.860000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-62">
<gml:exterior>
<gml:LinearRing gml:id="ringID-62">
<gml:posList srsDimension="3">2.832000 0.759000 2.100000 2.734000 0.759000 2.100000 2.734000 0.759000 0.000000 2.832000 0.759000 0.000000 2.832000 0.759000 0.220000 2.832000 0.759000 0.300000 2.832000 0.759000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-63">
<gml:exterior>
<gml:LinearRing gml:id="ringID-63">
<gml:posList srsDimension="3">2.764000 0.789000 2.260000 2.832000 0.859000 2.190000 1.343000 0.859000 2.190000 1.343000 0.789000 2.260000 2.764000 0.789000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-64">
<gml:exterior>
<gml:LinearRing gml:id="ringID-64">
<gml:posList srsDimension="3">2.832000 -0.391000 1.182000 2.832000 -0.391000 1.132000 2.832000 0.659000 1.132000 2.832000 0.659000 1.182000 2.832000 -0.391000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-65">
<gml:exterior>
<gml:LinearRing gml:id="ringID-65">
<gml:posList srsDimension="3">2.832000 0.859000 2.190000 2.764000 0.789000 2.260000 2.763000 -0.821000 2.260000 2.832000 -0.891000 2.190000 2.832000 0.859000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-66">
<gml:exterior>
<gml:LinearRing gml:id="ringID-66">
<gml:posList srsDimension="3">1.343000 -0.891000 2.190000 2.832000 -0.891000 2.190000 2.763000 -0.821000 2.260000 1.343000 -0.821000 2.260000 1.343000 -0.891000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-67">
<gml:exterior>
<gml:LinearRing gml:id="ringID-67">
<gml:posList srsDimension="3">1.539000 0.859000 1.232000 1.539000 0.859000 1.282000 2.630000 0.859000 1.282000 2.630000 0.859000 1.232000 1.539000 0.859000 1.232000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-68">
<gml:exterior>
<gml:LinearRing gml:id="ringID-68">
<gml:posList srsDimension="3">2.734000 -0.591000 2.100000 2.734000 -0.591000 0.000000 2.832000 -0.591000 0.000000 2.832000 -0.591000 2.100000 2.734000 -0.591000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-69">
<gml:exterior>
<gml:LinearRing gml:id="ringID-69">
<gml:posList srsDimension="3">2.832000 -0.491000 0.300000 2.832000 -0.491000 0.220000 2.832000 0.759000 0.220000 2.832000 0.759000 0.300000 2.832000 -0.491000 0.300000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-70">
<gml:exterior>
<gml:LinearRing gml:id="ringID-70">
<gml:posList srsDimension="3">2.734000 -0.591000 2.100000 2.734000 -0.491000 2.100000 2.734000 -0.491000 0.000000 2.734000 -0.591000 0.000000 2.734000 -0.591000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-71">
<gml:exterior>
<gml:LinearRing gml:id="ringID-71">
<gml:posList srsDimension="3">2.734000 0.859000 0.300000 2.734000 0.859000 0.220000 1.441000 0.859000 0.220000 1.441000 0.859000 0.300000 2.734000 0.859000 0.300000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-72">
<gml:exterior>
<gml:LinearRing gml:id="ringID-72">
<gml:posList srsDimension="3">1.441000 0.859000 2.100000 2.734000 0.859000 2.100000 2.734000 0.859000 0.300000 1.441000 0.859000 0.300000 1.441000 0.859000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-72_1">
<gml:posList srsDimension="3">2.630000 0.859000 1.182000 1.539000 0.859000 1.182000 1.539000 0.859000 1.132000 2.630000 0.859000 1.132000 2.630000 0.859000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-72_2">
<gml:posList srsDimension="3">2.630000 0.859000 1.232000 2.630000 0.859000 1.282000 1.539000 0.859000 1.282000 1.539000 0.859000 1.232000 2.630000 0.859000 1.232000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-73">
<gml:exterior>
<gml:LinearRing gml:id="ringID-73">
<gml:posList srsDimension="3">2.832000 0.659000 1.232000 2.832000 0.659000 1.282000 2.832000 -0.391000 1.282000 2.832000 -0.391000 1.232000 2.832000 0.659000 1.232000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-74">
<gml:exterior>
<gml:LinearRing gml:id="ringID-74">
<gml:posList srsDimension="3">2.630000 0.859000 1.182000 2.630000 0.859000 1.132000 1.539000 0.859000 1.132000 1.539000 0.859000 1.182000 2.630000 0.859000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-75">
<gml:exterior>
<gml:LinearRing gml:id="ringID-75">
<gml:posList srsDimension="3">2.734000 0.759000 2.100000 2.734000 0.859000 2.100000 2.734000 0.859000 0.300000 2.734000 0.859000 0.220000 2.734000 0.859000 0.000000 2.734000 0.759000 0.000000 2.734000 0.759000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-76">
<gml:exterior>
<gml:LinearRing gml:id="ringID-76">
<gml:posList srsDimension="3">2.832000 -0.491000 2.100000 2.832000 -0.491000 0.300000 2.832000 0.759000 0.300000 2.832000 0.759000 2.100000 2.832000 -0.491000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-76_1">
<gml:posList srsDimension="3">2.832000 -0.391000 1.132000 2.832000 -0.391000 1.182000 2.832000 0.659000 1.182000 2.832000 0.659000 1.132000 2.832000 -0.391000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-76_2">
<gml:posList srsDimension="3">2.832000 0.659000 1.232000 2.832000 -0.391000 1.232000 2.832000 -0.391000 1.282000 2.832000 0.659000 1.282000 2.832000 0.659000 1.232000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-77">
<gml:exterior>
<gml:LinearRing gml:id="ringID-77">
<gml:posList srsDimension="3">2.832000 -0.891000 2.100000 2.832000 -0.891000 2.190000 1.343000 -0.891000 2.190000 1.343000 -0.891000 2.100000 2.832000 -0.891000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-78">
<gml:exterior>
<gml:LinearRing gml:id="ringID-78">
<gml:posList srsDimension="3">2.832000 0.859000 0.000000 2.832000 0.859000 2.190000 2.832000 -0.891000 2.190000 2.832000 -0.891000 2.100000 2.832000 -0.591000 2.100000 2.832000 -0.591000 0.000000 2.832000 -0.491000 0.000000 2.832000 -0.491000 0.220000 2.832000 -0.491000 0.300000 2.832000 -0.491000 2.100000 2.832000 0.759000 2.100000 2.832000 0.759000 0.300000 2.832000 0.759000 0.220000 2.832000 0.759000 0.000000 2.832000 0.859000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-79">
<gml:exterior>
<gml:LinearRing gml:id="ringID-79">
<gml:posList srsDimension="3">2.734000 0.859000 2.100000 1.441000 0.859000 2.100000 1.441000 0.859000 0.300000 1.441000 0.859000 0.220000 1.441000 0.859000 0.000000 1.343000 0.859000 0.000000 1.343000 0.859000 2.190000 2.832000 0.859000 2.190000 2.832000 0.859000 0.000000 2.734000 0.859000 0.000000 2.734000 0.859000 0.220000 2.734000 0.859000 0.300000 2.734000 0.859000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-80">
<gml:exterior>
<gml:LinearRing gml:id="ringID-80">
<gml:posList srsDimension="3">2.734000 -0.491000 2.100000 2.832000 -0.491000 2.100000 2.832000 -0.491000 0.300000 2.832000 -0.491000 0.220000 2.832000 -0.491000 0.000000 2.734000 -0.491000 0.000000 2.734000 -0.491000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-81">
<gml:exterior>
<gml:LinearRing gml:id="ringID-81">
<gml:posList srsDimension="3">2.764000 0.789000 2.260000 1.343000 0.789000 2.260000 1.343000 -0.821000 2.260000 2.763000 -0.821000 2.260000 2.764000 0.789000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-82">
<gml:exterior>
<gml:LinearRing gml:id="ringID-82">
<gml:posList srsDimension="3">1.441000 0.759000 2.100000 1.343000 0.759000 2.100000 1.343000 0.759000 0.000000 1.441000 0.759000 0.000000 1.441000 0.759000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-83">
<gml:exterior>
<gml:LinearRing gml:id="ringID-83">
<gml:posList srsDimension="3">1.343000 0.759000 0.000000 1.343000 0.759000 2.100000 1.343000 -0.891000 2.100000 1.343000 -0.891000 2.190000 1.343000 -0.821000 2.260000 1.343000 0.789000 2.260000 1.343000 0.859000 2.190000 1.343000 0.859000 0.000000 1.343000 0.759000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-84">
<gml:exterior>
<gml:LinearRing gml:id="ringID-84">
<gml:posList srsDimension="3">1.441000 0.859000 2.100000 1.441000 0.759000 2.100000 1.441000 0.759000 0.000000 1.441000 0.859000 0.000000 1.441000 0.859000 0.220000 1.441000 0.859000 0.300000 1.441000 0.859000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-85">
<gml:exterior>
<gml:LinearRing gml:id="ringID-85">
<gml:posList srsDimension="3">2.832000 -0.591000 2.100000 2.832000 -0.891000 2.100000 1.343000 -0.891000 2.100000 1.343000 0.759000 2.100000 1.441000 0.759000 2.100000 1.441000 0.859000 2.100000 2.734000 0.859000 2.100000 2.734000 0.759000 2.100000 2.832000 0.759000 2.100000 2.832000 -0.491000 2.100000 2.734000 -0.491000 2.100000 2.734000 -0.591000 2.100000 2.832000 -0.591000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-86">
<gml:exterior>
<gml:LinearRing gml:id="ringID-86">
<gml:posList srsDimension="3">-1.441000 -0.890000 2.100000 -1.441000 -0.890000 2.190000 -2.832000 -0.890000 2.190000 -2.832000 -0.890000 2.100000 -1.441000 -0.890000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-87">
<gml:exterior>
<gml:LinearRing gml:id="ringID-87">
<gml:posList srsDimension="3">-2.832000 -0.490000 0.300000 -2.832000 -0.490000 2.100000 -2.832000 0.760000 2.100000 -2.832000 0.760000 0.300000 -2.832000 -0.490000 0.300000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-87_1">
<gml:posList srsDimension="3">-2.832000 0.660000 1.132000 -2.832000 0.660000 1.182000 -2.832000 -0.390000 1.182000 -2.832000 -0.390000 1.132000 -2.832000 0.660000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-87_2">
<gml:posList srsDimension="3">-2.832000 -0.390000 1.232000 -2.832000 0.660000 1.232000 -2.832000 0.660000 1.282000 -2.832000 -0.390000 1.282000 -2.832000 -0.390000 1.232000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-88">
<gml:exterior>
<gml:LinearRing gml:id="ringID-88">
<gml:posList srsDimension="3">-2.763000 0.790000 2.260000 -2.764000 -0.820000 2.260000 -1.441000 -0.820000 2.260000 -1.441000 0.790000 2.260000 -2.763000 0.790000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-89">
<gml:exterior>
<gml:LinearRing gml:id="ringID-89">
<gml:posList srsDimension="3">-2.832000 0.860000 2.190000 -1.441000 0.860000 2.190000 -1.441000 0.860000 2.100000 -2.734000 0.860000 2.100000 -2.734000 0.860000 0.300000 -2.734000 0.860000 0.220000 -2.734000 0.860000 0.000000 -2.832000 0.860000 0.000000 -2.832000 0.860000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-90">
<gml:exterior>
<gml:LinearRing gml:id="ringID-90">
<gml:posList srsDimension="3">-2.832000 0.760000 2.100000 -2.734000 0.760000 2.100000 -2.734000 0.860000 2.100000 -1.441000 0.860000 2.100000 -1.441000 -0.890000 2.100000 -2.832000 -0.890000 2.100000 -2.832000 -0.590000 2.100000 -2.734000 -0.590000 2.100000 -2.734000 -0.490000 2.100000 -2.832000 -0.490000 2.100000 -2.832000 0.760000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-91">
<gml:exterior>
<gml:LinearRing gml:id="ringID-91">
<gml:posList srsDimension="3">-2.832000 0.760000 0.300000 -2.832000 0.760000 2.100000 -2.832000 -0.490000 2.100000 -2.832000 -0.490000 0.300000 -2.832000 -0.490000 0.220000 -2.832000 -0.490000 0.000000 -2.832000 -0.590000 0.000000 -2.832000 -0.590000 2.100000 -2.832000 -0.890000 2.100000 -2.832000 -0.890000 2.190000 -2.832000 0.860000 2.190000 -2.832000 0.860000 0.000000 -2.832000 0.760000 0.000000 -2.832000 0.760000 0.220000 -2.832000 0.760000 0.300000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-92">
<gml:exterior>
<gml:LinearRing gml:id="ringID-92">
<gml:posList srsDimension="3">-2.832000 -0.490000 2.100000 -2.734000 -0.490000 2.100000 -2.734000 -0.490000 0.000000 -2.832000 -0.490000 0.000000 -2.832000 -0.490000 0.220000 -2.832000 -0.490000 0.300000 -2.832000 -0.490000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-93">
<gml:exterior>
<gml:LinearRing gml:id="ringID-93">
<gml:posList srsDimension="3">-2.734000 -0.590000 2.100000 -2.832000 -0.590000 2.100000 -2.832000 -0.590000 0.000000 -2.734000 -0.590000 0.000000 -2.734000 -0.590000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-94">
<gml:exterior>
<gml:LinearRing gml:id="ringID-94">
<gml:posList srsDimension="3">-2.763000 0.790000 2.260000 -2.832000 0.860000 2.190000 -2.832000 -0.890000 2.190000 -2.764000 -0.820000 2.260000 -2.763000 0.790000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-95">
<gml:exterior>
<gml:LinearRing gml:id="ringID-95">
<gml:posList srsDimension="3">-2.734000 -0.490000 2.100000 -2.734000 -0.590000 2.100000 -2.734000 -0.590000 0.000000 -2.734000 -0.490000 0.000000 -2.734000 -0.490000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-96">
<gml:exterior>
<gml:LinearRing gml:id="ringID-96">
<gml:posList srsDimension="3">-1.441000 -0.890000 2.190000 -1.441000 -0.820000 2.260000 -2.764000 -0.820000 2.260000 -2.832000 -0.890000 2.190000 -1.441000 -0.890000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-97">
<gml:exterior>
<gml:LinearRing gml:id="ringID-97">
<gml:posList srsDimension="3">-2.734000 0.760000 2.100000 -2.832000 0.760000 2.100000 -2.832000 0.760000 0.300000 -2.832000 0.760000 0.220000 -2.832000 0.760000 0.000000 -2.734000 0.760000 0.000000 -2.734000 0.760000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-98">
<gml:exterior>
<gml:LinearRing gml:id="ringID-98">
<gml:posList srsDimension="3">-1.441000 0.790000 2.260000 -1.441000 0.860000 2.190000 -2.832000 0.860000 2.190000 -2.763000 0.790000 2.260000 -1.441000 0.790000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-99">
<gml:exterior>
<gml:LinearRing gml:id="ringID-99">
<gml:posList srsDimension="3">-2.734000 0.860000 2.100000 -2.734000 0.760000 2.100000 -2.734000 0.760000 0.000000 -2.734000 0.860000 0.000000 -2.734000 0.860000 0.220000 -2.734000 0.860000 0.300000 -2.734000 0.860000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-100">
<gml:exterior>
<gml:LinearRing gml:id="ringID-100">
<gml:posList srsDimension="3">-2.832000 -0.490000 0.220000 -2.832000 -0.490000 0.300000 -2.832000 0.760000 0.300000 -2.832000 0.760000 0.220000 -2.832000 -0.490000 0.220000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-101">
<gml:exterior>
<gml:LinearRing gml:id="ringID-101">
<gml:posList srsDimension="3">-2.734000 0.860000 0.220000 -2.734000 0.860000 0.300000 -1.441000 0.860000 0.300000 -1.441000 0.860000 0.220000 -2.734000 0.860000 0.220000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-102">
<gml:exterior>
<gml:LinearRing gml:id="ringID-102">
<gml:posList srsDimension="3">-2.832000 0.660000 1.282000 -2.832000 0.660000 1.232000 -2.832000 -0.390000 1.232000 -2.832000 -0.390000 1.282000 -2.832000 0.660000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-103">
<gml:exterior>
<gml:LinearRing gml:id="ringID-103">
<gml:posList srsDimension="3">-2.832000 -0.390000 1.132000 -2.832000 -0.390000 1.182000 -2.832000 0.660000 1.182000 -2.832000 0.660000 1.132000 -2.832000 -0.390000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-104">
<gml:exterior>
<gml:LinearRing gml:id="ringID-104">
<gml:posList srsDimension="3">-2.629000 0.860000 1.132000 -2.629000 0.860000 1.182000 -1.539000 0.860000 1.182000 -1.539000 0.860000 1.132000 -2.629000 0.860000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-105">
<gml:exterior>
<gml:LinearRing gml:id="ringID-105">
<gml:posList srsDimension="3">-1.539000 0.860000 1.282000 -1.539000 0.860000 1.232000 -2.629000 0.860000 1.232000 -2.629000 0.860000 1.282000 -1.539000 0.860000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-106">
<gml:exterior>
<gml:LinearRing gml:id="ringID-106">
<gml:posList srsDimension="3">-2.734000 0.860000 2.100000 -1.441000 0.860000 2.100000 -1.441000 0.860000 0.300000 -2.734000 0.860000 0.300000 -2.734000 0.860000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-106_1">
<gml:posList srsDimension="3">-1.539000 0.860000 1.182000 -2.629000 0.860000 1.182000 -2.629000 0.860000 1.132000 -1.539000 0.860000 1.132000 -1.539000 0.860000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-106_2">
<gml:posList srsDimension="3">-2.629000 0.860000 1.282000 -2.629000 0.860000 1.232000 -1.539000 0.860000 1.232000 -1.539000 0.860000 1.282000 -2.629000 0.860000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-107">
<gml:exterior>
<gml:LinearRing gml:id="ringID-107">
<gml:posList srsDimension="3">1.245000 0.859000 1.282000 1.245000 0.859000 1.232000 0.154000 0.860000 1.232000 0.154000 0.860000 1.282000 1.245000 0.859000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-108">
<gml:exterior>
<gml:LinearRing gml:id="ringID-108">
<gml:posList srsDimension="3">-0.049000 0.760000 0.000000 -0.049000 0.760000 2.100000 -0.049000 -0.890000 2.100000 -0.049000 -0.890000 2.190000 -0.049000 -0.820000 2.260000 -0.049000 0.790000 2.260000 -0.049000 0.860000 2.190000 -0.049000 0.860000 0.000000 -0.049000 0.760000 0.000000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-109">
<gml:exterior>
<gml:LinearRing gml:id="ringID-109">
<gml:posList srsDimension="3">1.343000 -0.891000 2.100000 1.343000 -0.891000 2.190000 -0.049000 -0.890000 2.190000 -0.049000 -0.890000 2.100000 1.343000 -0.891000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-110">
<gml:exterior>
<gml:LinearRing gml:id="ringID-110">
<gml:posList srsDimension="3">-0.049000 -0.820000 2.260000 -0.049000 -0.890000 2.190000 1.343000 -0.891000 2.190000 1.343000 -0.821000 2.260000 -0.049000 -0.820000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-111">
<gml:exterior>
<gml:LinearRing gml:id="ringID-111">
<gml:posList srsDimension="3">-0.049000 0.860000 2.190000 -0.049000 0.790000 2.260000 1.343000 0.789000 2.260000 1.343000 0.859000 2.190000 -0.049000 0.860000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-112">
<gml:exterior>
<gml:LinearRing gml:id="ringID-112">
<gml:posList srsDimension="3">0.154000 0.860000 1.132000 0.154000 0.860000 1.182000 1.245000 0.859000 1.182000 1.245000 0.859000 1.132000 0.154000 0.860000 1.132000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-113">
<gml:exterior>
<gml:LinearRing gml:id="ringID-113">
<gml:posList srsDimension="3">1.343000 0.789000 2.260000 -0.049000 0.790000 2.260000 -0.049000 -0.820000 2.260000 1.343000 -0.821000 2.260000 1.343000 0.789000 2.260000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-114">
<gml:exterior>
<gml:LinearRing gml:id="ringID-114">
<gml:posList srsDimension="3">0.049000 0.760000 2.100000 -0.049000 0.760000 2.100000 -0.049000 0.760000 0.000000 0.049000 0.760000 0.000000 0.049000 0.760000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-115">
<gml:exterior>
<gml:LinearRing gml:id="ringID-115">
<gml:posList srsDimension="3">-0.049000 -0.890000 2.100000 -0.049000 0.760000 2.100000 0.049000 0.760000 2.100000 0.049000 0.860000 2.100000 1.343000 0.859000 2.100000 1.343000 -0.891000 2.100000 -0.049000 -0.890000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-116">
<gml:exterior>
<gml:LinearRing gml:id="ringID-116">
<gml:posList srsDimension="3">-0.049000 0.860000 2.190000 1.343000 0.859000 2.190000 1.343000 0.859000 2.100000 0.049000 0.860000 2.100000 0.049000 0.860000 0.547000 0.049000 0.860000 0.504000 0.049000 0.860000 0.300000 0.049000 0.860000 0.220000 0.049000 0.860000 0.000000 -0.049000 0.860000 0.000000 -0.049000 0.860000 2.190000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-117">
<gml:exterior>
<gml:LinearRing gml:id="ringID-117">
<gml:posList srsDimension="3">0.049000 0.860000 0.220000 0.049000 0.860000 0.300000 1.343000 0.859000 0.300000 1.343000 0.859000 0.220000 0.049000 0.860000 0.220000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-118">
<gml:exterior>
<gml:LinearRing gml:id="ringID-118">
<gml:posList srsDimension="3">0.049000 0.860000 2.100000 0.049000 0.760000 2.100000 0.049000 0.760000 0.000000 0.049000 0.860000 0.000000 0.049000 0.860000 0.220000 0.049000 0.860000 0.300000 0.049000 0.860000 0.504000 0.049000 0.860000 0.547000 0.049000 0.860000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-119">
<gml:exterior>
<gml:LinearRing gml:id="ringID-119">
<gml:posList srsDimension="3">0.049000 0.860000 0.547000 0.049000 0.860000 0.504000 0.149000 0.860000 0.504000 0.149000 0.860000 0.547000 0.049000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-120">
<gml:exterior>
<gml:LinearRing gml:id="ringID-120">
<gml:posList srsDimension="3">0.149000 0.860000 0.504000 0.149000 0.535000 0.504000 0.149000 0.535000 0.547000 0.149000 0.860000 0.547000 0.149000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-121">
<gml:exterior>
<gml:LinearRing gml:id="ringID-121">
<gml:posList srsDimension="3">0.199000 0.535000 0.504000 0.199000 0.860000 0.504000 0.199000 0.860000 0.547000 0.199000 0.535000 0.547000 0.199000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-122">
<gml:exterior>
<gml:LinearRing gml:id="ringID-122">
<gml:posList srsDimension="3">0.149000 0.535000 0.547000 0.149000 0.535000 0.504000 0.199000 0.535000 0.504000 0.199000 0.535000 0.547000 0.149000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-123">
<gml:exterior>
<gml:LinearRing gml:id="ringID-123">
<gml:posList srsDimension="3">0.149000 0.860000 0.547000 0.149000 0.535000 0.547000 0.199000 0.535000 0.547000 0.199000 0.860000 0.547000 0.149000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-124">
<gml:exterior>
<gml:LinearRing gml:id="ringID-124">
<gml:posList srsDimension="3">1.193000 0.859000 0.504000 1.192000 0.534000 0.504000 1.192000 0.534000 0.547000 1.193000 0.859000 0.547000 1.193000 0.859000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-125">
<gml:exterior>
<gml:LinearRing gml:id="ringID-125">
<gml:posList srsDimension="3">1.242000 0.534000 0.504000 1.242000 0.534000 0.547000 1.192000 0.534000 0.547000 1.192000 0.534000 0.504000 1.242000 0.534000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-126">
<gml:exterior>
<gml:LinearRing gml:id="ringID-126">
<gml:posList srsDimension="3">1.242000 0.534000 0.547000 1.243000 0.859000 0.547000 1.193000 0.859000 0.547000 1.192000 0.534000 0.547000 1.242000 0.534000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-127">
<gml:exterior>
<gml:LinearRing gml:id="ringID-127">
<gml:posList srsDimension="3">0.499000 0.859000 0.547000 0.499000 0.535000 0.547000 0.549000 0.535000 0.547000 0.549000 0.859000 0.547000 0.499000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-128">
<gml:exterior>
<gml:LinearRing gml:id="ringID-128">
<gml:posList srsDimension="3">0.499000 0.535000 0.547000 0.499000 0.535000 0.504000 0.549000 0.535000 0.504000 0.549000 0.535000 0.547000 0.499000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-129">
<gml:exterior>
<gml:LinearRing gml:id="ringID-129">
<gml:posList srsDimension="3">0.549000 0.535000 0.504000 0.549000 0.859000 0.504000 0.549000 0.859000 0.547000 0.549000 0.535000 0.547000 0.549000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-130">
<gml:exterior>
<gml:LinearRing gml:id="ringID-130">
<gml:posList srsDimension="3">0.499000 0.859000 0.504000 0.499000 0.535000 0.504000 0.499000 0.535000 0.547000 0.499000 0.859000 0.547000 0.499000 0.859000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-131">
<gml:exterior>
<gml:LinearRing gml:id="ringID-131">
<gml:posList srsDimension="3">0.839000 0.535000 0.547000 0.839000 0.535000 0.504000 0.889000 0.535000 0.504000 0.889000 0.535000 0.547000 0.839000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-132">
<gml:exterior>
<gml:LinearRing gml:id="ringID-132">
<gml:posList srsDimension="3">0.889000 0.535000 0.504000 0.889000 0.859000 0.504000 0.889000 0.859000 0.547000 0.889000 0.535000 0.547000 0.889000 0.535000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-133">
<gml:exterior>
<gml:LinearRing gml:id="ringID-133">
<gml:posList srsDimension="3">0.839000 0.859000 0.547000 0.839000 0.535000 0.547000 0.889000 0.535000 0.547000 0.889000 0.859000 0.547000 0.839000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-134">
<gml:exterior>
<gml:LinearRing gml:id="ringID-134">
<gml:posList srsDimension="3">0.219000 0.840000 0.547000 0.219000 0.535000 0.547000 0.479000 0.535000 0.547000 0.479000 0.839000 0.547000 0.219000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-135">
<gml:exterior>
<gml:LinearRing gml:id="ringID-135">
<gml:posList srsDimension="3">0.219000 0.535000 0.520000 0.219000 0.840000 0.520000 0.479000 0.839000 0.520000 0.479000 0.535000 0.520000 0.219000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-136">
<gml:exterior>
<gml:LinearRing gml:id="ringID-136">
<gml:posList srsDimension="3">0.219000 0.535000 0.547000 0.219000 0.840000 0.547000 0.219000 0.840000 0.520000 0.219000 0.535000 0.520000 0.219000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-137">
<gml:exterior>
<gml:LinearRing gml:id="ringID-137">
<gml:posList srsDimension="3">0.219000 0.840000 0.547000 0.479000 0.839000 0.547000 0.479000 0.839000 0.520000 0.219000 0.840000 0.520000 0.219000 0.840000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-138">
<gml:exterior>
<gml:LinearRing gml:id="ringID-138">
<gml:posList srsDimension="3">0.479000 0.839000 0.547000 0.479000 0.535000 0.547000 0.479000 0.535000 0.520000 0.479000 0.839000 0.520000 0.479000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-139">
<gml:exterior>
<gml:LinearRing gml:id="ringID-139">
<gml:posList srsDimension="3">0.479000 0.535000 0.547000 0.219000 0.535000 0.547000 0.219000 0.535000 0.520000 0.479000 0.535000 0.520000 0.479000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-140">
<gml:exterior>
<gml:LinearRing gml:id="ringID-140">
<gml:posList srsDimension="3">0.839000 0.859000 0.504000 0.839000 0.535000 0.504000 0.839000 0.535000 0.547000 0.839000 0.859000 0.547000 0.839000 0.859000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-141">
<gml:exterior>
<gml:LinearRing gml:id="ringID-141">
<gml:posList srsDimension="3">0.564000 0.839000 0.547000 0.824000 0.839000 0.547000 0.824000 0.839000 0.520000 0.564000 0.839000 0.520000 0.564000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-142">
<gml:exterior>
<gml:LinearRing gml:id="ringID-142">
<gml:posList srsDimension="3">0.564000 0.535000 0.520000 0.564000 0.839000 0.520000 0.824000 0.839000 0.520000 0.824000 0.535000 0.520000 0.564000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-143">
<gml:exterior>
<gml:LinearRing gml:id="ringID-143">
<gml:posList srsDimension="3">0.564000 0.535000 0.547000 0.564000 0.839000 0.547000 0.564000 0.839000 0.520000 0.564000 0.535000 0.520000 0.564000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-144">
<gml:exterior>
<gml:LinearRing gml:id="ringID-144">
<gml:posList srsDimension="3">0.824000 0.535000 0.547000 0.564000 0.535000 0.547000 0.564000 0.535000 0.520000 0.824000 0.535000 0.520000 0.824000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-145">
<gml:exterior>
<gml:LinearRing gml:id="ringID-145">
<gml:posList srsDimension="3">0.824000 0.839000 0.547000 0.824000 0.535000 0.547000 0.824000 0.535000 0.520000 0.824000 0.839000 0.520000 0.824000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-146">
<gml:exterior>
<gml:LinearRing gml:id="ringID-146">
<gml:posList srsDimension="3">0.564000 0.839000 0.547000 0.564000 0.535000 0.547000 0.824000 0.535000 0.547000 0.824000 0.839000 0.547000 0.564000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-147">
<gml:exterior>
<gml:LinearRing gml:id="ringID-147">
<gml:posList srsDimension="3">0.911000 0.839000 0.547000 0.910000 0.535000 0.547000 1.170000 0.534000 0.547000 1.171000 0.839000 0.547000 0.911000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-148">
<gml:exterior>
<gml:LinearRing gml:id="ringID-148">
<gml:posList srsDimension="3">1.171000 0.839000 0.547000 1.170000 0.534000 0.547000 1.170000 0.534000 0.520000 1.171000 0.839000 0.520000 1.171000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-149">
<gml:exterior>
<gml:LinearRing gml:id="ringID-149">
<gml:posList srsDimension="3">0.910000 0.535000 0.520000 0.911000 0.839000 0.520000 1.171000 0.839000 0.520000 1.170000 0.534000 0.520000 0.910000 0.535000 0.520000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-150">
<gml:exterior>
<gml:LinearRing gml:id="ringID-150">
<gml:posList srsDimension="3">1.170000 0.534000 0.547000 0.910000 0.535000 0.547000 0.910000 0.535000 0.520000 1.170000 0.534000 0.520000 1.170000 0.534000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-151">
<gml:exterior>
<gml:LinearRing gml:id="ringID-151">
<gml:posList srsDimension="3">0.911000 0.839000 0.547000 1.171000 0.839000 0.547000 1.171000 0.839000 0.520000 0.911000 0.839000 0.520000 0.911000 0.839000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-152">
<gml:exterior>
<gml:LinearRing gml:id="ringID-152">
<gml:posList srsDimension="3">0.910000 0.535000 0.547000 0.911000 0.839000 0.547000 0.911000 0.839000 0.520000 0.910000 0.535000 0.520000 0.910000 0.535000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-153">
<gml:exterior>
<gml:LinearRing gml:id="ringID-153">
<gml:posList srsDimension="3">1.242000 0.534000 0.504000 1.243000 0.859000 0.504000 1.243000 0.859000 0.547000 1.242000 0.534000 0.547000 1.242000 0.534000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-154">
<gml:exterior>
<gml:LinearRing gml:id="ringID-154">
<gml:posList srsDimension="3">0.889000 0.859000 0.547000 0.889000 0.859000 0.504000 0.839000 0.859000 0.504000 0.839000 0.859000 0.547000 0.889000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-155">
<gml:exterior>
<gml:LinearRing gml:id="ringID-155">
<gml:posList srsDimension="3">0.549000 0.859000 0.547000 0.549000 0.859000 0.504000 0.499000 0.859000 0.504000 0.499000 0.859000 0.547000 0.549000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-156">
<gml:exterior>
<gml:LinearRing gml:id="ringID-156">
<gml:posList srsDimension="3">1.243000 0.859000 0.504000 1.193000 0.859000 0.504000 1.193000 0.859000 0.547000 1.243000 0.859000 0.547000 1.243000 0.859000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-157">
<gml:exterior>
<gml:LinearRing gml:id="ringID-157">
<gml:posList srsDimension="3">0.199000 0.860000 0.504000 0.149000 0.860000 0.504000 0.149000 0.860000 0.547000 0.199000 0.860000 0.547000 0.199000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-158">
<gml:exterior>
<gml:LinearRing gml:id="ringID-158">
<gml:posList srsDimension="3">0.149000 0.860000 0.504000 0.199000 0.860000 0.504000 0.499000 0.859000 0.504000 0.549000 0.859000 0.504000 0.839000 0.859000 0.504000 0.889000 0.859000 0.504000 1.193000 0.859000 0.504000 1.243000 0.859000 0.504000 1.343000 0.859000 0.504000 1.343000 0.859000 0.300000 0.049000 0.860000 0.300000 0.049000 0.860000 0.504000 0.149000 0.860000 0.504000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-159">
<gml:exterior>
<gml:LinearRing gml:id="ringID-159">
<gml:posList srsDimension="3">0.549000 0.859000 0.547000 0.549000 0.859000 0.504000 0.839000 0.859000 0.504000 0.839000 0.859000 0.547000 0.549000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-160">
<gml:exterior>
<gml:LinearRing gml:id="ringID-160">
<gml:posList srsDimension="3">0.199000 0.860000 0.547000 0.199000 0.860000 0.504000 0.499000 0.859000 0.504000 0.499000 0.859000 0.547000 0.199000 0.860000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-161">
<gml:exterior>
<gml:LinearRing gml:id="ringID-161">
<gml:posList srsDimension="3">0.889000 0.859000 0.547000 0.889000 0.859000 0.504000 1.193000 0.859000 0.504000 1.193000 0.859000 0.547000 0.889000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-162">
<gml:exterior>
<gml:LinearRing gml:id="ringID-162">
<gml:posList srsDimension="3">1.243000 0.859000 0.547000 1.243000 0.859000 0.504000 1.343000 0.859000 0.504000 1.343000 0.859000 0.547000 1.243000 0.859000 0.547000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="PolyIDGeo-163">
<gml:exterior>
<gml:LinearRing gml:id="ringID-163">
<gml:posList srsDimension="3">1.343000 0.859000 2.100000 1.343000 0.859000 0.547000 1.243000 0.859000 0.547000 1.193000 0.859000 0.547000 0.889000 0.859000 0.547000 0.839000 0.859000 0.547000 0.549000 0.859000 0.547000 0.499000 0.859000 0.547000 0.199000 0.860000 0.547000 0.149000 0.860000 0.547000 0.049000 0.860000 0.547000 0.049000 0.860000 2.100000 1.343000 0.859000 2.100000 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="ringID-163_1">
<gml:posList srsDimension="3">1.245000 0.859000 1.182000 0.154000 0.860000 1.182000 0.154000 0.860000 1.132000 1.245000 0.859000 1.132000 1.245000 0.859000 1.182000 </gml:posList>
</gml:LinearRing>
</gml:interior>
<gml:interior>
<gml:LinearRing gml:id="ringID-163_2">
<gml:posList srsDimension="3">0.154000 0.860000 1.282000 0.154000 0.860000 1.232000 1.245000 0.859000 1.232000 1.245000 0.859000 1.282000 0.154000 0.860000 1.282000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</gen:lod2Geometry>
</gen:GenericCityObject>
</core:cityObjectMember>
</core:CityModel>
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd">
<!--
Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m
Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche),
die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert
CityGML 2.0
Gebäudevolumen: 56,25 m3
10.5.2017
Author: V. Coors, HFT Stuttgart
Lizenz:
-->
<core:cityObjectMember>
<bldg:Building gml:id="_Simple_BD.1">
<bldg:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:CompositeSurface>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/>
<gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/>
</gml:CompositeSurface>
</gml:exterior>
</gml:Solid>
</bldg:lod2Solid>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.2">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1">
<gml:posList srsDimension="3">
13.0 15.0 0.0
13.0 15.0 3.0
13.0 10.0 3.0
13.0 10.0 0.0
13.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.3">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1">
<gml:posList srsDimension="3">
10.0 15.0 0.0
10.0 15.0 3.0
11.5 15.0 4.5
13.0 15.0 3.0
13.0 15.0 0.0
10.0 15.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.4">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
10.0 15.0 3.0
10.0 15.0 0.0
10.0 10.0 0.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.5">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1">
<gml:posList srsDimension="3">
13.0 10.0 0.0
13.0 10.0 3.0
11.5 10.0 4.5
10.0 10.0 3.0
10.0 10.0 0.0
13.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.6">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 3.0
11.5 10.0 4.5
11.5 15.0 4.5
10.0 15.0 3.0
10.0 10.0 3.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.7">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1">
<gml:posList srsDimension="3">
11.5 10.0 4.5
13.0 10.0 3.0
13.0 15.0 3.0
11.5 15.0 4.5
11.5 10.0 4.5
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1">
<bldg:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="_Simple_BD.1_PG.1">
<gml:exterior>
<gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1">
<gml:posList srsDimension="3">
10.0 10.0 0.0
10.0 15.0 0.0
13.0 15.0 0.0
13.0 10.0 0.0
10.0 10.0 0.0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
</core:cityObjectMember>
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
<version>3.16.0</version> <version>3.17.0</version>
</parent> </parent>
<artifactId>CityDoctorValidation</artifactId> <artifactId>CityDoctorValidation</artifactId>
<name>CityDoctorValidation</name> <name>CityDoctorValidation</name>
......
...@@ -21,8 +21,10 @@ package de.hft.stuttgart.citydoctor2; ...@@ -21,8 +21,10 @@ package de.hft.stuttgart.citydoctor2;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.citygml4j.core.ade.ADEException; import org.citygml4j.core.ade.ADEException;
...@@ -72,7 +74,7 @@ public class CityDoctorValidation { ...@@ -72,7 +74,7 @@ public class CityDoctorValidation {
String outputFile = getOutputFile(argParser, true); String outputFile = getOutputFile(argParser, true);
ValidationConfiguration config = getValidationConfig(argParser); ValidationConfiguration config = getValidationConfig(argParser);
startValidationProcess(new File(inputFile), xmlOutput, pdfOutput, config, outputFile); startValidationProcess(inputFile, xmlOutput, pdfOutput, config, outputFile);
} }
private static String getOutputFile(ArgumentParser argParser, boolean optional) { private static String getOutputFile(ArgumentParser argParser, boolean optional) {
...@@ -144,13 +146,28 @@ public class CityDoctorValidation { ...@@ -144,13 +146,28 @@ public class CityDoctorValidation {
pdfOutputPath = pdfOutput.getAbsolutePath(); pdfOutputPath = pdfOutput.getAbsolutePath();
} }
try { try {
startValidationProcess(inputFile, xmlOutputPath, pdfOutputPath, config, null); startFileValidation(inputFile, xmlOutputPath, pdfOutputPath, config, null);
} catch (CityDoctorWriteException e) { } catch (CityDoctorWriteException e) {
// this does not happen as no output file is specified // this does not happen as no output file is specified
logger.catching(e); logger.catching(e);
} }
} }
public static void startValidationProcess(String input, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws CityDoctorWriteException, CityGmlParseException, IOException, InvalidGmlFileException {
File inputFile = new File(input);
if (!inputFile.exists()) {
logger.error("Input file '{}' does not exist.", input);
System.exit(1);
}
if (inputFile.getName().endsWith(".gml")) {
startFileValidation(inputFile, xmlOutput, pdfOutput, config, outputFile);
} else if (inputFile.getName().endsWith(".zip")) {
startZipValidation(input, xmlOutput, pdfOutput, config, outputFile);
}
}
/** /**
* This function will handle the complete validation process * This function will handle the complete validation process
* *
...@@ -164,7 +181,7 @@ public class CityDoctorValidation { ...@@ -164,7 +181,7 @@ public class CityDoctorValidation {
* @throws CityGMLBuilderException * @throws CityGMLBuilderException
* @throws ADEException * @throws ADEException
*/ */
public static void startValidationProcess(File inputFile, String xmlOutput, String pdfOutput, public static void startFileValidation(File inputFile, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws IOException, CityGmlParseException, ValidationConfiguration config, String outputFile) throws IOException, CityGmlParseException,
InvalidGmlFileException, CityDoctorWriteException { InvalidGmlFileException, CityDoctorWriteException {
...@@ -181,6 +198,29 @@ public class CityDoctorValidation { ...@@ -181,6 +198,29 @@ public class CityDoctorValidation {
} }
} }
public static void startZipValidation(String inputZipFile, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws CityGmlParseException, IOException {
xmlOutput = toDirectoryPath(xmlOutput);
pdfOutput = toDirectoryPath(pdfOutput);
outputFile = toDirectoryPath(outputFile);
if (xmlOutput == null && pdfOutput == null && outputFile == null) {
logger.warn("No output locations specified, results of validation will not be saved");
}
CityGmlZipArchive archive = CityGmlZipArchive.register(inputZipFile);
Checker.streamCheck(archive, xmlOutput, pdfOutput, config, outputFile);
}
public static String toDirectoryPath(String input) {
if (input == null) {
return null;
}
String parentDirectory = Path.of(input).getParent().toString() + File.separator;
String name = Path.of(input).getFileName().toString().replaceFirst("\\..+", "") + File.separator;
File f = new File(parentDirectory + name);
f.mkdir();
return f.getPath() + File.separator;
}
public static String getPdfOutput(ArgumentParser argParser) { public static String getPdfOutput(ArgumentParser argParser) {
if (argParser.containsOption("pdfreport")) { if (argParser.containsOption("pdfreport")) {
List<String> reportFiles = argParser.getValues("pdfreport"); List<String> reportFiles = argParser.getValues("pdfreport");
......
package de.hft.stuttgart.citydoctor2;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
import java.util.concurrent.Callable;
@Command(name = "citydoctor2", mixinStandardHelpOptions = true, description = "Validates CityGML files according to a provided validation-plan.")
public class CityDoctorValidationCLI implements Callable<Integer> {
@Option(names = {"-i" , "--in" , "--input"},
description = "Filepath of the CityGML file.",
required = true)
private String input;
@Option(names = {"-c" , "--config" , "--configuration", "--plan"},
description = "Filepath of the validation configuration .yml",
required = true)
private String config;
@Option(names = {"-x" , "--xml" , "--xmlReport"},
description = "Create a XML validation report at target location")
private String xmlReport;
@Option(names = {"-p" , "--pdf" , "--pdfReport"},
description = "Create a PDF validation report at target location")
private String pdfReport;
@Option(names = {"-o" , "--out" , "--output"},
description = "Create a validated copy of the CityGML input with QualityADE at target location.")
private String output;
@Override
public Integer call() throws Exception {
return 0;
}
}
/*- /*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
* *
* This file is part of CityDoctor2. * This file is part of CityDoctor2.
* *
* CityDoctor2 is free software: you can redistribute it and/or modify * CityDoctor2 is free software: you can redistribute it and/or modify
...@@ -18,39 +18,6 @@ ...@@ -18,39 +18,6 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Stream;
import javax.xml.XMLConstants;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError; import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError; import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError; import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError;
...@@ -75,7 +42,11 @@ import de.hft.stuttgart.citydoctor2.reporting.XmlStreamReporter; ...@@ -75,7 +42,11 @@ import de.hft.stuttgart.citydoctor2.reporting.XmlStreamReporter;
import de.hft.stuttgart.citydoctor2.reporting.XmlValidationReporter; import de.hft.stuttgart.citydoctor2.reporting.XmlValidationReporter;
import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfReporter; import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfReporter;
import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfStreamReporter; import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfStreamReporter;
import de.hft.stuttgart.citydoctor2.utils.ArchivePacker;
import de.hft.stuttgart.citydoctor2.utils.Localization; import de.hft.stuttgart.citydoctor2.utils.Localization;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntryFile;
import de.hft.stuttgart.quality.model.enums.RequirementId; import de.hft.stuttgart.quality.model.enums.RequirementId;
import de.hft.stuttgart.quality.model.enums.TopLevelFeatureType; import de.hft.stuttgart.quality.model.enums.TopLevelFeatureType;
import de.hft.stuttgart.quality.model.properties.CheckingProperty; import de.hft.stuttgart.quality.model.properties.CheckingProperty;
...@@ -86,309 +57,341 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty; ...@@ -86,309 +57,341 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty;
import de.hft.stuttgart.quality.model.types.Checking; import de.hft.stuttgart.quality.model.types.Checking;
import de.hft.stuttgart.quality.model.types.Parameter; import de.hft.stuttgart.quality.model.types.Parameter;
import de.hft.stuttgart.quality.model.types.ValidationPlan; import de.hft.stuttgart.quality.model.types.ValidationPlan;
import org.apache.commons.io.FilenameUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.xml.XMLConstants;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Stream;
/** /**
* The main container class for checking. It contains the logic for validation, * The main container class for checking. It contains the logic for validation,
* as well as contains the state of the checks performed. * as well as contains the state of the checks performed.
*
* @author Matthias Betz
* *
* @author Matthias Betz
*/ */
public class Checker { public class Checker {
private static final Logger logger = LogManager.getLogger(Checker.class); private static final Logger logger = LogManager.getLogger(Checker.class);
private ValidationConfiguration config; private ValidationConfiguration config;
private List<List<Check>> execLayers; private List<List<Check>> execLayers;
private List<Filter> includeFilters; private List<Filter> includeFilters;
private List<Filter> excludeFilters; private List<Filter> excludeFilters;
private final Checks checkConfig; private final Checks checkConfig;
private final CityDoctorModel model; private final CityDoctorModel model;
public Checker(CityDoctorModel model) { public Checker(CityDoctorModel model) {
this(ValidationConfiguration.loadStandardValidationConfig(), model); this(ValidationConfiguration.loadStandardValidationConfig(), model);
} }
public Checker(ValidationConfiguration config, CityDoctorModel model) { public Checker(ValidationConfiguration config, CityDoctorModel model) {
this.model = model; this.model = model;
checkConfig = new Checks(); checkConfig = new Checks();
setValidationConfig(config); setValidationConfig(config);
} }
public Checks getChecks() { public Checks getChecks() {
return checkConfig; return checkConfig;
} }
public CityDoctorModel getModel() { public CityDoctorModel getModel() {
return model; return model;
} }
/** /**
* Write the xml report for the given CityDoctorModel. If no report location is * Write the xml report for the given CityDoctorModel. If no report location is
* given or this checker has not validated anything, nothing is done. * given or this checker has not validated anything, nothing is done.
* *
* @param xmlOutput the output file location for the XML report. Can be null. * @param xmlOutput the output file location for the XML report. Can be null.
*/ */
public void writeXmlReport(String xmlOutput) { public void writeXmlReport(String xmlOutput) {
if (!model.isValidated() || xmlOutput == null) { if (!model.isValidated() || xmlOutput == null) {
return; return;
} }
File xmlFile = new File(xmlOutput); File xmlFile = new File(xmlOutput);
if (xmlFile.getParentFile() != null) { if (xmlFile.getParentFile() != null) {
xmlFile.getParentFile().mkdirs(); xmlFile.getParentFile().mkdirs();
} }
Reporter reporter = new XmlValidationReporter(); Reporter reporter = new XmlValidationReporter();
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(xmlFile.getAbsolutePath()))) { try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(xmlFile.getAbsolutePath()))) {
reporter.writeReport(checkConfig, bos, model, config); reporter.writeReport(checkConfig, bos, model, config);
} catch (CheckReportWriteException | IOException e) { } catch (CheckReportWriteException | IOException e) {
logger.error(Localization.getText("Checker.failXml"), e); logger.error(Localization.getText("Checker.failXml"), e);
} }
} }
public void writePdfReport(String pdfOutput) { public void writePdfReport(String pdfOutput) {
if (!model.isValidated() || pdfOutput == null) { if (!model.isValidated() || pdfOutput == null) {
return; return;
} }
File pdfFile = new File(pdfOutput); File pdfFile = new File(pdfOutput);
if (pdfFile.getParentFile() != null) { if (pdfFile.getParentFile() != null) {
pdfFile.getParentFile().mkdirs(); pdfFile.getParentFile().mkdirs();
} }
Reporter reporter = new PdfReporter(); Reporter reporter = new PdfReporter();
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(pdfFile.getAbsolutePath()))) { try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(pdfFile.getAbsolutePath()))) {
reporter.writeReport(checkConfig, bos, model, config); reporter.writeReport(checkConfig, bos, model, config);
} catch (IOException | CheckReportWriteException e) { } catch (IOException | CheckReportWriteException e) {
logger.error(Localization.getText("Checker.failPdf"), e); logger.error(Localization.getText("Checker.failPdf"), e);
} }
} }
public void runChecks() { public void runChecks() {
runChecks((ProgressListener) null); runChecks((ProgressListener) null);
} }
public void runChecks(String xmlOutput) { public void runChecks(String xmlOutput) {
runChecks(); runChecks();
writeXmlReport(xmlOutput); writeXmlReport(xmlOutput);
} }
public void runChecks(String xmlOutput, String pdfOutput) { public void runChecks(String xmlOutput, String pdfOutput) {
runChecks(); runChecks();
writeXmlReport(xmlOutput); writeXmlReport(xmlOutput);
writePdfReport(pdfOutput); writePdfReport(pdfOutput);
} }
public void runChecks(String xmlOutput, String pdfOutput, ProgressListener l) { public void runChecks(String xmlOutput, String pdfOutput, ProgressListener l) {
runChecks(l); runChecks(l);
writeXmlReport(xmlOutput); writeXmlReport(xmlOutput);
writePdfReport(pdfOutput); writePdfReport(pdfOutput);
} }
public void runChecks(ProgressListener l) { public void runChecks(ProgressListener l) {
if (config == null) { if (config == null) {
config = ValidationConfiguration.loadStandardValidationConfig(); config = ValidationConfiguration.loadStandardValidationConfig();
} }
checkCityModel(model, l); checkCityModel(model, l);
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info(Localization.getText("Checker.checksFinished")); logger.info(Localization.getText("Checker.checksFinished"));
} }
SvrlContentHandler handler = executeSchematronValidationIfAvailable(config, model.getFile()); SvrlContentHandler handler = executeSchematronValidationIfAvailable(config, model.getFile());
if (handler != null) { if (handler != null) {
handleSchematronResults(handler); handleSchematronResults(handler);
} }
model.setValidated(createValidationPlan()); model.setValidated(createValidationPlan());
} }
private void handleSchematronResults(SvrlContentHandler handler) { private void handleSchematronResults(SvrlContentHandler handler) {
model.addGlobalErrors(handler.getGeneralErrors()); model.addGlobalErrors(handler.getGeneralErrors());
Map<String, CityObject> featureMap = new HashMap<>(); Map<String, CityObject> featureMap = new HashMap<>();
model.createFeatureStream().forEach(f -> featureMap.put(f.getGmlId().getGmlString(), f)); model.createFeatureStream().forEach(f -> featureMap.put(f.getGmlId().getGmlString(), f));
handler.getFeatureErrors().forEach((k, v) -> { handler.getFeatureErrors().forEach((k, v) -> {
if (k.trim().isEmpty()) { if (k.trim().isEmpty()) {
// missing gml id, ignore? // missing gml id, ignore?
return; return;
} }
CityObject co = featureMap.get(k); CityObject co = featureMap.get(k);
if (co == null) { if (co == null) {
// gml id reported by schematron was not found, add to general errors // gml id reported by schematron was not found, add to general errors
for (SchematronError se : v) { for (SchematronError se : v) {
model.addGlobalError(se); model.addGlobalError(se);
} }
} else { } else {
handleSchematronErrorsForCityObject(v, co); handleSchematronErrorsForCityObject(v, co);
} }
}); });
} }
public static void handleSchematronErrorsForCityObject(List<SchematronError> v, CityObject co) { public static void handleSchematronErrorsForCityObject(List<SchematronError> v, CityObject co) {
int count = 0; int count = 0;
for (SchematronError se : v) { for (SchematronError se : v) {
CheckError err; CheckError err;
if (AttributeMissingError.ID.getIdString().equals(se.getErrorIdString())) { if (AttributeMissingError.ID.getIdString().equals(se.getErrorIdString())) {
err = new AttributeMissingError(co, se.getChildId(), se.getNameOfAttribute()); err = new AttributeMissingError(co, se.getChildId(), se.getNameOfAttribute());
} else if (AttributeValueWrongError.ID.getIdString().equals(se.getErrorIdString())) { } else if (AttributeValueWrongError.ID.getIdString().equals(se.getErrorIdString())) {
err = new AttributeValueWrongError(co, se.getChildId(), se.getNameOfAttribute()); err = new AttributeValueWrongError(co, se.getChildId(), se.getNameOfAttribute());
} else if (AttributeInvalidError.ID.getIdString().equals(se.getErrorIdString())) { } else if (AttributeInvalidError.ID.getIdString().equals(se.getErrorIdString())) {
err = new AttributeInvalidError(co, se.getChildId(), se.getNameOfAttribute()); err = new AttributeInvalidError(co, se.getChildId(), se.getNameOfAttribute());
} else { } else {
throw new IllegalStateException( throw new IllegalStateException(
"Unknown error ID was given in schematron file: " + se.getErrorIdString()); "Unknown error ID was given in schematron file: " + se.getErrorIdString());
} }
co.addCheckResult(new CheckResult(new CheckId("SchematronCheck " + count), ResultStatus.ERROR, err)); co.addCheckResult(new CheckResult(new CheckId("SchematronCheck " + count), ResultStatus.ERROR, err));
count++; count++;
} }
} }
ValidationPlan createValidationPlan() { ValidationPlan createValidationPlan() {
ValidationPlan plan = new ValidationPlan(); ValidationPlan plan = new ValidationPlan();
de.hft.stuttgart.quality.model.types.Filter filter = createFilter(); de.hft.stuttgart.quality.model.types.Filter filter = createFilter();
plan.setFilter(new FilterProperty(filter)); plan.setFilter(new FilterProperty(filter));
Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs = Checks.getAvailableRequirements(); Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs = Checks.getAvailableRequirements();
for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
RequirementId reqId = mapToRequirement(e.getKey()); RequirementId reqId = mapToRequirement(e.getKey());
if (reqId == null) { if (reqId == null) {
continue; continue;
} }
de.hft.stuttgart.quality.model.types.Requirement req = new de.hft.stuttgart.quality.model.types.Requirement(); de.hft.stuttgart.quality.model.types.Requirement req = new de.hft.stuttgart.quality.model.types.Requirement();
req.setRequirementType(reqId); req.setRequirementType(reqId);
req.setEnabled(e.getValue().isEnabled()); req.setEnabled(e.getValue().isEnabled());
plan.getRequirements().add(new RequirementProperty(req)); plan.getRequirements().add(new RequirementProperty(req));
Map<String, String> parameters = e.getValue().getParameters(); Map<String, String> parameters = e.getValue().getParameters();
if (parameters != null) { if (parameters != null) {
for (Entry<String, String> param : parameters.entrySet()) { for (Entry<String, String> param : parameters.entrySet()) {
Parameter p = new Parameter(); Parameter p = new Parameter();
DefaultParameter defaultP = getDefaultParameter(e.getKey(), reqs, param.getKey()); DefaultParameter defaultP = getDefaultParameter(e.getKey(), reqs, param.getKey());
if (defaultP != null) { if (defaultP != null) {
p.setUom(defaultP.getUnitType().getGmlRepresentation()); p.setUom(defaultP.getUnitType().getGmlRepresentation());
} }
p.setName(param.getKey()); p.setName(param.getKey());
p.setValue(param.getValue()); p.setValue(param.getValue());
req.getParameters().add(new ParameterProperty(p)); req.getParameters().add(new ParameterProperty(p));
} }
} }
} }
de.hft.stuttgart.quality.model.types.Requirement missing = new de.hft.stuttgart.quality.model.types.Requirement(); de.hft.stuttgart.quality.model.types.Requirement missing = new de.hft.stuttgart.quality.model.types.Requirement();
missing.setRequirementType(RequirementId.R_SE_ATTRIBUTES_EXISTING); missing.setRequirementType(RequirementId.R_SE_ATTRIBUTES_EXISTING);
de.hft.stuttgart.quality.model.types.Requirement correct = new de.hft.stuttgart.quality.model.types.Requirement(); de.hft.stuttgart.quality.model.types.Requirement correct = new de.hft.stuttgart.quality.model.types.Requirement();
correct.setRequirementType(RequirementId.R_SE_ATTRIBUTES_CORRECT); correct.setRequirementType(RequirementId.R_SE_ATTRIBUTES_CORRECT);
missing.setEnabled(config.getSchematronFilePath() != null); missing.setEnabled(config.getSchematronFilePath() != null);
correct.setEnabled(config.getSchematronFilePath() != null); correct.setEnabled(config.getSchematronFilePath() != null);
plan.getRequirements().add(new RequirementProperty(missing)); plan.getRequirements().add(new RequirementProperty(missing));
plan.getRequirements().add(new RequirementProperty(correct)); plan.getRequirements().add(new RequirementProperty(correct));
Parameter numRounding = new Parameter(); Parameter numRounding = new Parameter();
numRounding.setName("numberOfRoundingPlaces"); numRounding.setName("numberOfRoundingPlaces");
numRounding.setValue("" + config.getNumberOfRoundingPlaces()); numRounding.setValue("" + config.getNumberOfRoundingPlaces());
Parameter minVertexDistance = new Parameter(); Parameter minVertexDistance = new Parameter();
minVertexDistance.setName("minVertexDistance"); minVertexDistance.setName("minVertexDistance");
minVertexDistance.setUom("m"); minVertexDistance.setUom("m");
minVertexDistance.setValue("" + config.getMinVertexDistance()); minVertexDistance.setValue("" + config.getMinVertexDistance());
Parameter schematronFile = new Parameter(); Parameter schematronFile = new Parameter();
schematronFile.setName("schematronFile"); schematronFile.setName("schematronFile");
schematronFile.setValue(config.getSchematronFilePath()); schematronFile.setValue(config.getSchematronFilePath());
de.hft.stuttgart.quality.model.types.GlobalParameters globParams = new de.hft.stuttgart.quality.model.types.GlobalParameters(); de.hft.stuttgart.quality.model.types.GlobalParameters globParams = new de.hft.stuttgart.quality.model.types.GlobalParameters();
plan.setGlobalParameters(new GlobalParametersProperty(globParams)); plan.setGlobalParameters(new GlobalParametersProperty(globParams));
globParams.getParameters().add(new ParameterProperty(numRounding)); globParams.getParameters().add(new ParameterProperty(numRounding));
globParams.getParameters().add(new ParameterProperty(minVertexDistance)); globParams.getParameters().add(new ParameterProperty(minVertexDistance));
globParams.getParameters().add(new ParameterProperty(schematronFile)); globParams.getParameters().add(new ParameterProperty(schematronFile));
return plan; return plan;
} }
private DefaultParameter getDefaultParameter(String reqKey, private DefaultParameter getDefaultParameter(String reqKey,
Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs, String paramName) { Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs, String paramName) {
de.hft.stuttgart.citydoctor2.check.Requirement requirement = reqs.get(reqKey); de.hft.stuttgart.citydoctor2.check.Requirement requirement = reqs.get(reqKey);
if (requirement != null) { if (requirement != null) {
for (DefaultParameter param : requirement.getDefaultParameter()) { for (DefaultParameter param : requirement.getDefaultParameter()) {
if (param.getName().equals(paramName)) { if (param.getName().equals(paramName)) {
return param; return param;
} }
} }
} }
return null; return null;
} }
private de.hft.stuttgart.quality.model.types.Filter createFilter() { private de.hft.stuttgart.quality.model.types.Filter createFilter() {
var filter = new de.hft.stuttgart.quality.model.types.Filter(); var filter = new de.hft.stuttgart.quality.model.types.Filter();
handleInputFilter(filter); handleInputFilter(filter);
if (excludeFilters != null) { if (excludeFilters != null) {
for (Filter f : excludeFilters) { for (Filter f : excludeFilters) {
if (f instanceof TypeFilter tf) { if (f instanceof TypeFilter tf) {
FeatureType type = tf.getType(); FeatureType type = tf.getType();
TopLevelFeatureType tlft = mapToTopLevelFeatureType(type); TopLevelFeatureType tlft = mapToTopLevelFeatureType(type);
if (tlft == null) { if (tlft == null) {
continue; continue;
} }
removeFilter(tlft, filter); removeFilter(tlft, filter);
} }
} }
} }
return filter; return filter;
} }
private void handleInputFilter(de.hft.stuttgart.quality.model.types.Filter filter) { private void handleInputFilter(de.hft.stuttgart.quality.model.types.Filter filter) {
if (includeFilters == null || includeFilters.isEmpty()) { if (includeFilters == null || includeFilters.isEmpty()) {
// no filter means, use all // no filter means, use all
addAllFilters(filter); addAllFilters(filter);
} else { } else {
for (Filter f : includeFilters) { for (Filter f : includeFilters) {
if (f instanceof TypeFilter tf) { if (f instanceof TypeFilter tf) {
FeatureType type = tf.getType(); FeatureType type = tf.getType();
TopLevelFeatureType tlft = mapToTopLevelFeatureType(type); TopLevelFeatureType tlft = mapToTopLevelFeatureType(type);
if (tlft == null) { if (tlft == null) {
continue; continue;
} }
Checking c = new Checking(); Checking c = new Checking();
c.setFeatureType(tlft); c.setFeatureType(tlft);
filter.getChecking().add(new CheckingProperty(c)); filter.getChecking().add(new CheckingProperty(c));
} }
} }
if (filter.getChecking().isEmpty()) { if (filter.getChecking().isEmpty()) {
// this happens if no type include filter was used // this happens if no type include filter was used
// it is possible only single objects were tested then // it is possible only single objects were tested then
// so include everything // so include everything
addAllFilters(filter); addAllFilters(filter);
} }
} }
} }
private void addAllFilters(de.hft.stuttgart.quality.model.types.Filter filter) { private void addAllFilters(de.hft.stuttgart.quality.model.types.Filter filter) {
Checking buildingChecking = new Checking(); Checking buildingChecking = new Checking();
buildingChecking.setFeatureType(TopLevelFeatureType.BUILDING); buildingChecking.setFeatureType(TopLevelFeatureType.BUILDING);
filter.getChecking().add(new CheckingProperty(buildingChecking)); filter.getChecking().add(new CheckingProperty(buildingChecking));
Checking bridgeChecking = new Checking(); Checking bridgeChecking = new Checking();
bridgeChecking.setFeatureType(TopLevelFeatureType.BRIDGE); bridgeChecking.setFeatureType(TopLevelFeatureType.BRIDGE);
filter.getChecking().add(new CheckingProperty(bridgeChecking)); filter.getChecking().add(new CheckingProperty(bridgeChecking));
Checking landChecking = new Checking(); Checking landChecking = new Checking();
landChecking.setFeatureType(TopLevelFeatureType.LAND); landChecking.setFeatureType(TopLevelFeatureType.LAND);
filter.getChecking().add(new CheckingProperty(landChecking)); filter.getChecking().add(new CheckingProperty(landChecking));
Checking transportationChecking = new Checking(); Checking transportationChecking = new Checking();
transportationChecking.setFeatureType(TopLevelFeatureType.TRANSPORTATION); transportationChecking.setFeatureType(TopLevelFeatureType.TRANSPORTATION);
filter.getChecking().add(new CheckingProperty(transportationChecking)); filter.getChecking().add(new CheckingProperty(transportationChecking));
Checking vegetationChecking = new Checking(); Checking vegetationChecking = new Checking();
vegetationChecking.setFeatureType(TopLevelFeatureType.VEGETATION); vegetationChecking.setFeatureType(TopLevelFeatureType.VEGETATION);
filter.getChecking().add(new CheckingProperty(vegetationChecking)); filter.getChecking().add(new CheckingProperty(vegetationChecking));
Checking waterChecking = new Checking(); Checking waterChecking = new Checking();
waterChecking.setFeatureType(TopLevelFeatureType.WATER); waterChecking.setFeatureType(TopLevelFeatureType.WATER);
filter.getChecking().add(new CheckingProperty(waterChecking)); filter.getChecking().add(new CheckingProperty(waterChecking));
} }
private void removeFilter(TopLevelFeatureType tlft, de.hft.stuttgart.quality.model.types.Filter filter) { private void removeFilter(TopLevelFeatureType tlft, de.hft.stuttgart.quality.model.types.Filter filter) {
for (CheckingProperty c : filter.getChecking()) { for (CheckingProperty c : filter.getChecking()) {
if (c.getObject().getFeatureType().equals(tlft)) { if (c.getObject().getFeatureType().equals(tlft)) {
filter.getChecking().remove(c); filter.getChecking().remove(c);
return; return;
} }
} }
} }
private TopLevelFeatureType mapToTopLevelFeatureType(FeatureType type) { private TopLevelFeatureType mapToTopLevelFeatureType(FeatureType type) {
return switch (type) { return switch (type) {
case BRIDGE -> TopLevelFeatureType.BRIDGE; case BRIDGE -> TopLevelFeatureType.BRIDGE;
case BUILDING -> TopLevelFeatureType.BUILDING; case BUILDING -> TopLevelFeatureType.BUILDING;
...@@ -398,299 +401,299 @@ public class Checker { ...@@ -398,299 +401,299 @@ public class Checker {
case WATER -> TopLevelFeatureType.WATER; case WATER -> TopLevelFeatureType.WATER;
default -> null; default -> null;
}; };
} }
private RequirementId mapToRequirement(String requirementName) { private RequirementId mapToRequirement(String requirementName) {
try { try {
return RequirementId.valueOf(requirementName); return RequirementId.valueOf(requirementName);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }
public ValidationConfiguration getConfig() { public ValidationConfiguration getConfig() {
return config; return config;
} }
public static SvrlContentHandler executeSchematronValidationIfAvailable(ValidationConfiguration config, File file) { public static SvrlContentHandler executeSchematronValidationIfAvailable(ValidationConfiguration config, File file) {
if (file == null || !file.exists()) { if (file == null || !file.exists()) {
return null; return null;
} }
try { try {
return executeSchematronValidationIfAvailable(config, new FileInputStream(file)); return executeSchematronValidationIfAvailable(config, new FileInputStream(file));
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new UncheckedIOException(e); throw new UncheckedIOException(e);
} }
} }
@SuppressWarnings("resource") @SuppressWarnings("resource")
public static SvrlContentHandler executeSchematronValidationIfAvailable(ValidationConfiguration config, public static SvrlContentHandler executeSchematronValidationIfAvailable(ValidationConfiguration config,
InputStream in) { InputStream in) {
if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) { if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info(Localization.getText("Checker.schematronValidation")); logger.info(Localization.getText("Checker.schematronValidation"));
} }
try { try {
TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", Checker.class.getClassLoader()); TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", Checker.class.getClassLoader());
transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
transformerFactory.setURIResolver((href, base) -> new StreamSource(Checker.class.getResourceAsStream(href))); transformerFactory.setURIResolver((href, base) -> new StreamSource(Checker.class.getResourceAsStream(href)));
Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl")); Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"));
Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource); Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource);
DOMResult dsdlXslResult = new DOMResult(); DOMResult dsdlXslResult = new DOMResult();
dsdlXslTransformer.transform(new StreamSource(new File(config.getSchematronFilePath())), dsdlXslResult); dsdlXslTransformer.transform(new StreamSource(new File(config.getSchematronFilePath())), dsdlXslResult);
Source abstractExpandXsl = new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl")); Source abstractExpandXsl = new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl"));
Transformer abstractExpandTransformer = transformerFactory.newTransformer(abstractExpandXsl); Transformer abstractExpandTransformer = transformerFactory.newTransformer(abstractExpandXsl);
DOMResult abstractExpandResult = new DOMResult(); DOMResult abstractExpandResult = new DOMResult();
abstractExpandTransformer.transform(new DOMSource(dsdlXslResult.getNode()), abstractExpandResult); abstractExpandTransformer.transform(new DOMSource(dsdlXslResult.getNode()), abstractExpandResult);
Source svrlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl")); Source svrlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl"));
Transformer svrlTransformer = transformerFactory.newTransformer(svrlXslSource); Transformer svrlTransformer = transformerFactory.newTransformer(svrlXslSource);
DOMResult schematronXsltResult = new DOMResult(); DOMResult schematronXsltResult = new DOMResult();
svrlTransformer.transform(new DOMSource(abstractExpandResult.getNode()), schematronXsltResult); svrlTransformer.transform(new DOMSource(abstractExpandResult.getNode()), schematronXsltResult);
Transformer schematronTransformer = transformerFactory.newTransformer(new DOMSource(schematronXsltResult.getNode())); Transformer schematronTransformer = transformerFactory.newTransformer(new DOMSource(schematronXsltResult.getNode()));
Source cityGmlSource = new StreamSource(in); Source cityGmlSource = new StreamSource(in);
SvrlContentHandler handler = new SvrlContentHandler(); SvrlContentHandler handler = new SvrlContentHandler();
Result finalResult = new SAXResult(handler); Result finalResult = new SAXResult(handler);
schematronTransformer.transform(cityGmlSource, finalResult); schematronTransformer.transform(cityGmlSource, finalResult);
return handler; return handler;
} catch (TransformerException e) { } catch (TransformerException e) {
logger.catching(e); logger.catching(e);
} }
} }
return null; return null;
} }
private void buildFilters() { private void buildFilters() {
FilterConfiguration filterConfig = config.getFilter(); FilterConfiguration filterConfig = config.getFilter();
if (filterConfig == null) { if (filterConfig == null) {
includeFilters = Collections.emptyList(); includeFilters = Collections.emptyList();
excludeFilters = Collections.emptyList(); excludeFilters = Collections.emptyList();
return; return;
} }
excludeFilters = buildExcludeFilters(filterConfig); excludeFilters = buildExcludeFilters(filterConfig);
includeFilters = buildIncludeFilters(filterConfig); includeFilters = buildIncludeFilters(filterConfig);
} }
private List<Filter> buildExcludeFilters(FilterConfiguration filterConfig) { private List<Filter> buildExcludeFilters(FilterConfiguration filterConfig) {
if (filterConfig == null) { if (filterConfig == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
ExcludeFilterConfiguration excludeConfig = filterConfig.getExclude(); ExcludeFilterConfiguration excludeConfig = filterConfig.getExclude();
if (excludeConfig == null) { if (excludeConfig == null) {
return Collections.emptyList(); return Collections.emptyList();
} else { } else {
List<Filter> filters = new ArrayList<>(); List<Filter> filters = new ArrayList<>();
if (excludeConfig.getTypes() != null) { if (excludeConfig.getTypes() != null) {
for (FeatureType excludeType : excludeConfig.getTypes()) { for (FeatureType excludeType : excludeConfig.getTypes()) {
filters.add(new TypeFilter(excludeType)); filters.add(new TypeFilter(excludeType));
} }
} }
if (excludeConfig.getIds() != null) { if (excludeConfig.getIds() != null) {
for (String excludePattern : excludeConfig.getIds()) { for (String excludePattern : excludeConfig.getIds()) {
Filter f = new EqualsIgnoreCaseFilter(excludePattern); Filter f = new EqualsIgnoreCaseFilter(excludePattern);
filters.add(f); filters.add(f);
} }
} }
return filters; return filters;
} }
} }
private List<Filter> buildIncludeFilters(FilterConfiguration filterConfig) { private List<Filter> buildIncludeFilters(FilterConfiguration filterConfig) {
if (filterConfig == null) { if (filterConfig == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
IncludeFilterConfiguration includeConfig = filterConfig.getInclude(); IncludeFilterConfiguration includeConfig = filterConfig.getInclude();
if (includeConfig == null) { if (includeConfig == null) {
return Collections.emptyList(); return Collections.emptyList();
} else { } else {
List<Filter> filters = new ArrayList<>(); List<Filter> filters = new ArrayList<>();
if (includeConfig.getTypes() != null) { if (includeConfig.getTypes() != null) {
for (FeatureType includeType : includeConfig.getTypes()) { for (FeatureType includeType : includeConfig.getTypes()) {
filters.add(new TypeFilter(includeType)); filters.add(new TypeFilter(includeType));
} }
} }
if (includeConfig.getIds() != null) { if (includeConfig.getIds() != null) {
for (String includePattern : includeConfig.getIds()) { for (String includePattern : includeConfig.getIds()) {
Filter f = new EqualsIgnoreCaseFilter(includePattern); Filter f = new EqualsIgnoreCaseFilter(includePattern);
filters.add(f); filters.add(f);
} }
} }
return filters; return filters;
} }
} }
private void setValidationConfig(ValidationConfiguration config) { private void setValidationConfig(ValidationConfiguration config) {
if (config == null) { if (config == null) {
throw new IllegalArgumentException("Validation configuration may not be null"); throw new IllegalArgumentException("Validation configuration may not be null");
} }
this.config = config; this.config = config;
buildFilters(); buildFilters();
ParserConfiguration parserConfig = config.getParserConfiguration(); ParserConfiguration parserConfig = config.getParserConfiguration();
List<Check> checks = collectEnabledChecksAndInit(parserConfig, config); List<Check> checks = collectEnabledChecksAndInit(parserConfig, config);
execLayers = buildExecutionLayers(checks); execLayers = buildExecutionLayers(checks);
} }
private List<Check> collectEnabledChecksAndInit(ParserConfiguration parserConfig, ValidationConfiguration config) { private List<Check> collectEnabledChecksAndInit(ParserConfiguration parserConfig, ValidationConfiguration config) {
Set<CheckId> enabledCheck = new HashSet<>(); Set<CheckId> enabledCheck = new HashSet<>();
Map<CheckId, Map<String, String>> parameterMap = new HashMap<>(); Map<CheckId, Map<String, String>> parameterMap = new HashMap<>();
for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) { for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
de.hft.stuttgart.citydoctor2.check.Requirement req = Checks.getAvailableRequirements().get(e.getKey()); de.hft.stuttgart.citydoctor2.check.Requirement req = Checks.getAvailableRequirements().get(e.getKey());
if (req == null) { if (req == null) {
logger.warn("Could not find any check that satisfies requirement {}, it will not be checked", logger.warn("Could not find any check that satisfies requirement {}, it will not be checked",
e.getKey()); e.getKey());
} else { } else {
if (e.getValue().isEnabled()) { if (e.getValue().isEnabled()) {
// this requirement is enabled // this requirement is enabled
insertGlobalParameters(config, enabledCheck, parameterMap, e, req); insertGlobalParameters(config, enabledCheck, parameterMap, e, req);
} }
} }
} }
fillParameterMapsWithDefaultParameter(enabledCheck, parameterMap); fillParameterMapsWithDefaultParameter(enabledCheck, parameterMap);
ArrayList<Check> checkList = new ArrayList<>(); ArrayList<Check> checkList = new ArrayList<>();
for (CheckId id : enabledCheck) { for (CheckId id : enabledCheck) {
Check c = checkConfig.getCheckForId(id); Check c = checkConfig.getCheckForId(id);
c.init(parameterMap.get(id), parserConfig); c.init(parameterMap.get(id), parserConfig);
checkList.add(c); checkList.add(c);
} }
return checkList; return checkList;
} }
private void insertGlobalParameters(ValidationConfiguration config, Set<CheckId> enabledCheck, private void insertGlobalParameters(ValidationConfiguration config, Set<CheckId> enabledCheck,
Map<CheckId, Map<String, String>> parameterMap, Entry<String, RequirementConfiguration> e, Map<CheckId, Map<String, String>> parameterMap, Entry<String, RequirementConfiguration> e,
de.hft.stuttgart.citydoctor2.check.Requirement req) { de.hft.stuttgart.citydoctor2.check.Requirement req) {
for (CheckPrototype proto : Checks.getCheckPrototypes()) { for (CheckPrototype proto : Checks.getCheckPrototypes()) {
if (proto.checksRequirements().contains(req)) { if (proto.checksRequirements().contains(req)) {
// this requirement is checked by this check // this requirement is checked by this check
// put all requirement parameter in the map // put all requirement parameter in the map
parameterMap.compute(proto.getCheckId(), (k, v) -> { parameterMap.compute(proto.getCheckId(), (k, v) -> {
if (v == null) { if (v == null) {
v = new HashMap<>(); v = new HashMap<>();
v.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, config.getNumberOfRoundingPlacesAsString()); v.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, config.getNumberOfRoundingPlacesAsString());
v.put(GlobalParameters.MIN_VERTEX_DISTANCE, config.getMinVertexDistanceAsString()); v.put(GlobalParameters.MIN_VERTEX_DISTANCE, config.getMinVertexDistanceAsString());
} }
v.putAll(e.getValue().getParameters()); v.putAll(e.getValue().getParameters());
return v; return v;
}); });
enabledCheck.add(proto.getCheckId()); enabledCheck.add(proto.getCheckId());
collectDependencyChecks(proto, enabledCheck); collectDependencyChecks(proto, enabledCheck);
} }
} }
} }
private void fillParameterMapsWithDefaultParameter(Set<CheckId> enabledCheck, private void fillParameterMapsWithDefaultParameter(Set<CheckId> enabledCheck,
Map<CheckId, Map<String, String>> parameterMap) { Map<CheckId, Map<String, String>> parameterMap) {
for (CheckId id : enabledCheck) { for (CheckId id : enabledCheck) {
CheckPrototype proto = Checks.getCheckPrototypeForId(id); CheckPrototype proto = Checks.getCheckPrototypeForId(id);
Map<String, String> map = parameterMap.computeIfAbsent(id, k -> new HashMap<>()); Map<String, String> map = parameterMap.computeIfAbsent(id, k -> new HashMap<>());
for (de.hft.stuttgart.citydoctor2.check.Requirement req : proto.checksRequirements()) { for (de.hft.stuttgart.citydoctor2.check.Requirement req : proto.checksRequirements()) {
if (proto.checksRequirements().contains(req)) { if (proto.checksRequirements().contains(req)) {
for (DefaultParameter param : req.getDefaultParameter()) { for (DefaultParameter param : req.getDefaultParameter()) {
map.computeIfAbsent(param.getName(), k -> param.getValue()); map.computeIfAbsent(param.getName(), k -> param.getValue());
} }
} }
} }
} }
} }
private void collectDependencyChecks(CheckPrototype proto, Set<CheckId> enabledChecks) { private void collectDependencyChecks(CheckPrototype proto, Set<CheckId> enabledChecks) {
enabledChecks.addAll(proto.getDependencies()); enabledChecks.addAll(proto.getDependencies());
for (CheckId id : proto.getDependencies()) { for (CheckId id : proto.getDependencies()) {
if (enabledChecks.contains(id)) { if (enabledChecks.contains(id)) {
continue; continue;
} }
CheckPrototype depProto = Checks.getCheckPrototypeForId(id); CheckPrototype depProto = Checks.getCheckPrototypeForId(id);
collectDependencyChecks(depProto, enabledChecks); collectDependencyChecks(depProto, enabledChecks);
} }
} }
private void checkCityModel(CityDoctorModel model, ProgressListener l) { private void checkCityModel(CityDoctorModel model, ProgressListener l) {
Stream<CityObject> features = model.createFeatureStream(); Stream<CityObject> features = model.createFeatureStream();
float featureSum = model.getNumberOfFeatures(); float featureSum = model.getNumberOfFeatures();
// stupid lamda with final variable restrictions // stupid lamda with final variable restrictions
int[] currentFeature = new int[1]; int[] currentFeature = new int[1];
features.forEach(co -> { features.forEach(co -> {
if (config.getParserConfiguration().useLowMemoryConsumption()) { if (config.getParserConfiguration().useLowMemoryConsumption()) {
// no edges have been created yet, create them // no edges have been created yet, create them
co.prepareForChecking(); co.prepareForChecking();
} }
// check every feature // check every feature
executeChecksForCityObject(co); executeChecksForCityObject(co);
if (config.getParserConfiguration().useLowMemoryConsumption()) { if (config.getParserConfiguration().useLowMemoryConsumption()) {
// low memory consumption, remove edges again // low memory consumption, remove edges again
co.clearMetaInformation(); co.clearMetaInformation();
} }
if (l != null) { if (l != null) {
currentFeature[0]++; currentFeature[0]++;
l.updateProgress(currentFeature[0] / featureSum); l.updateProgress(currentFeature[0] / featureSum);
} }
}); });
} }
private boolean filterObject(CityObject co) { private boolean filterObject(CityObject co) {
return isObjectIncluded(co, includeFilters, excludeFilters); return isObjectIncluded(co, includeFilters, excludeFilters);
} }
private boolean isObjectIncluded(CityObject co, List<Filter> includeFilters, List<Filter> excludeFilters) { private boolean isObjectIncluded(CityObject co, List<Filter> includeFilters, List<Filter> excludeFilters) {
if (!includeFilters.isEmpty()) { if (!includeFilters.isEmpty()) {
boolean include = false; boolean include = false;
for (Filter f : includeFilters) { for (Filter f : includeFilters) {
if (f.matches(co)) { if (f.matches(co)) {
include = true; include = true;
break; break;
} }
} }
if (!include) { if (!include) {
// not included, ignore // not included, ignore
return false; return false;
} }
} }
// check if object is excluded // check if object is excluded
for (Filter f : excludeFilters) { for (Filter f : excludeFilters) {
if (f.matches(co)) { if (f.matches(co)) {
// exclude object // exclude object
return false; return false;
} }
} }
return true; return true;
} }
/** /**
* Checks the city object if it has not been removed by the filters. The check * Checks the city object if it has not been removed by the filters. The check
* result are stored into the city object itself. * result are stored into the city object itself.
* *
* @param co the city object that is going to be checked * @param co the city object that is going to be checked
*/ */
private void executeChecksForCityObject(CityObject co) { private void executeChecksForCityObject(CityObject co) {
if (!filterObject(co)) { if (!filterObject(co)) {
return; return;
} }
executeChecksForCheckable(co); executeChecksForCheckable(co);
} }
/** /**
* Executes all checks for the checkable. This will bypass the filters. This * Executes all checks for the checkable. This will bypass the filters. This
* will clear the old check results * will clear the old check results
* *
* @param co the checkable. * @param co the checkable.
*/ */
public void executeChecksForCheckable(Checkable co) { public void executeChecksForCheckable(Checkable co) {
// throw away old results // throw away old results
co.clearAllContainedCheckResults(); co.clearAllContainedCheckResults();
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(Localization.getText("Checker.checkFeature"), co); logger.debug(Localization.getText("Checker.checkFeature"), co);
} }
for (List<Check> execLayer : execLayers) { for (List<Check> execLayer : execLayers) {
for (Check check : execLayer) { for (Check check : execLayer) {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
...@@ -699,133 +702,200 @@ public class Checker { ...@@ -699,133 +702,200 @@ public class Checker {
co.accept(check); co.accept(check);
} }
} }
} }
public static List<List<Check>> buildExecutionLayers(List<Check> checks) { public static List<List<Check>> buildExecutionLayers(List<Check> checks) {
List<List<Check>> result = new ArrayList<>(); List<List<Check>> result = new ArrayList<>();
Set<Check> availableChecks = new HashSet<>(checks); Set<Check> availableChecks = new HashSet<>(checks);
Set<CheckId> usedChecks = new HashSet<>(); Set<CheckId> usedChecks = new HashSet<>();
while (!availableChecks.isEmpty()) { while (!availableChecks.isEmpty()) {
List<Check> layer = new ArrayList<>(); List<Check> layer = new ArrayList<>();
Iterator<Check> iterator = availableChecks.iterator(); Iterator<Check> iterator = availableChecks.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Check c = iterator.next(); Check c = iterator.next();
boolean hasUnusedDependency = searchForUnusedDependency(usedChecks, c); boolean hasUnusedDependency = searchForUnusedDependency(usedChecks, c);
if (!hasUnusedDependency) { if (!hasUnusedDependency) {
iterator.remove(); iterator.remove();
layer.add(new CheckContainer(c)); layer.add(new CheckContainer(c));
} }
} }
if (layer.isEmpty()) { if (layer.isEmpty()) {
throw new IllegalStateException( throw new IllegalStateException(
"There are checks that have dependencies that are not executed or are unknown, aborting"); "There are checks that have dependencies that are not executed or are unknown, aborting");
} }
result.add(layer); result.add(layer);
for (Check c : layer) { for (Check c : layer) {
usedChecks.add(c.getCheckId()); usedChecks.add(c.getCheckId());
} }
} }
return result; return result;
} }
private static boolean searchForUnusedDependency(Set<CheckId> usedChecks, Check c) { private static boolean searchForUnusedDependency(Set<CheckId> usedChecks, Check c) {
boolean hasUnusedDependency = false; boolean hasUnusedDependency = false;
for (CheckId id : c.getDependencies()) { for (CheckId id : c.getDependencies()) {
if (!usedChecks.contains(id)) { if (!usedChecks.contains(id)) {
hasUnusedDependency = true; hasUnusedDependency = true;
break; break;
} }
} }
return hasUnusedDependency; return hasUnusedDependency;
} }
public static void streamCheck(File inputFile, String xmlOutput, String pdfOutput, ValidationConfiguration config, public static void streamCheck(CityGmlZipArchive archive, String xmlDirectory, String pdfDirectory, ValidationConfiguration config,
String outputFile) throws IOException, CityGmlParseException { String outputDirectory) throws IOException, CityGmlParseException {
streamCheck(inputFile, xmlOutput, pdfOutput, config, null, outputFile); streamCheck(archive, xmlDirectory, pdfDirectory, config, null, outputDirectory);
} }
public static void streamCheck(File inputFile, String xmlOutput, String pdfOutput, ValidationConfiguration config, public static void streamCheck(CityGmlZipArchive archive, String xmlDirectory, String pdfDirectory, ValidationConfiguration config,
FeatureCheckedListener l, String outputFile) throws IOException, CityGmlParseException { FeatureCheckedListener l, String outputDirectory) throws IOException, CityGmlParseException {
try (BufferedOutputStream xmlBos = getXmlOutputMaybe(xmlOutput);
BufferedOutputStream pdfBos = getPdfOutputMaybe(pdfOutput)) {
Checker c = new Checker(config, null); for (CityGmlZipEntry entry : archive.getEntries()) {
String fileName = inputFile.getName(); String entryName = FilenameUtils.removeExtension(entry.getDisplayName());
String xmlOutput = null;
// create reporter if available String pdfOutput = null;
XmlStreamReporter xmlReporter = getXmlReporter(config, xmlBos, fileName); String outputFile = null;
PdfStreamReporter pdfReporter = getPdfReporter(config, pdfBos, fileName); if (xmlDirectory != null) {
xmlOutput = Path.of(xmlDirectory).resolve(entryName + "_report.xml").toString();
// execute schematron first }
SvrlContentHandler handler = executeSchematronValidationIfAvailable(config, inputFile); if (pdfDirectory != null) {
CityGmlConsumer con = new StreamCityGmlConsumer(c, xmlReporter, pdfReporter, handler, config, l); pdfOutput = Path.of(pdfDirectory).resolve(entryName + "_report.pdf").toString();
// parse and validate }
CityGmlParser.streamCityGml(inputFile.getAbsolutePath(), config.getParserConfiguration(), con, outputFile); if (outputDirectory != null) {
outputFile = Path.of(outputDirectory).resolve(entryName + "_validated.gml").toString();
// write reports if available }
writeReport(xmlReporter);
writeReport(pdfReporter); streamCheck(entry, xmlOutput, pdfOutput, config, l, outputFile);
} catch (CheckReportWriteException e) {
logger.error(Localization.getText("Checker.failReports"), e);
} }
} if (outputDirectory != null) {
ArchivePacker.packAndDeleteDirectory(outputDirectory);
private static XmlStreamReporter getXmlReporter(ValidationConfiguration config, BufferedOutputStream xmlBos, }
String fileName) { }
XmlStreamReporter xmlReporter;
if (xmlBos != null) {
xmlReporter = new XmlStreamReporter(xmlBos, fileName, config); public static void streamCheck(CityGmlZipEntry entry, String xmlOutput, String pdfOutput, ValidationConfiguration config,
} else { String outputFile) throws IOException, CityGmlParseException {
xmlReporter = null; streamCheck(entry, xmlOutput, pdfOutput, config, null, outputFile);
} }
return xmlReporter;
} public static void streamCheck(CityGmlZipEntry entry, String xmlOutput, String pdfOutput, ValidationConfiguration config,
FeatureCheckedListener l, String outputFile) throws IOException, CityGmlParseException {
private static PdfStreamReporter getPdfReporter(ValidationConfiguration config, BufferedOutputStream pdfBos, try (BufferedOutputStream xmlBos = getXmlOutputMaybe(xmlOutput);
String fileName) { BufferedOutputStream pdfBos = getPdfOutputMaybe(pdfOutput)) {
PdfStreamReporter pdfReporter; Checker c = new Checker(config, null);
if (pdfBos != null) { String fileName = entry.getEntrySubPath();
pdfReporter = new PdfStreamReporter(pdfBos, fileName, config);
} else { // create reporter if available
pdfReporter = null; XmlStreamReporter xmlReporter = getXmlReporter(config, xmlBos, fileName);
} PdfStreamReporter pdfReporter = getPdfReporter(config, pdfBos, fileName);
return pdfReporter;
} // execute schematron first
try (CityGmlZipEntryFile entryFile = new CityGmlZipEntryFile(entry)) {
public static void writeReport(StreamReporter reporter) throws CheckReportWriteException { SvrlContentHandler handler = executeSchematronValidationIfAvailable(config, entryFile.getInputStream());
if (reporter != null) {
reporter.finishReport(); CityGmlConsumer con = new StreamCityGmlConsumer(c, xmlReporter, pdfReporter, handler, config, l);
} // parse and validate
} CityGmlParser.streamCityGml(entry, config.getParserConfiguration(), con, outputFile);
public static BufferedOutputStream getPdfOutputMaybe(String pdfOutput) throws FileNotFoundException { // write reports if available
return pdfOutput != null ? new BufferedOutputStream(new FileOutputStream(pdfOutput)) : null; writeReport(xmlReporter);
} writeReport(pdfReporter);
}
public static BufferedOutputStream getXmlOutputMaybe(String xmlOutput) throws FileNotFoundException { } catch (CheckReportWriteException e) {
return xmlOutput != null ? new BufferedOutputStream(new FileOutputStream(xmlOutput)) : null; logger.error(Localization.getText("Checker.failReports"), e);
} }
}
/**
* Checks the city object and writes report information into reporters. Clears public static void streamCheck(File inputFile, String xmlOutput, String pdfOutput, ValidationConfiguration config,
* old check results. If the city object would be filtered by the configured String outputFile) throws IOException, CityGmlParseException {
* filters it is ignored and old check results are not cleared. streamCheck(inputFile, xmlOutput, pdfOutput, config, null, outputFile);
* }
* @param xmlReporter a xml reporter
* @param pdfReporter a pdf reporter public static void streamCheck(File inputFile, String xmlOutput, String pdfOutput, ValidationConfiguration config,
* @param co the city object to be checked FeatureCheckedListener l, String outputFile) throws IOException, CityGmlParseException {
*/ try (BufferedOutputStream xmlBos = getXmlOutputMaybe(xmlOutput);
public void checkFeature(XmlStreamReporter xmlReporter, PdfStreamReporter pdfReporter, CityObject co) { BufferedOutputStream pdfBos = getPdfOutputMaybe(pdfOutput)) {
if (logger.isDebugEnabled()) { Checker c = new Checker(config, null);
logger.debug(Localization.getText("Checker.checkFeature"), co); String fileName = inputFile.getName();
}
executeChecksForCityObject(co); // create reporter if available
if (xmlReporter != null) { XmlStreamReporter xmlReporter = getXmlReporter(config, xmlBos, fileName);
xmlReporter.report(co); PdfStreamReporter pdfReporter = getPdfReporter(config, pdfBos, fileName);
}
if (pdfReporter != null) { // execute schematron first
pdfReporter.report(co); SvrlContentHandler handler = executeSchematronValidationIfAvailable(config, inputFile);
} CityGmlConsumer con = new StreamCityGmlConsumer(c, xmlReporter, pdfReporter, handler, config, l);
} // parse and validate
CityGmlParser.streamCityGml(inputFile.getAbsolutePath(), config.getParserConfiguration(), con, outputFile);
// write reports if available
writeReport(xmlReporter);
writeReport(pdfReporter);
} catch (CheckReportWriteException e) {
logger.error(Localization.getText("Checker.failReports"), e);
}
}
private static XmlStreamReporter getXmlReporter(ValidationConfiguration config, BufferedOutputStream xmlBos,
String fileName) {
XmlStreamReporter xmlReporter;
if (xmlBos != null) {
xmlReporter = new XmlStreamReporter(xmlBos, fileName, config);
} else {
xmlReporter = null;
}
return xmlReporter;
}
private static PdfStreamReporter getPdfReporter(ValidationConfiguration config, BufferedOutputStream pdfBos,
String fileName) {
PdfStreamReporter pdfReporter;
if (pdfBos != null) {
pdfReporter = new PdfStreamReporter(pdfBos, fileName, config);
} else {
pdfReporter = null;
}
return pdfReporter;
}
public static void writeReport(StreamReporter reporter) throws CheckReportWriteException {
if (reporter != null) {
reporter.finishReport();
}
}
public static BufferedOutputStream getPdfOutputMaybe(String pdfOutput) throws FileNotFoundException {
return pdfOutput != null ? new BufferedOutputStream(new FileOutputStream(pdfOutput)) : null;
}
public static BufferedOutputStream getXmlOutputMaybe(String xmlOutput) throws FileNotFoundException {
return xmlOutput != null ? new BufferedOutputStream(new FileOutputStream(xmlOutput)) : null;
}
/**
* Checks the city object and writes report information into reporters. Clears
* old check results. If the city object would be filtered by the configured
* filters it is ignored and old check results are not cleared.
*
* @param xmlReporter a xml reporter
* @param pdfReporter a pdf reporter
* @param co the city object to be checked
*/
public void checkFeature(XmlStreamReporter xmlReporter, PdfStreamReporter pdfReporter, CityObject co) {
if (logger.isDebugEnabled()) {
logger.debug(Localization.getText("Checker.checkFeature"), co);
}
executeChecksForCityObject(co);
if (xmlReporter != null) {
xmlReporter.report(co);
}
if (pdfReporter != null) {
pdfReporter.report(co);
}
}
} }
...@@ -29,6 +29,9 @@ import java.util.Set; ...@@ -29,6 +29,9 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractTunnel;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.citygml4j.core.model.core.AbstractFeatureProperty; import org.citygml4j.core.model.core.AbstractFeatureProperty;
...@@ -139,8 +142,12 @@ public class StreamCityGmlConsumer implements CityGmlConsumer { ...@@ -139,8 +142,12 @@ public class StreamCityGmlConsumer implements CityGmlConsumer {
pdfReporter.report(co); pdfReporter.report(co);
} }
// store quality ade datastructures in cityobject // TODO: Update QualityADE to be compatible with CityGML 3.0 or deprecate it, unhandled top-level feature types are just skipped for now
QualityADEUtils.writeQualityAde(co, val); if (!(co instanceof AbstractTunnel || co instanceof CityFurniture || co instanceof GenericCityObject)) {
// store quality ade datastructures in cityobject
QualityADEUtils.writeQualityAde(co, val);
}
// recreate geometry // recreate geometry
co.reCreateGeometries(gmlFactory, config.getParserConfiguration()); co.reCreateGeometries(gmlFactory, config.getParserConfiguration());
......
...@@ -29,6 +29,10 @@ import java.util.Map.Entry; ...@@ -29,6 +29,10 @@ import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Tunnel;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -153,6 +157,12 @@ public class XmlStreamReporter implements StreamReporter { ...@@ -153,6 +157,12 @@ public class XmlStreamReporter implements StreamReporter {
reportWater(wo); reportWater(wo);
} else if (co instanceof LandObject lo) { } else if (co instanceof LandObject lo) {
reportLand(lo); reportLand(lo);
} else if (co instanceof Tunnel to) {
reportTunnel(to);
} else if (co instanceof CityFurniture cf) {
reportCityFurniture(cf);
} else if (co instanceof GenericCityObject gco) {
reportGenericCityObject(gco);
} else { } else {
throw new IllegalStateException("Not reportable CityObject found: " + co.getClass().getSimpleName()); throw new IllegalStateException("Not reportable CityObject found: " + co.getClass().getSimpleName());
} }
...@@ -196,6 +206,24 @@ public class XmlStreamReporter implements StreamReporter { ...@@ -196,6 +206,24 @@ public class XmlStreamReporter implements StreamReporter {
report.getValidationResults().getBuildingReports().add(fr); report.getValidationResults().getBuildingReports().add(fr);
} }
private void reportTunnel(Tunnel to) {
FeatureReport fr = createCityObjectReportNode(to);
for (TunnelPart tp : to.getTunnelParts()) {
reportMap.put(tp.getGmlId().getGmlString(), fr);
}
report.getValidationResults().getTunnelReports().add(fr);
}
private void reportCityFurniture(CityFurniture cf) {
FeatureReport fr = createCityObjectReportNode(cf);
report.getValidationResults().getCityFurnitureReports().add(fr);
}
private void reportGenericCityObject(GenericCityObject gco) {
FeatureReport fr = createCityObjectReportNode(gco);
report.getValidationResults().getGenericCityObjectReports().add(fr);
}
private FeatureReport createCityObjectReportNode(CityObject co) { private FeatureReport createCityObjectReportNode(CityObject co) {
FeatureReport fr = new FeatureReport(); FeatureReport fr = new FeatureReport();
reportMap.put(co.getGmlId().getGmlString(), fr); reportMap.put(co.getGmlId().getGmlString(), fr);
...@@ -257,6 +285,9 @@ public class XmlStreamReporter implements StreamReporter { ...@@ -257,6 +285,9 @@ public class XmlStreamReporter implements StreamReporter {
createStatistics(globalErrorCount, report.getValidationResults().getTransportationReports()); createStatistics(globalErrorCount, report.getValidationResults().getTransportationReports());
createStatistics(globalErrorCount, report.getValidationResults().getVegetationReports()); createStatistics(globalErrorCount, report.getValidationResults().getVegetationReports());
createStatistics(globalErrorCount, report.getValidationResults().getWaterReports()); createStatistics(globalErrorCount, report.getValidationResults().getWaterReports());
createStatistics(globalErrorCount, report.getValidationResults().getTunnelReports());
createStatistics(globalErrorCount, report.getValidationResults().getCityFurnitureReports());
createStatistics(globalErrorCount, report.getValidationResults().getGenericCityObjectReports());
addStatisticsObjects(stats.getErrorStats(), globalErrorCount); addStatisticsObjects(stats.getErrorStats(), globalErrorCount);
report.setGlobalStatistics(stats); report.setGlobalStatistics(stats);
...@@ -271,6 +302,9 @@ public class XmlStreamReporter implements StreamReporter { ...@@ -271,6 +302,9 @@ public class XmlStreamReporter implements StreamReporter {
modelStats.setNumTransportation(report.getValidationResults().getTransportationReports().size()); modelStats.setNumTransportation(report.getValidationResults().getTransportationReports().size());
modelStats.setNumVegetation(report.getValidationResults().getVegetationReports().size()); modelStats.setNumVegetation(report.getValidationResults().getVegetationReports().size());
modelStats.setNumWaterObjects(report.getValidationResults().getWaterReports().size()); modelStats.setNumWaterObjects(report.getValidationResults().getWaterReports().size());
modelStats.setNumTunnelObjects(report.getValidationResults().getTunnelReports().size());
modelStats.setNumCityFurniture(report.getValidationResults().getCityFurnitureReports().size());
modelStats.setNumGenericCityObjects(report.getValidationResults().getGenericCityObjectReports().size());
return modelStats; return modelStats;
} }
...@@ -285,6 +319,12 @@ public class XmlStreamReporter implements StreamReporter { ...@@ -285,6 +319,12 @@ public class XmlStreamReporter implements StreamReporter {
globErrStats globErrStats
.setNumErrorVegetation(getNumberOfErrorFeatures(report.getValidationResults().getVegetationReports())); .setNumErrorVegetation(getNumberOfErrorFeatures(report.getValidationResults().getVegetationReports()));
globErrStats.setNumErrorWaterObjects(getNumberOfErrorFeatures(report.getValidationResults().getWaterReports())); globErrStats.setNumErrorWaterObjects(getNumberOfErrorFeatures(report.getValidationResults().getWaterReports()));
globErrStats.setNumErrorTunnelObjects(
getNumberOfErrorFeatures(report.getValidationResults().getTunnelReports()));
globErrStats.setNumErrorCityFurniture(
getNumberOfErrorFeatures(report.getValidationResults().getCityFurnitureReports()));
globErrStats.setNumErrorGenericCityObjects(
getNumberOfErrorFeatures(report.getValidationResults().getGenericCityObjectReports()));
return globErrStats; return globErrStats;
} }
......
...@@ -27,8 +27,11 @@ import de.hft.stuttgart.citydoctor2.checks.Checks; ...@@ -27,8 +27,11 @@ import de.hft.stuttgart.citydoctor2.checks.Checks;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject; import de.hft.stuttgart.citydoctor2.datastructure.BridgeObject;
import de.hft.stuttgart.citydoctor2.datastructure.Building; import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject; import de.hft.stuttgart.citydoctor2.datastructure.TransportationObject;
import de.hft.stuttgart.citydoctor2.datastructure.Tunnel;
import de.hft.stuttgart.citydoctor2.datastructure.Vegetation; import de.hft.stuttgart.citydoctor2.datastructure.Vegetation;
import de.hft.stuttgart.citydoctor2.datastructure.WaterObject; import de.hft.stuttgart.citydoctor2.datastructure.WaterObject;
...@@ -60,6 +63,15 @@ public class XmlValidationReporter implements Reporter { ...@@ -60,6 +63,15 @@ public class XmlValidationReporter implements Reporter {
for (WaterObject wo : model.getWater()) { for (WaterObject wo : model.getWater()) {
streamReporter.report(wo); streamReporter.report(wo);
} }
for (Tunnel tunnel : model.getTunnels()) {
streamReporter.report(tunnel);
}
for (CityFurniture cf : model.getCityFurniture()) {
streamReporter.report(cf);
}
for (GenericCityObject gco : model.getGenericCityObjects()) {
streamReporter.report(gco);
}
for (CheckError err : model.getGlobalErrors()) { for (CheckError err : model.getGlobalErrors()) {
streamReporter.reportGlobalError(err); streamReporter.reportGlobalError(err);
} }
......
...@@ -29,6 +29,18 @@ import java.util.Map.Entry; ...@@ -29,6 +29,18 @@ import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractTunnel;
import de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit;
import de.hft.stuttgart.citydoctor2.datastructure.CityFurniture;
import de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Storey;
import de.hft.stuttgart.citydoctor2.datastructure.Tunnel;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement;
import de.hft.stuttgart.citydoctor2.datastructure.TunnelPart;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -105,6 +117,18 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -105,6 +117,18 @@ public class PdfStreamReporter implements StreamReporter {
private int numErrorLand; private int numErrorLand;
private int numOkLand; private int numOkLand;
private Section tunnel;
private int numErrorTunnel;
private int numOkTunnel;
private Section cityFurniture;
private int numErrorCityFurniture;
private int numOkCityFurniture;
private Section genericCityObject;
private int numErrorGenericCityObject;
private int numOkGenericCityObject;
private Section globalErrors; private Section globalErrors;
private final Map<String, Section> sectionMap = new HashMap<>(); private final Map<String, Section> sectionMap = new HashMap<>();
...@@ -186,6 +210,12 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -186,6 +210,12 @@ public class PdfStreamReporter implements StreamReporter {
reportWater(co, hasError); reportWater(co, hasError);
} else if (co instanceof LandObject) { } else if (co instanceof LandObject) {
reportLand(co, hasError); reportLand(co, hasError);
} else if (co instanceof Tunnel) {
reportTunnel(co, hasError);
} else if (co instanceof CityFurniture) {
reportCityFurniture(co, hasError);
} else if (co instanceof GenericCityObject) {
reportGenericCityObject(co, hasError);
} else { } else {
throw new IllegalStateException("Unknown City Object found: " + co.getClass()); throw new IllegalStateException("Unknown City Object found: " + co.getClass());
} }
...@@ -237,6 +267,8 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -237,6 +267,8 @@ public class PdfStreamReporter implements StreamReporter {
bSection.setHeadlineColor(OK_COLOR); bSection.setHeadlineColor(OK_COLOR);
} }
writeErrorForCityObject(co, bSection); writeErrorForCityObject(co, bSection);
BridgeObject bo = (BridgeObject) co;
writeCheckResultForBridgeObject(bo, bSection);
} }
private void reportTrans(CityObject co, boolean hasError) { private void reportTrans(CityObject co, boolean hasError) {
...@@ -282,22 +314,74 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -282,22 +314,74 @@ public class PdfStreamReporter implements StreamReporter {
Section bSection = buildings.createSubSection(co.getGmlId().getGmlString()); Section bSection = buildings.createSubSection(co.getGmlId().getGmlString());
sectionMap.put(co.getGmlId().getGmlString(), bSection); sectionMap.put(co.getGmlId().getGmlString(), bSection);
if (hasError) { if (hasError) {
numErrorBuildings++;
bSection.setHeadlineColor(ERROR_COLOR); bSection.setHeadlineColor(ERROR_COLOR);
} else { } else {
numOkBuildings++;
bSection.setHeadlineColor(OK_COLOR); bSection.setHeadlineColor(OK_COLOR);
} }
writeErrorForCityObject(co, bSection); writeErrorForCityObject(co, bSection);
Building b = (Building) co; Building b = (Building) co;
for (BuildingPart bp : b.getBuildingParts()) { for (BuildingPart bp : b.getBuildingParts()) {
if (containsError(bp)) {
numErrorBuildings++;
} else {
numOkBuildings++;
}
sectionMap.put(bp.getGmlId().getGmlString(), bSection); sectionMap.put(bp.getGmlId().getGmlString(), bSection);
writeCheckResultForBuildingPart(bp, bSection); writeCheckResultForAbstractBuilding(bp, bSection);
}
writeCheckResultForAbstractBuilding(b, bSection);
}
private void reportTunnel(CityObject co, boolean hasError) {
if (tunnel == null) {
tunnel = vr.createSubSection("Tunnel");
}
Section tSection = tunnel.createSubSection(co.getGmlId().getGmlString());
sectionMap.put(co.getGmlId().getGmlString(), tSection);
if (hasError) {
numErrorTunnel++;
tSection.setHeadlineColor(ERROR_COLOR);
} else {
numOkTunnel++;
tSection.setHeadlineColor(OK_COLOR);
} }
for (BoundarySurface bs : b.getBoundarySurfaces()) { writeErrorForCityObject(co, tSection);
writeCheckResultForBoundarySurface(bs, bSection); Tunnel t = (Tunnel) co;
writeCheckResultForAbstractTunnel(t, tSection);
}
private void reportCityFurniture(CityObject co, boolean hasError) {
if (cityFurniture == null) {
cityFurniture = vr.createSubSection("CityFurniture");
}
Section cfSection = cityFurniture.createSubSection(co.getGmlId().getGmlString());
sectionMap.put(co.getGmlId().getGmlString(), cfSection);
if (hasError) {
numErrorCityFurniture++;
cfSection.setHeadlineColor(ERROR_COLOR);
} else {
numOkCityFurniture++;
cfSection.setHeadlineColor(OK_COLOR);
}
writeErrorForCityObject(co, cfSection);
}
private void reportGenericCityObject(CityObject co, boolean hasError) {
if (genericCityObject == null) {
genericCityObject = vr.createSubSection("GenericCityObject");
} }
for (Installation bi : b.getBuildingInstallations()) { Section gcSection = genericCityObject.createSubSection(co.getGmlId().getGmlString());
writeCheckResultForInstallation(bi, bSection); sectionMap.put(co.getGmlId().getGmlString(), gcSection);
if (hasError) {
numErrorGenericCityObject++;
gcSection.setHeadlineColor(ERROR_COLOR);
} else {
numOkGenericCityObject++;
gcSection.setHeadlineColor(OK_COLOR);
} }
writeErrorForCityObject(co, gcSection);
} }
private void writeCheckResultForInstallation(Installation bi, Section root) { private void writeCheckResultForInstallation(Installation bi, Section root) {
...@@ -327,6 +411,166 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -327,6 +411,166 @@ public class PdfStreamReporter implements StreamReporter {
} }
} }
private void writeCheckResultForAbstractBuilding(AbstractBuilding ab, Section root) {
Map<CheckId, CheckResult> results = ab.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : ab.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (AbstractRoom ar : ab.getBuildingRooms()) {
writeCheckResultForRoom(ar, root);
}
for (AbstractFurniture af : ab.getBuildingRoomFurnitureList()) {
writeCheckResultForAbstractFurniture(af, root);
}
for (Storey s : ab.getBuildingStoreys()) {
writeCheckResultForStorey(s, root);
}
for (BuildingUnit bu : ab.getBuildingUnits()) {
writeCheckResultForBuildingUnit(bu, root);
}
for (BoundarySurface bs : ab.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
for (Installation bi : ab.getBuildingInstallations()) {
writeCheckResultForInstallation(bi, root);
}
}
private void writeCheckResultForBridgeObject(BridgeObject bo, Section root) {
Map<CheckId, CheckResult> results = bo.getAllCheckResults();
writeCheckResults(results.values(), root);
for (BridgeObject part : bo.getParts()) {
if (containsError(part)) {
numErrorBridge++;
} else {
numOkBridge++;
}
sectionMap.put(bo.getGmlId().getGmlString(), root);
writeCheckResultForBridgeObject(part, root);
}
for (Geometry geom : bo.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (AbstractRoom ar : bo.getBridgeRooms()) {
writeCheckResultForRoom(ar, root);
}
for (AbstractFurniture af : bo.getBridgeFurniture()) {
writeCheckResultForAbstractFurniture(af, root);
}
for (BridgeConstructiveElement bce : bo.getConstructiveElements()) {
writeCheckResultForBridgeConstructiveElement(bce, root);
}
for (BoundarySurface bs : bo.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
for (Installation bi : bo.getBridgeInstallations()) {
writeCheckResultForInstallation(bi, root);
}
}
private void writeCheckResultForStorey(Storey s, Section root) {
Map<CheckId, CheckResult> results = s.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : s.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (AbstractRoom ar : s.getBuildingRooms()) {
writeCheckResultForRoom(ar, root);
}
for (BuildingUnit bu : s.getBuildingUnits()) {
writeCheckResultForBuildingUnit(bu, root);
}
for (AbstractFurniture af : s.getBuildingRoomFurnitureList()) {
writeCheckResultForAbstractFurniture(af, root);
}
for (BoundarySurface bs : s.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
for (Installation bi : s.getBuildingInstallations()) {
writeCheckResultForInstallation(bi, root);
}
}
private void writeCheckResultForBuildingUnit(BuildingUnit bu, Section root) {
Map<CheckId, CheckResult> results = bu.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : bu.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (AbstractRoom ar : bu.getBuildingRooms()) {
writeCheckResultForRoom(ar, root);
}
for (Storey s : bu.getStoreys()) {
writeCheckResultForStorey(s, root);
}
for (AbstractFurniture af : bu.getBuildingRoomFurnitureList()) {
writeCheckResultForAbstractFurniture(af, root);
}
for (BoundarySurface bs : bu.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
for (Installation bi : bu.getBuildingInstallations()) {
writeCheckResultForInstallation(bi, root);
}
}
private void writeCheckResultForAbstractTunnel(AbstractTunnel at, Section root) {
Map<CheckId, CheckResult> results = at.getAllCheckResults();
writeCheckResults(results.values(), root);
for (TunnelPart tp : at.getTunnelParts()) {
if (containsError(tp)) {
numErrorTunnel++;
} else {
numOkTunnel++;
}
sectionMap.put(tp.getGmlId().getGmlString(), root);
writeCheckResultForAbstractTunnel(tp, root);
}
for (Geometry geom : at.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (AbstractRoom ar : at.getTunnelHollows()) {
writeCheckResultForRoom(ar, root);
}
for (TunnelConstructiveElement te : at.getTunnelConstructiveElements()) {
writeCheckResultForTunnelConstructiveElement(te, root);
}
for (AbstractFurniture tf : at.getTunnelFurniture()) {
writeCheckResultForAbstractFurniture(tf, root);
}
for (BoundarySurface bs : at.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
for (Installation bi : at.getTunnelInstallations()) {
writeCheckResultForInstallation(bi, root);
}
}
private void writeCheckResultForTunnelConstructiveElement(TunnelConstructiveElement te, Section root) {
Map<CheckId, CheckResult> results = te.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : te.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (BoundarySurface bs : te.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
}
private void writeCheckResultForBridgeConstructiveElement(BridgeConstructiveElement bce, Section root) {
Map<CheckId, CheckResult> results = bce.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : bce.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (BoundarySurface bs : bce.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
}
private void writeErrorForCityObject(CityObject co, Section section) { private void writeErrorForCityObject(CityObject co, Section section) {
Map<CheckId, CheckResult> results = co.getAllCheckResults(); Map<CheckId, CheckResult> results = co.getAllCheckResults();
writeCheckResults(results.values(), section); writeCheckResults(results.values(), section);
...@@ -343,6 +587,31 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -343,6 +587,31 @@ public class PdfStreamReporter implements StreamReporter {
} }
} }
private void writeCheckResultForAbstractFurniture(AbstractFurniture af, Section root) {
Map<CheckId, CheckResult> results = af.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : af.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (BoundarySurface bs : af.getBoundarySurfaceList()) {
writeCheckResultForBoundarySurface(bs, root);
}
}
private void writeCheckResultForRoom(AbstractRoom ar, Section root) {
Map<CheckId, CheckResult> results = ar.getAllCheckResults();
writeCheckResults(results.values(), root);
for (Geometry geom : ar.getGeometries()) {
writeCheckResultForGeometry(geom, root);
}
for (Installation in : ar.getRoomInstallations()) {
writeCheckResultForInstallation(in, root);
}
for (BoundarySurface bs : ar.getBoundarySurfaces()) {
writeCheckResultForBoundarySurface(bs, root);
}
}
private void writeCheckResultForOpening(Opening o, Section root) { private void writeCheckResultForOpening(Opening o, Section root) {
Map<CheckId, CheckResult> results = o.getAllCheckResults(); Map<CheckId, CheckResult> results = o.getAllCheckResults();
writeCheckResults(results.values(), root); writeCheckResults(results.values(), root);
...@@ -392,9 +661,10 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -392,9 +661,10 @@ public class PdfStreamReporter implements StreamReporter {
@Override @Override
public void finishReport() throws CheckReportWriteException { public void finishReport() throws CheckReportWriteException {
if (buildings != null) { //if (buildings != null) {
countFinishedReportBuildings(); // countFinishedReportBuildings();
} //}
int numBuildings = numErrorBuildings + numOkBuildings; int numBuildings = numErrorBuildings + numOkBuildings;
if (numBuildings > 0) { if (numBuildings > 0) {
statistics.addDistributionBar("Buildings", numErrorBuildings, numOkBuildings); statistics.addDistributionBar("Buildings", numErrorBuildings, numOkBuildings);
...@@ -425,6 +695,21 @@ public class PdfStreamReporter implements StreamReporter { ...@@ -425,6 +695,21 @@ public class PdfStreamReporter implements StreamReporter {
statistics.addDistributionBar("Land Objects", numErrorLand, numOkLand); statistics.addDistributionBar("Land Objects", numErrorLand, numOkLand);
} }
int numTunnel = numErrorTunnel + numOkTunnel;
if (numTunnel > 0) {
statistics.addDistributionBar("Tunnel Objects", numErrorTunnel, numOkTunnel);
}
int numCityFurniture = numErrorCityFurniture + numOkCityFurniture;
if (numCityFurniture > 0) {
statistics.addDistributionBar("City Furniture", numErrorCityFurniture, numOkCityFurniture);
}
int numGenericCityObjects = numErrorGenericCityObject + numOkGenericCityObject;
if (numGenericCityObjects > 0) {
statistics.addDistributionBar("Generic City Objects", numErrorGenericCityObject, numOkGenericCityObject);
}
statistics.addTextElement("Error Statistics:"); statistics.addTextElement("Error Statistics:");
for (Entry<ErrorId, AtomicInteger> e : errorStatistics.entrySet()) { for (Entry<ErrorId, AtomicInteger> e : errorStatistics.entrySet()) {
statistics.add10PtTextElement(e.getKey().toString() + ": " + e.getValue().intValue(), 10); statistics.add10PtTextElement(e.getKey().toString() + ": " + e.getValue().intValue(), 10);
......
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