Skip to content

Commit

Permalink
Solved Flake8 issues in 3d/bag_ahn2 scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
fsteggink committed Mar 8, 2018
1 parent fa851a0 commit 46ea163
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 117 deletions.
47 changes: 19 additions & 28 deletions 3d/bag_ahn2/src/cityGmlExporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
BLDG = "{%s}" % BLDG_NS
APP_NS = "http://www.opengis.net/citygml/appearance/1.0"
APP = "{%s}" % APP_NS
NSMAP = {None: CGML_NS, "gml": GML_NS, "bldg": BLDG_NS, "app": APP_NS}
NSMAP2 = {"gml": GML_NS, "bldg": BLDG_NS, "app": APP_NS}
NSMAP = {None: CGML_NS, "gml": GML_NS, "bldg": BLDG_NS, "app": APP_NS}
NSMAP2 = {"gml": GML_NS, "bldg": BLDG_NS, "app": APP_NS}


class CityGmlExporter(ThreeDExporter):
Expand All @@ -34,31 +34,30 @@ def __init__(self):

etree.SubElement(self.root, GML + "name").text = "BAG 3D"
self.bnd = etree.SubElement(self.root, GML + "boundedBy")

self.min_height = float("inf")
self.max_height = float("-inf")


# Voegt een gebouw toe aan de exporter
def addBuilding(self, id, poly, min_height, avg_height):
# Create a building
com = etree.SubElement(self.root, CGML + "cityObjectMember")
building = etree.SubElement(com, BLDG + "Building")
building.set(GML + "id", "g" + str(id))

# Add walls: two subsequent coordinates are used to construct a wall face.
# A WallSurface is generated for each ring in the geometry.
reduce(lambda building, ring: self.boundedBy(building, "WallSurface", map(functools.partial(self.createWallPoly, avg_height, min_height), zip(ring, ring[1:]))), poly, building)

mapFunc = functools.partial(self.createWallPoly, avg_height, min_height)
reduce(lambda building, ring: self.boundedBy(building, "WallSurface", map(mapFunc, zip(ring, ring[1:]))), poly, building)

# Add roof; after replacing the height
roofRings = map(lambda ring: map(lambda c: [c[0], c[1], avg_height], ring), poly)
self.boundedBy(building, "RoofSurface", [roofRings])

if min_height < self.min_height:
self.min_height = min_height
if avg_height > self.max_height:
self.max_height = avg_height


# Exporteert de data die de exporter bevat
def exportData(self, bbox, crs, centerOnOrigin):
Expand All @@ -71,59 +70,51 @@ def exportData(self, bbox, crs, centerOnOrigin):
bbox[1] -= centerY
bbox[2] -= centerX
bbox[3] -= centerY

env = etree.SubElement(self.bnd, GML + "Envelope", srsName="EPSG:%d" % crs)
etree.SubElement(env, GML + "pos", srsDimension="3").text = "%.3f %.3f %.3f" % (bbox[0], bbox[1], self.min_height)
etree.SubElement(env, GML + "pos", srsDimension="3").text = "%.3f %.3f %.3f" % (bbox[2], bbox[3], self.max_height)

print(etree.tostring(self.root, pretty_print=True))

print(etree.tostring(self.root, pretty_print=True))

# Creates a posList string based on the given coordinates
# Creates a posList string based on the given coordinates
def posList(self, coords):
return reduce(lambda txt, c: txt + " %.3f %.3f %.3f" % (c[0], c[1], c[2] if len(c)>=3 else 0 ), coords, "").strip()
return reduce(lambda txt, c: txt + " %.3f %.3f %.3f" % (c[0], c[1], c[2] if len(c) >= 3 else 0), coords, "").strip()


# Creates a LinearRing geometry, and adds it to the parent
def linearRing(self, parent, ring):
lrng = etree.SubElement(parent, GML + "LinearRing")
plst = etree.SubElement(lrng, GML + "posList", srsDimension="3")
plst = etree.SubElement(lrng, GML + "posList", srsDimension="3")
plst.text = self.posList(ring)


# Creates a Polygon geometry, and adds it to the parent
# Creates a Polygon geometry, and adds it to the parent
def polygon(self, parent, rings):
pol = etree.SubElement(parent, GML + "Polygon")
ext = etree.SubElement(pol, GML + "exterior")
self.linearRing(ext, rings[0])

