Merge remote-tracking branch 'origin/master'

This commit is contained in:
pilar 2020-12-01 16:03:09 -05:00
commit 024e47fe0c
9 changed files with 574 additions and 77 deletions

View File

@ -4,12 +4,13 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import numpy as np import numpy as np
import matplotlib.pyplot as plt
from trimesh import Trimesh from trimesh import Trimesh
from helpers.geometry_helper import GeometryHelper from helpers.geometry_helper import GeometryHelper
from helpers.configuration_helper import ConfigurationHelper
from city_model_structure.attributes.surface import Surface from city_model_structure.attributes.surface import Surface
class Polyhedron: class Polyhedron:
""" """
Polyhedron class Polyhedron class
@ -25,6 +26,11 @@ class Polyhedron:
self._mesh = None self._mesh = None
self._centroid = None self._centroid = None
self._max_z = None self._max_z = None
self._max_y = None
self._max_x = None
self._min_z = None
self._min_y = None
self._min_x = None
self._geometry = GeometryHelper() self._geometry = GeometryHelper()
def _position_of(self, point): def _position_of(self, point):
@ -59,36 +65,13 @@ class Polyhedron:
def _point(coordinates): def _point(coordinates):
return coordinates[0], coordinates[1], coordinates[2] return coordinates[0], coordinates[1], coordinates[2]
@staticmethod
def _ground_weird_shape(points, original, triangle=False):
x = []
y = []
xo = []
yo = []
for o in original:
xo.append(o[0])
yo.append(o[1])
for point in points:
x.append(point[0])
y.append(point[1])
x = [val - min(xo) for val in x]
y = [val - min(yo) for val in y]
if triangle:
print(len(points))
for point in range(0, len(x)):
print('point', x[point], y[point])
def _triangulate(self, surface): def _triangulate(self, surface):
Polyhedron._ground_weird_shape(surface.points, surface.points)
triangles = [] triangles = []
triangles_count = len(surface.points) - 2 triangles_count = len(surface.points) - 2
points_list = surface.points_list points_list = surface.points_list
print(points_list)
point_index = 0 point_index = 0
area = surface.area area = surface.area
print(f'area is {area}')
while len(triangles) < triangles_count: while len(triangles) < triangles_count:
print(f'try vertex {point_index}')
# select a triangle starting at point index # select a triangle starting at point index
triangle_points = ' '.join(str(e) for e in [*points_list[point_index:point_index + 9]]) triangle_points = ' '.join(str(e) for e in [*points_list[point_index:point_index + 9]])
# remove the middle vertex from previous triangle # remove the middle vertex from previous triangle
@ -97,22 +80,12 @@ class Polyhedron:
rest_surface = Surface(rest_points, remove_last=False) rest_surface = Surface(rest_points, remove_last=False)
if self._geometry.almost_same_area(area, (triangular_surface.area + rest_surface.area)): if self._geometry.almost_same_area(area, (triangular_surface.area + rest_surface.area)):
area = rest_surface.area area = rest_surface.area
print(f'ok! new area is {area}')
print('Triangle-----------------------------------------')
Polyhedron._ground_weird_shape(triangular_surface.points, surface.points)
print('rest---------------------------------------------')
Polyhedron._ground_weird_shape(rest_surface.points, surface.points)
triangles.append(triangular_surface) triangles.append(triangular_surface)
points_list = rest_surface.points_list points_list = rest_surface.points_list
if len(rest_surface.points) == 3: if len(rest_surface.points) == 3:
triangles.append(rest_surface) triangles.append(rest_surface)
point_index = 0 point_index = 0
else: else:
print(f'nok! area {(triangular_surface.area + rest_surface.area)} is not {area}')
print('Triangle-----------------------------------------')
Polyhedron._ground_weird_shape(triangular_surface.points, surface.points)
print('rest---------------------------------------------')
Polyhedron._ground_weird_shape(rest_surface.points, surface.points)
point_index = point_index + 3 point_index = point_index + 3
return triangles return triangles
@ -127,39 +100,23 @@ class Polyhedron:
for surface in self._surfaces: for surface in self._surfaces:
face = [] face = []
points = surface.points points = surface.points
if len(points) != 3: # three vertices if len(points) != 3:
print(f'Number of vertex {len(points)}')
sub_surfaces = self._triangulate(surface) sub_surfaces = self._triangulate(surface)
print(f'Transformed {len(points)} vertex into {len(sub_surfaces)} triangles')
print(f'Total area: {surface.area}')
sum_area = 0.0
for sub_surface in sub_surfaces: for sub_surface in sub_surfaces:
sum_area = sum_area + sub_surface.area
points = sub_surface.points points = sub_surface.points
for point in points: for point in points:
face.append(self._position_of(point)) face.append(self._position_of(point))
self._faces.append(face) self._faces.append(face)
print(f'Accumulated area: {sum_area}')
else: else:
for point in points: for point in points:
face.append(self._position_of(point)) face.append(self._position_of(point))
self._faces.append(face) self._faces.append(face)
return self._faces return self._faces
@property
def _cloud_mesh(self):
if self._mesh is None:
self._mesh = GeometryHelper.create_mesh(self._surfaces)
return self._mesh
@property @property
def _polyhedron_mesh(self): def _polyhedron_mesh(self):
if self._mesh is None: if self._mesh is None:
try:
print("create mesh")
self._mesh = Trimesh(vertices=self.vertices, faces=self.faces) self._mesh = Trimesh(vertices=self.vertices, faces=self.faces)
except SyntaxError:
self._mesh = self._cloud_mesh
return self._mesh return self._mesh
@property @property
@ -181,9 +138,82 @@ class Polyhedron:
Polyhedron maximal z value Polyhedron maximal z value
:return: float :return: float
""" """
bounds = self._polyhedron_mesh.bounds if self._max_z is None:
z_max = max(bounds[:, 2]) self._max_z = ConfigurationHelper().min_coordinate
return z_max for surface in self._surfaces:
for point in surface.points:
if self._max_z < point[2]:
self._max_z = point[2]
return self._max_z
@property
def max_y(self):
"""
Polyhedron maximal y value
:return: float
"""
if self._max_y is None:
self._max_y = ConfigurationHelper().min_coordinate
for surface in self._surfaces:
for point in surface.points:
if self._max_y < point[1]:
self._max_y = point[1]
return self._max_y
@property
def max_x(self):
"""
Polyhedron maximal x value
:return: float
"""
if self._max_x is None:
self._max_x = ConfigurationHelper().min_coordinate
for surface in self._surfaces:
for point in surface.points:
self._max_x = max(self._max_x, point[0])
return self._max_x
@property
def min_z(self):
"""
Polyhedron minimal z value
:return: float
"""
if self._min_z is None:
self._min_z = self.max_z
for surface in self._surfaces:
for point in surface.points:
if self._min_z > point[2]:
self._min_z = point[2]
return self._min_z
@property
def min_y(self):
"""
Polyhedron minimal y value
:return: float
"""
if self._min_y is None:
self._min_y = self.max_y
for surface in self._surfaces:
for point in surface.points:
if self._min_y > point[1]:
self._min_y = point[1]
return self._min_y
@property
def min_x(self):
"""
Polyhedron minimal x value
:return: float
"""
if self._min_x is None:
self._min_x = self.max_x
for surface in self._surfaces:
for point in surface.points:
if self._min_x > point[0]:
self._min_x = point[0]
return self._min_x
@property @property
def centroid(self): def centroid(self):
@ -191,7 +221,8 @@ class Polyhedron:
Polyhedron centroid Polyhedron centroid
:return: [x,y,z] :return: [x,y,z]
""" """
return self._polyhedron_mesh.centroid return [self.max_x - self.min_x, self.max_y - self.min_y, self.max_z - self.min_z]
def stl_export(self, full_path): def stl_export(self, full_path):
""" """

