-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcityPlot.py
54 lines (41 loc) · 1.3 KB
/
cityPlot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import click
import json
import numpy as np
from cityjson import to_triangulated_polydata
import pyvista as pv
from tqdm import tqdm
@click.command()
@click.argument("input", type=click.File("rb"))
@click.option("--save", flag_value=True)
def main(input, save):
cm = json.load(input)
if "transform" in cm:
s = cm["transform"]["scale"]
t = cm["transform"]["translate"]
verts = [[v[0] * s[0] + t[0], v[1] * s[1] + t[1], v[2] * s[2] + t[2]]
for v in cm["vertices"]]
else:
verts = cm["vertices"]
lods = set([geom["lod"] for obj in cm["CityObjects"]
for geom in cm["CityObjects"][obj]["geometry"]])
if len(lods) > 1:
lod = click.prompt("Select an LoD:", click.Choice(lods))
else:
lod = str(list(lods)[0])
# mesh points
vertices = np.array(verts)
p = pv.Plotter()
meshes = []
for obj in tqdm(cm["CityObjects"]):
co = cm["CityObjects"][obj]
for geom in co["geometry"]:
if str(geom["lod"]) == lod:
mesh = to_triangulated_polydata(geom, vertices)
meshes.append(mesh)
p.add_mesh(mesh)
p.show()
if save:
block = pv.MultiBlock(meshes)
block.save("cm.vtm")
if __name__ == "__main__":
main()