for ring in rings[1:]:
int = etree.SubElement(pol, GML + "interior")
self.linearRing(int, ring)


# Creates a LoD 2 multisurface geometry, and adds it to the parent
# Creates a LoD 2 multisurface geometry, and adds it to the parent
def multiSurface(self, parent, surfaces):
msf = etree.SubElement(parent, GML + "MultiSurface")

for surface in surfaces:
sfm = etree.SubElement(msf, GML + "surfaceMember")
#osf = etree.SubElement(sfm, GML + "OrientableSurface", orientation="+")
#bsf = etree.SubElement(osf, GML + "baseSurface")
self.polygon(sfm, surface)


# Adds a bounding surface to a building
# Adds a bounding surface to a building
def boundedBy(self, building, surfaceType, surfaces):
bnd = etree.SubElement(building, BLDG + "boundedBy")
srf = etree.SubElement(bnd, BLDG + surfaceType)
lod2msf = etree.SubElement(srf, BLDG + "lod2MultiSurface")
self.multiSurface(lod2msf, surfaces)
return building


# Creates a wall polygon constructed from two floor coordinates, the floor height, and the roof height
def createWallPoly(self, height_r, height_i, c2):
c0 = c2[0]
c1 = c2[1]
return [[(c0[0],c0[1],height_i),(c1[0],c1[1],height_i),(c1[0],c1[1],height_r),(c0[0],c0[1],height_r),(c0[0],c0[1],height_i)]]
return [[(c0[0], c0[1], height_i), (c1[0], c1[1], height_i), (c1[0], c1[1], height_r), (c0[0], c0[1], height_r), (c0[0], c0[1], height_i)]]
76 changes: 39 additions & 37 deletions 3d/bag_ahn2/src/exportBuildings.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
# Constanten
CRS = 28992


# Maakt een nieuwe exporter aan (factory method)
def createExporter(exporterType, crs):
if exporterType == 'Wavefront OBJ':
Expand All @@ -35,17 +35,17 @@ def createExporter(exporterType, crs):
else:
from ogrExporter import OgrExporter
return OgrExporter(exporterType, crs)

raise NameError('Exporter type %s is niet geimplementeerd' % exporterType)


# Maakt een object aan voor het gegeven record, waarbij de beschrijving van de cursor wordt gebruikt
class reg(object):
def __init__(self, cursor, record):
for (attr, val) in zip((d[0] for d in cursor.description), record) :
for (attr, val) in zip((d[0] for d in cursor.description), record):
setattr(self, attr, val)


# Converteert een WKT-polygoon naar een polygoon-object. Dit is een lijst van ringen. Een ring is een lijst van
# coordinaten, welke op hun beurt bestaan uit een lijst van ordinaten [x, y, [z]], wat floats zijn.
def wktToPoly(wkt):
Expand All @@ -55,88 +55,90 @@ def wktToPoly(wkt):
pos1 = wkt.find("((") + 2
pos2 = wkt.find("))")
rings = wkt[pos1:pos2].split("),(")

return map(lambda ring: map(lambda o: map(lambda n: float(n), o.split(" ")), ring.split(",")), rings)


# Controleert of er geldige argumenten opgegeven zijn
def checkArgs(args):

if not args.format in ['Wavefront OBJ', 'CityGML']:
if args.format not in ['Wavefront OBJ', 'CityGML']:
from osgeo import ogr
if ogr.GetDriverByName(args.format) == None:
if ogr.GetDriverByName(args.format) is None:
sys.stderr.write('Het opgegeven outputformaat is niet herkend\n')
return False

# Controleer of de bounding box geldig is
if args.bbox[0] >= args.bbox[2] or args.bbox[1] >= args.bbox[3]:
sys.stderr.write('De opgegeven bounding box is ongeldig\n')
return False

# Controleer of er verbinding met de database gemaakt kan worden
connStr = "host=%s port=%d dbname=%s user=%s password=%s" % (args.pg_host, args.pg_port, args.pg_db, args.pg_user, args.pg_pass)
conn = psycopg2.connect(connStr)