View File

@ -205,7 +205,10 @@ class Surface:
:return: float :return: float
""" """
if self._area is None: if self._area is None:
try:
self._area = self.polygon.get_area() self._area = self.polygon.get_area()
except AttributeError:
self._area = 0
return self._area return self._area
@property @property
@ -481,3 +484,7 @@ class Surface:
except Exception as err: except Exception as err:
print('Error', err) print('Error', err)
return None return None
@property
def convex(self):
return pn.Polygon.is_convex(self.polygon.points)

View File

@ -20,3 +20,4 @@ min_air_change = 0.5
[buildings] [buildings]
max_location_distance_for_shared_walls = 100.0 max_location_distance_for_shared_walls = 100.0
min_coordinate = -1.7976931348623157e+308

View File

@ -39,7 +39,7 @@ class CityGml:
'http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd" ' 'http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd" '
'xmlns="http://www.opengis.net/citygml/2.0': None, 'xmlns="http://www.opengis.net/citygml/2.0': None,
'http://www.opengis.net/citygml/2.0': None 'http://www.opengis.net/citygml/2.0': None
}, force_list=('cityObjectMember', 'curveMember', 'boundedBy', 'surfaceMember', 'CompositeSurface')) }, force_list=('cityObjectMember', 'curveMember', 'boundedBy', 'surfaceMember'))
self._city_objects = None self._city_objects = None
self._geometry = GeometryHelper() self._geometry = GeometryHelper()
for bound in self._gml['CityModel']['boundedBy']: for bound in self._gml['CityModel']['boundedBy']:
@ -80,6 +80,9 @@ class CityGml:
elif 'lod1MultiSurface' in o['Building']: elif 'lod1MultiSurface' in o['Building']:
lod += 1 lod += 1
surfaces = CityGml._lod1_multisurface(o) surfaces = CityGml._lod1_multisurface(o)
elif 'lod2MultiSurface' in o['Building']:
lod = 2
surfaces = surfaces + CityGml._lod2_multisurface(o)
else: else:
for bound in o['Building']['boundedBy']: for bound in o['Building']['boundedBy']:
surface_type = next(iter(bound)) surface_type = next(iter(bound))
@ -135,6 +138,12 @@ class CityGml:
for s in o['Building']['lod1MultiSurface']['MultiSurface']['surfaceMember']] for s in o['Building']['lod1MultiSurface']['MultiSurface']['surfaceMember']]
return surfaces return surfaces
@staticmethod
def _lod2_multisurface(o):
surfaces = [Surface(s['Polygon']['exterior']['LinearRing']['posList'])
for s in o['Building']['lod2MultiSurface']['MultiSurface']['surfaceMember']]
return surfaces
@staticmethod @staticmethod
def _lod2(bound): def _lod2(bound):
surfaces = [] surfaces = []

