JTS3DMap / app.py
JanuaryDesk's picture
add sub map support
410319c
raw
history blame contribute delete
No virus
6.84 kB
# Hugging Face Hack
import subprocess
import os
dotnet_check_command = "dotnet --list-sdks"
dotnet_install_commands = [
"wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh",
"chmod +x ./dotnet-install.sh",
"./dotnet-install.sh --version latest"
]
try:
print(subprocess.check_output(dotnet_check_command, shell=True))
except:
print(os.environ["PATH"])
print("Try to install .net dependency")
for command in dotnet_install_commands:
os.system(command)
os.environ["PATH"] += os.pathsep + "/home/user/.dotnet"
print(os.environ["PATH"])
os.system(dotnet_check_command)
# print(subprocess.check_output("dotnet -list-sdk"))
import gradio as gr
# Setup Python.Net
from pythonnet import load
load("coreclr", runtime_config="lib/JTSParser.runtimeconfig.json")
import clr
from System import Reflection
import os
lib_path = os.path.abspath("lib/JTSParser.dll")
Reflection.Assembly.LoadFile(lib_path)
from YYZ import JTS
# App
import numpy as np
import plotly.graph_objects as go
import plotly
print(f"plotly_version={plotly.__version__}")
import math
def dock(x, limit):
x1 = math.floor(x)
yield x1
x2 = min(math.ceil(x), limit)
if x2 != x1:
yield x2
default_path = "JTS_assets/ridge.map"
road_names_map = {
"NB": ["Path", "Road", "Pike", "Rail"],
"CWB": ["Trail", "Road", "Pike", "Rail"],
"PZC": ["Trail", "Secondary", "Primary", "Rail"]
}
with gr.Blocks(analytics_enabled=False) as demo:
with gr.Row():
with gr.Column(scale=1):
plot_button = gr.Button("Plot")
with gr.Row():
file_input = gr.File(default_path, label="Map File (NB/CWB/PZC)", file_types=[".map"])
sub_file_input = gr.File(label="Sub Map File (optional)", file_types=[".map"])
code_dropdown = gr.Dropdown(choices=["NB", "CWB", "PZC"], value="NB", label="Series")
labels_checkbox = gr.Checkbox(True, label="Labels")
labels_size_threshold_number = gr.Number(0, label="Label Size Threshold", info="1 => Tactical, 2 => Normal, 3 => Important")
# with gr.Row():
with gr.Accordion("Roads"):
with gr.Row():
path_checkbox = gr.Checkbox(label="Path/Trail")
road_checkbox = gr.Checkbox(label="Road/Secondary")
pike_checkbox = gr.Checkbox(True, label="Pike/Primary")
railway_checkbox = gr.Checkbox(True, label="Rail")
with gr.Row():
road_offset_number = gr.Number(0.3, label="Road Offset")
elevation_scale_number = gr.Number(0.1, label="Elevation Scale")
with gr.Column(scale=2):
output_plot = gr.Plot()
def plot(data):
with open(data[file_input].name) as f:
map_str = f.read()
code = data[code_dropdown]
map_file = JTS.JTSParser.FromCode(code).ParseMap(map_str, False)
if data[sub_file_input]:
with open(data[sub_file_input].name) as f:
sub_map_str = f.read()
sub_map_file = JTS.SubMapFile()
sub_map_file.Extract(sub_map_str)
sub_map_file.ApplyTo(map_file)
network = JTS.HexNetwork.FromMapFile(map_file)
height_mat = np.empty([map_file.Height, map_file.Width])
for i in range(map_file.Height):
for j in range(map_file.Width):
height_mat[i,j] = network.HexMat[i, j].Height
surface = go.Surface(
x = np.arange(map_file.Width),
y = np.arange(map_file.Height),
z = height_mat
)
gl = []
road_offset = data[road_offset_number]
road_items = [
(path_checkbox, 'gray'),
(road_checkbox, 'green'),
(pike_checkbox, 'pink'),
(railway_checkbox, 'black')
]
for road_idx, (checkbox, color) in enumerate(road_items):
road_name = road_names_map[code][road_idx]
road_type = map_file.CurrentTerrainSystem.Road.GetValue(road_name)
if data[checkbox]:
for road in network.SimplifyRoad(road_type):
x_line = []
y_line = []
z_line = []
for node in road:
x_line.append(node.X)
y_line.append(node.Y)
z_line.append(node.Height + road_offset)
g = go.Scatter3d(
x=x_line, y=y_line, z=z_line,
line=dict(
color=color,
width=2
)
)
gl.append(g)
fig = go.Figure([surface] + gl)
scene = {
"aspectratio": {"x": 1, "y": 1, "z": data[elevation_scale_number]},
'yaxis': {'autorange': 'reversed'},
}
if data[labels_checkbox]:
labels_x = []
labels_y = []
labels_z = []
labels_text = []
for label in map_file.Labels:
if label.Size >= data[labels_size_threshold_number]:
max_height = -1
x = label.X
y = label.Y
for dx in dock(x, map_file.Width-1):
for dy in dock(y, map_file.Height-1):
max_height = max(max_height, map_file.HeightMap[dy, dx])
labels_x.append(x)
labels_y.append(y)
labels_z.append(max_height)
labels_text.append(label.Name)
scene["annotations"] = [
dict(
showarrow=False,
x=x,
y=y,
z=z,
text=text,
xanchor="left",
xshift=10,
opacity=0.7,
bgcolor="white"
)
for x, y, z, text in zip(labels_x, labels_y, labels_z, labels_text)
]
fig.update_layout(scene=scene, showlegend=False)
return {output_plot: fig}
plot_button.click(plot, {file_input, sub_file_input, code_dropdown,
labels_checkbox, labels_size_threshold_number,
path_checkbox, road_checkbox, pike_checkbox, railway_checkbox,
elevation_scale_number, road_offset_number}, {output_plot})
# plot_button.click(lambda data: {output_img: test()}, {file_input, path_checkbox, road_checkbox, pike_checkbox, plot_button}, {output_img})
if __name__ == "__main__":
demo.launch()