# Controleer of de opgegeven tabel gevonden kan worden en de juiste kolommen bevat
query = "select identificatie, geovlak, min_height, avg_height from %s.%s limit 0" % (args.pg_schema, args.pg_table)
cur = conn.cursor()
cur.execute(query)

cur.close()
conn.close()

return True


def moveToOrigin(poly, centerX, centerY):
for r in range(len(poly)):
ring = poly[r]
for v in range(len(ring)):
ring[v][0] -= centerX
ring[v][1] -= centerY

poly[r] = ring

return poly


# Verwerkt de gebouwen binnen de opgegeven bounding box
def processBuildings(args):
exporter = createExporter(args.format, args.ogr_tsrs)

lineString = "LINESTRING(%d %d,%d %d)" % (args.bbox[0], args.bbox[1], args.bbox[2], args.bbox[3])

if args.ogr_tsrs == 28992:
geom = "st_astext(ST_Force_2D(geovlak))"
else:
geom = "st_astext(st_transform(ST_Force_2D(geovlak), %d))" % args.ogr_tsrs
query = "select identificatie, %s geom, min_height, avg_height from %s.%s p where st_intersects(geovlak, st_envelope(st_linefromtext('%s', %d)))" % (geom, args.pg_schema, args.pg_table, lineString, CRS)

queryTpl = "select identificatie, %s geom, min_height, avg_height from %s.%s p where st_intersects(geovlak, st_envelope(st_linefromtext('%s', %d)))"
query = queryTpl % (geom, args.pg_schema, args.pg_table, lineString, CRS)

connStr = "host=%s port=%d dbname=%s user=%s password=%s" % (args.pg_host, args.pg_port, args.pg_db, args.pg_user, args.pg_pass)
conn = psycopg2.connect(connStr)
cur = conn.cursor()
cur.execute(query)

centerX = (args.bbox[0] + args.bbox[2]) / 2.0
centerY = (args.bbox[1] + args.bbox[3]) / 2.0

for record in cur:
r = reg(cur, record)
poly = wktToPoly(r.geom)

if args.centerOnOrigin:
poly = moveToOrigin(poly, centerX, centerY)
if r.min_height > -15 and r.avg_height > -15:

if r.min_height > -15 and r.avg_height > -15:
exporter.addBuilding(r.identificatie, poly, r.min_height, r.avg_height)

cur.close()
conn.close()

exporter.exportData(args.bbox, CRS, args.centerOnOrigin)


def main():

def main():
# Samenstellen command line parameters
argparser = argparse.ArgumentParser(description='Exporteer gebouwen naar 3D')
argparser.add_argument('--format', type=str, dest='format', help='Outputformaat', required=True)
Expand All @@ -145,27 +147,27 @@ def main():

# Database verbindingsparameters
# TODO: settings file?
argparser.add_argument('--pg_host', type=str, dest='pg_host', default='localhost', help='PostgreSQL server host (default: localhost)')
argparser.add_argument('--pg_port', type=int, dest='pg_port', default='5432', help='PostgreSQL server poort (default: 5432)')
argparser.add_argument('--pg_db', type=str, dest='pg_db', default='bag', help='PostgreSQL database (default: bag)')
argparser.add_argument('--pg_schema', type=str, dest='pg_schema', default='public', help='PostgreSQL schema (default: public)')
argparser.add_argument('--pg_user', type=str, dest='pg_user', required=True, help='PostgreSQL gebruikersnaam')
argparser.add_argument('--pg_password', type=str, dest='pg_pass', required=True, help='PostgreSQL wachtwoord')
argparser.add_argument('--pg_table', type=str, dest='pg_table', required=True, help='PostgreSQL tabel')
argparser.add_argument('--pg_host', type=str, dest='pg_host', default='localhost', help='PostgreSQL server host (default: localhost)')
argparser.add_argument('--pg_port', type=int, dest='pg_port', default='5432', help='PostgreSQL server poort (default: 5432)')
argparser.add_argument('--pg_db', type=str, dest='pg_db', default='bag', help='PostgreSQL database (default: bag)')
argparser.add_argument('--pg_schema', type=str, dest='pg_schema', default='public', help='PostgreSQL schema (default: public)')
argparser.add_argument('--pg_user', type=str, dest='pg_user', required=True, help='PostgreSQL gebruikersnaam')
argparser.add_argument('--pg_password', type=str, dest='pg_pass', required=True, help='PostgreSQL wachtwoord')
argparser.add_argument('--pg_table', type=str, dest='pg_table', required=True, help='PostgreSQL tabel')