View File

@ -100,8 +100,15 @@ class ConfigurationHelper:
@property @property
def max_location_distance_for_shared_walls(self): def max_location_distance_for_shared_walls(self):
""" """
Configured maximal distance between Configured maximal distance between attributes to consider that they may share walls in meters
attributes to consider that they may share walls in meters
:return: float :return: float
""" """
return self._config.getfloat('buildings', 'max_location_distance_for_shared_walls') return self._config.getfloat('buildings', 'max_location_distance_for_shared_walls')
@property
def min_coordinate(self) -> float:
"""
Configured minimal coordinate value
:return: float
"""
return self._config.getfloat('buildings', 'min_coordinate')

View File

@ -28,7 +28,6 @@ class GeometryHelper:
:param location2: :param location2:
:return: Boolean :return: Boolean
""" """
print("check adjacency")
max_distance = ConfigurationHelper().max_location_distance_for_shared_walls max_distance = ConfigurationHelper().max_location_distance_for_shared_walls
x = location1[0] - location2[0] x = location1[0] - location2[0]
y = location1[1] - location2[1] y = location1[1] - location2[1]

View File

@ -24,7 +24,7 @@ class TestGeometryFactory(TestCase):
def _get_citygml(self): def _get_citygml(self):
if self._city_gml is None: if self._city_gml is None:
file_path = (self._example_path / 'EngHT_Flat_model_lod1.gml').resolve() file_path = (self._example_path / 'lod2_buildings.gml').resolve()
self._city_gml = GeometryFactory('citygml', file_path).city self._city_gml = GeometryFactory('citygml', file_path).city
self.assertIsNotNone(self._city_gml, 'city is none') self.assertIsNotNone(self._city_gml, 'city is none')
return self._city_gml return self._city_gml

View File

@ -0,0 +1,453 @@
<?xml version="1.0" encoding="UTF-8"?>
<core:CityModel xmlns:brid="http://www.opengis.net/citygml/bridge/2.0" xmlns:tran="http://www.opengis.net/citygml/transportation/2.0" xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0" xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0" xmlns:tex="http://www.opengis.net/citygml/texturedsurface/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:luse="http://www.opengis.net/citygml/landuse/2.0" xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:smil20lang="http://www.w3.org/2001/SMIL20/Language" xmlns:pbase="http://www.opengis.net/citygml/profiles/base/2.0" xmlns:smil20="http://www.w3.org/2001/SMIL20/" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0">
<gml:boundedBy>
<gml:Envelope srsName="EPSG:32191" srsDimension="3">
<gml:lowerCorner>326011.03601000085 5526362.34802 0</gml:lowerCorner>
<gml:upperCorner>329466.6600299999 5529018.72205 8.5</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<core:cityObjectMember>
<bldg:Building gml:id="BLD100086">
<gen:doubleAttribute name="Kelowna_id">
<gen:value>809144</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="Population">
<gen:value>7</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="Building_Type">
<gen:value>SFD</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="footprint_area">
<gen:value>148.17</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="footprint_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="gross_floor_area">
<gen:value>189</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="gross_floor_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:stringAttribute name="citygml_function{0}">
<gen:value>residential</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="furnace_age_base">
<gen:value>2019</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="HWT_age_base">
<gen:value>2019</gen:value>
</gen:doubleAttribute>
<bldg:function>residential</bldg:function>
<bldg:yearOfConstruction>2019</bldg:yearOfConstruction>
<bldg:roofType>flat</bldg:roofType>
<bldg:measuredHeight>5.5</bldg:measuredHeight>
<bldg:storeysAboveGround>1</bldg:storeysAboveGround>
<bldg:lod2MultiSurface>
<gml:MultiSurface srsName="EPSG:32191" srsDimension="3">
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327918.65699999966 5527620.1219999995 0 327918.65699999966 5527620.1219999995 5.5 327918.5720000006 5527617.433 5.5 327918.5720000006 5527617.433 0 327918.65699999966 5527620.1219999995 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327912.1970099993 5527620.328 0 327912.1970099993 5527620.328 5.5 327918.65699999966 5527620.1219999995 5.5 327918.65699999966 5527620.1219999995 0 327912.1970099993 5527620.328 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327911.7700100001 5527606.959000001 0 327911.7700100001 5527606.959000001 5.5 327912.1970099993 5527620.328 5.5 327912.1970099993 5527620.328 0 327911.7700100001 5527606.959000001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327923.7589999996 5527606.57701 0 327923.7589999996 5527606.57701 5.5 327911.7700100001 5527606.959000001 5.5 327911.7700100001 5527606.959000001 0 327923.7589999996 5527606.57701 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327924.1219900008 5527617.968 0 327924.1219900008 5527617.968 5.5 327923.7589999996 5527606.57701 5.5 327923.7589999996 5527606.57701 0 327924.1219900008 5527617.968 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327920.45799 5527618.085000001 0 327920.45799 5527618.085000001 5.5 327924.1219900008 5527617.968 5.5 327924.1219900008 5527617.968 0 327920.45799 5527618.085000001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327918.5720000006 5527617.433 0 327918.5720000006 5527617.433 5.5 327920.45799 5527618.085000001 5.5 327920.45799 5527618.085000001 0 327918.5720000006 5527617.433 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327918.65699999966 5527620.1219999995 5.5 327912.1970099993 5527620.328 5.5 327911.7700100001 5527606.959000001 5.5 327923.7589999996 5527606.57701 5.5 327924.1219900008 5527617.968 5.5 327920.45799 5527618.085000001 5.5 327918.5720000006 5527617.433 5.5 327918.65699999966 5527620.1219999995 5.5</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:Building>
</core:cityObjectMember>
<core:cityObjectMember>
<bldg:Building gml:id="BLD100087">
<gen:doubleAttribute name="Kelowna_id">
<gen:value>809157</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="Population">
<gen:value>7</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="Building_Type">
<gen:value>SFD</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="footprint_area">
<gen:value>147.58</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="footprint_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="gross_floor_area">
<gen:value>201</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="gross_floor_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:stringAttribute name="citygml_function{0}">
<gen:value>residential</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="furnace_age_base">
<gen:value>2019</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="HWT_age_base">
<gen:value>2019</gen:value>
</gen:doubleAttribute>
<bldg:function>residential</bldg:function>
<bldg:yearOfConstruction>2019</bldg:yearOfConstruction>
<bldg:roofType>flat</bldg:roofType>
<bldg:measuredHeight>7</bldg:measuredHeight>
<bldg:storeysAboveGround>2</bldg:storeysAboveGround>
<bldg:lod2MultiSurface>
<gml:MultiSurface srsName="EPSG:32191" srsDimension="3">
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327903.1820100006 5527620.4350000005 0 327903.1820100006 5527620.4350000005 7 327903.13698999956 5527617.434 7 327903.13698999956 5527617.434 0 327903.1820100006 5527620.4350000005 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327896.92998999916 5527620.528000001 0 327896.92998999916 5527620.528000001 7 327903.1820100006 5527620.4350000005 7 327903.1820100006 5527620.4350000005 0 327896.92998999916 5527620.528000001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327896.716 5527606.1899999995 0 327896.716 5527606.1899999995 7 327896.92998999916 5527620.528000001 7 327896.92998999916 5527620.528000001 0 327896.716 5527606.1899999995 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327904.02800000086 5527606.081 0 327904.02800000086 5527606.081 7 327896.716 5527606.1899999995 7 327896.716 5527606.1899999995 0 327904.02800000086 5527606.081 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327907.9790000003 5527606.880999999 0 327907.9790000003 5527606.880999999 7 327904.02800000086 5527606.081 7 327904.02800000086 5527606.081 0 327907.9790000003 5527606.880999999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327908.15699999966 5527618.875 0 327908.15699999966 5527618.875 7 327907.9790000003 5527606.880999999 7 327907.9790000003 5527606.880999999 0 327908.15699999966 5527618.875 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327905.10500000045 5527618.92 0 327905.10500000045 5527618.92 7 327908.15699999966 5527618.875 7 327908.15699999966 5527618.875 0 327905.10500000045 5527618.92 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327905.08299 5527617.404999999 0 327905.08299 5527617.404999999 7 327905.10500000045 5527618.92 7 327905.10500000045 5527618.92 0 327905.08299 5527617.404999999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327903.13698999956 5527617.434 0 327903.13698999956 5527617.434 7 327905.08299 5527617.404999999 7 327905.08299 5527617.404999999 0 327903.13698999956 5527617.434 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>327903.1820100006 5527620.4350000005 7 327896.92998999916 5527620.528000001 7 327896.716 5527606.1899999995 7 327904.02800000086 5527606.081 7 327907.9790000003 5527606.880999999 7 327908.15699999966 5527618.875 7 327905.10500000045 5527618.92 7 327905.08299 5527617.404999999 7 327903.13698999956 5527617.434 7 327903.1820100006 5527620.4350000005 7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:Building>
</core:cityObjectMember>
<core:cityObjectMember>
<bldg:Building gml:id="BLD101974">
<gen:doubleAttribute name="Kelowna_id">
<gen:value>182978</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="Population">
<gen:value>47</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="Building_Type">
<gen:value>MURB</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="footprint_area">
<gen:value>646.8</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="footprint_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="gross_floor_area">
<gen:value>1940</gen:value>
</gen:doubleAttribute>
<gen:stringAttribute name="gross_floor_area_unit">
<gen:value>m2</gen:value>
</gen:stringAttribute>
<gen:stringAttribute name="citygml_function{0}">
<gen:value>residential</gen:value>
</gen:stringAttribute>
<gen:doubleAttribute name="furnace_age_base">
<gen:value>1974</gen:value>
</gen:doubleAttribute>
<gen:doubleAttribute name="HWT_age_base">
<gen:value>1974</gen:value>
</gen:doubleAttribute>
<bldg:function>residential</bldg:function>
<bldg:yearOfConstruction>1974</bldg:yearOfConstruction>
<bldg:roofType>flat</bldg:roofType>
<bldg:measuredHeight>8.5</bldg:measuredHeight>
<bldg:storeysAboveGround>3</bldg:storeysAboveGround>
<bldg:lod2MultiSurface>
<gml:MultiSurface srsName="EPSG:32191" srsDimension="3">
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328066.44198999926 5528221.52698 0 328066.44198999926 5528221.52698 8.5 328066.37298999913 5528218.87403 8.5 328066.37298999913 5528218.87403 0 328066.44198999926 5528221.52698 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328062.64898999967 5528221.625979999 0 328062.64898999967 5528221.625979999 8.5 328066.44198999926 5528221.52698 8.5 328066.44198999926 5528221.52698 0 328062.64898999967 5528221.625979999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328062.5769999996 5528218.872020001 0 328062.5769999996 5528218.872020001 8.5 328062.64898999967 5528221.625979999 8.5 328062.64898999967 5528221.625979999 0 328062.5769999996 5528218.872020001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328054.4609999992 5528219.083009999 0 328054.4609999992 5528219.083009999 8.5 328062.5769999996 5528218.872020001 8.5 328062.5769999996 5528218.872020001 0 328054.4609999992 5528219.083009999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328054.00298999995 5528198.384 0 328054.00298999995 5528198.384 8.5 328054.4609999992 5528219.083009999 8.5 328054.4609999992 5528219.083009999 0 328054.00298999995 5528198.384 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328054.8479900006 5528192.8129900005 0 328054.8479900006 5528192.8129900005 8.5 328054.00298999995 5528198.384 8.5 328054.00298999995 5528198.384 0 328054.8479900006 5528192.8129900005 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328053.9679899998 5528187.125 0 328053.9679899998 5528187.125 8.5 328054.8479900006 5528192.8129900005 8.5 328054.8479900006 5528192.8129900005 0 328053.9679899998 5528187.125 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328062.03800000064 5528186.91501 0 328062.03800000064 5528186.91501 8.5 328053.9679899998 5528187.125 8.5 328053.9679899998 5528187.125 0 328062.03800000064 5528186.91501 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328061.9790100008 5528184.657989999 0 328061.9790100008 5528184.657989999 8.5 328062.03800000064 5528186.91501 8.5 328062.03800000064 5528186.91501 0 328061.9790100008 5528184.657989999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328065.91500999965 5528184.55601 0 328065.91500999965 5528184.55601 8.5 328061.9790100008 5528184.657989999 8.5 328061.9790100008 5528184.657989999 0 328065.91500999965 5528184.55601 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328065.9790100008 5528187.00299 0 328065.9790100008 5528187.00299 8.5 328065.91500999965 5528184.55601 8.5 328065.91500999965 5528184.55601 0 328065.9790100008 5528187.00299 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328074.1480100006 5528186.79001 0 328074.1480100006 5528186.79001 8.5 328065.9790100008 5528187.00299 8.5 328065.9790100008 5528187.00299 0 328074.1480100006 5528186.79001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328073.75799999945 5528197.550000001 0 328073.75799999945 5528197.550000001 8.5 328074.1480100006 5528186.79001 8.5 328074.1480100006 5528186.79001 0 328073.75799999945 5528197.550000001 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328074.43600999936 5528201.869999999 0 328074.43600999936 5528201.869999999 8.5 328073.75799999945 5528197.550000001 8.5 328073.75799999945 5528197.550000001 0 328074.43600999936 5528201.869999999 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328074.7179899998 5528218.65601 0 328074.7179899998 5528218.65601 8.5 328074.43600999936 5528201.869999999 8.5 328074.43600999936 5528201.869999999 0 328074.7179899998 5528218.65601 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328066.37298999913 5528218.87403 0 328066.37298999913 5528218.87403 8.5 328074.7179899998 5528218.65601 8.5 328074.7179899998 5528218.65601 0 328066.37298999913 5528218.87403 0</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>328066.44198999926 5528221.52698 8.5 328062.64898999967 5528221.625979999 8.5 328062.5769999996 5528218.872020001 8.5 328054.4609999992 5528219.083009999 8.5 328054.00298999995 5528198.384 8.5 328054.8479900006 5528192.8129900005 8.5 328053.9679899998 5528187.125 8.5 328062.03800000064 5528186.91501 8.5 328061.9790100008 5528184.657989999 8.5 328065.91500999965 5528184.55601 8.5 328065.9790100008 5528187.00299 8.5 328074.1480100006 5528186.79001 8.5 328073.75799999945 5528197.550000001 8.5 328074.43600999936 5528201.869999999 8.5 328074.7179899998 5528218.65601 8.5 328066.37298999913 5528218.87403 8.5 328066.44198999926 5528221.52698 8.5</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</bldg:lod2MultiSurface>
</bldg:Building>
</core:cityObjectMember>
</core:CityModel>