# OGR parameters
argparser.add_argument('--ogr_tsrs', type=int, dest='ogr_tsrs', default=28992, help='EPSG-identifer data (default: 28992)')
argparser.add_argument('--ogr_tsrs', type=int, dest='ogr_tsrs', default=28992, help='EPSG-identifer data (default: 28992)')

argparser.set_defaults(centerOnOrigin=False)

args = argparser.parse_args()
if not checkArgs(args):
sys.exit(1)

processBuildings(args)

return


if __name__ == "__main__":
main()
30 changes: 13 additions & 17 deletions 3d/bag_ahn2/src/ogrExporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def __init__(self, driver, crs):

# Maak de spatial reference aan
outSpatialRef = osr.SpatialReference()
outSpatialRef.ImportFromEPSG(crs)
outSpatialRef.ImportFromEPSG(crs)

# Maak de output datasource aan
self.outDataSource = outDriver.CreateDataSource(outFile)
Expand All @@ -25,50 +25,48 @@ def __init__(self, driver, crs):
# Voeg een ID-veld toe
idField = ogr.FieldDefn("id", ogr.OFTString)
self.outLayer.CreateField(idField)


def __del__(self):
self.outDataSource.Destroy()

def __del__(self):
self.outDataSource.Destroy()

# Voegt een gebouw toe aan de exporter
def addBuilding(self, id, poly, min_height, avg_height):

# Rond de decimalen van de hoogten af
min_height = round(min_height, 3)
avg_height = round(avg_height, 3)

# Stel de multipolygon samen
# Deze bestaat uit een dak-polygon, vloer-polygon en meerdere muur-polygonen
mPoly = ogr.Geometry(ogr.wkbMultiPolygon)

rPoly = ogr.Geometry(ogr.wkbPolygon)
fPoly = ogr.Geometry(ogr.wkbPolygon)
for r in range(len(poly)):
ring = poly[r]
rRing = ogr.Geometry(ogr.wkbLinearRing)
fRing = ogr.Geometry(ogr.wkbLinearRing)

for p in range(len(ring)):
point = ring[p]
rRing.AddPoint(point[0], point[1], avg_height)
fRing.AddPoint(point[0], point[1], min_height)

if p > 0:
# Muur toevoegen
wPoly = ogr.Geometry(ogr.wkbPolygon)
wRing = ogr.Geometry(ogr.wkbLinearRing)
wRing.AddPoint(ring[p-1][0], ring[p-1][1], min_height)
wRing.AddPoint(ring[p - 1][0], ring[p - 1][1], min_height)
wRing.AddPoint(ring[p][0], ring[p][1], min_height)
wRing.AddPoint(ring[p][0], ring[p][1], avg_height)
wRing.AddPoint(ring[p-1][0], ring[p-1][1], avg_height)
wRing.AddPoint(ring[p-1][0], ring[p-1][1], min_height)
wRing.AddPoint(ring[p - 1][0], ring[p - 1][1], avg_height)
wRing.AddPoint(ring[p - 1][0], ring[p - 1][1], min_height)
wPoly.AddGeometry(wRing)
mPoly.AddGeometry(wPoly)

rPoly.AddGeometry(rRing)
fPoly.AddGeometry(fRing)

mPoly.AddGeometry(rPoly)
mPoly.AddGeometry(fPoly)

Expand All @@ -78,9 +76,7 @@ def addBuilding(self, id, poly, min_height, avg_height):
feature.SetGeometry(mPoly)
feature.SetField("id", str(id))
self.outLayer.CreateFeature(feature)


# Exporteert de data die de exporter bevat
def exportData(self, bbox, crs, centerOnOrigin):
pass

1 change: 0 additions & 1 deletion 3d/bag_ahn2/src/threeDExporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class ThreeDExporter:
@abstractmethod
def addBuilding(self, id, poly, min_height, avg_height):
pass


# Exporteert de data die de exporter bevat
@abstractmethod
Expand Down

0 comments on commit 46ea163

Please sign in to comment.