View File

@ -795,20 +795,6 @@
</gml:exterior> </gml:exterior>
</gml:Polygon> </gml:Polygon>
</gml:surfaceMember> </gml:surfaceMember>
<gml:surfaceMember>
<gml:Polygon gml:id="UUID_a52ecdbc-9a33-4d69-9306-fe6edcbb7d3d">
<gml:exterior>
<gml:LinearRing gml:id="UUID_e504f144-5baf-4dd9-bd7d-503297a02635">
<gml:posList>296846.760109 5041420.154931 125.439000 296846.760109 5041420.154931 125.439074 </gml:posList>
</gml:LinearRing>
</gml:exterior>
<gml:interior>
<gml:LinearRing gml:id="UUID_7e25aba2-fe9c-41ee-a234-7bcc1ba2e044">
<gml:posList>296845.859131 5041420.726167 125.439000 296846.760109 5041420.154931 125.439000 296845.859131 5041420.726167 125.439000 </gml:posList>
</gml:LinearRing>
</gml:interior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember> <gml:surfaceMember>
<gml:Polygon gml:id="UUID_6ec30c7f-23be-4e65-a30f-cab03eea2be5"> <gml:Polygon gml:id="UUID_6ec30c7f-23be-4e65-a30f-cab03eea2be5">
<gml:exterior> <gml:exterior>
@ -3434,6 +3420,8 @@
</bldg:lod2MultiSurface> </bldg:lod2MultiSurface>
</bldg:RoofSurface> </bldg:RoofSurface>
</bldg:boundedBy> </bldg:boundedBy>
<yearOfConstruction>2050</yearOfConstruction>
<function>W4</function>
</bldg:Building> </bldg:Building>
</cityObjectMember> </cityObjectMember>
@ -10207,6 +10195,8 @@
</bldg:lod2MultiSurface> </bldg:lod2MultiSurface>
</bldg:RoofSurface> </bldg:RoofSurface>
</bldg:boundedBy> </bldg:boundedBy>
<yearOfConstruction>2050</yearOfConstruction>
<function>W4</function>
</bldg:Building> </bldg:Building>
</cityObjectMember> </cityObjectMember>
<gml:boundedBy> <gml:boundedBy>