import os from pathlib import Path import shutil from typing import Callable, Optional, Union, cast # import leafmap import textwrap import leafmap.kepler as leafmap import solara from leafmap.toolbar import change_basemap from solara.components.file_drop import FileInfo from dcascade import main as dcascade_main zoom = solara.reactive(2) center = solara.reactive((20, 0)) config = {'version': 'v1', 'config': {'visState': {'filters': [{'dataId': ['Discharge'], 'id': '58woufh3', 'name': ['ts'], 'type': 'range', 'value': [0, 1.68], ###time change here 'enlarged': False, 'plotType': 'histogram', 'animationWindow': 'free', 'yAxis': None, 'speed': 1}], 'layers': [{'id': 'lqz57i8', 'type': 'geojson', 'config': {'dataId': 'Discharge', 'label': 'Discharge', 'color': [18, 147, 154], 'highlightColor': [252, 242, 26, 255], 'columns': {'geojson': '_geojson'}, 'isVisible': True, 'visConfig': {'opacity': 0.8, 'strokeOpacity': 0.3, 'thickness': 1, 'strokeColor': [210, 0, 0], 'colorRange': {'name': 'Global Warming', 'type': 'sequential', 'category': 'Uber', 'colors': ['#5A1846', '#900C3F', '#C70039', '#E3611C', '#F1920E', '#FFC300']}, 'strokeColorRange': {'name': 'Ice And Fire', 'type': 'diverging', 'category': 'Uber', 'colors': ['#0198BD', '#49E3CE', '#E8FEB5', '#FEEDB1', '#FEAD54', '#D50255']}, 'radius': 10, 'sizeRange': [0, 10], 'radiusRange': [0, 50], 'heightRange': [0, 500], 'elevationScale': 5, 'enableElevationZoomFactor': True, 'stroked': True, 'filled': False, 'enable3d': False, 'wireframe': False}, 'hidden': False, 'textLabel': [{'field': None, 'color': [255, 255, 255], 'size': 18, 'offset': [0, 0], 'anchor': 'start', 'alignment': 'center'}]}, 'visualChannels': {'colorField': None, 'colorScale': 'quantile', 'strokeColorField': {'name': 'Discharge', 'type': 'real'}, 'strokeColorScale': 'quantize', 'sizeField': None, 'sizeScale': 'linear', 'heightField': None, 'heightScale': 'linear', 'radiusField': None, 'radiusScale': 'linear'}}], 'interactionConfig': {'tooltip': {'fieldsToShow': {'Discharge': [{'name': 'ts', 'format': None}, {'name': 'Discharge', 'format': None}]}, 'compareMode': False, 'compareType': 'absolute', 'enabled': True}, 'brush': {'size': 0.5, 'enabled': False}, 'geocoder': {'enabled': False}, 'coordinate': {'enabled': False}}, 'layerBlending': 'additive', 'splitMaps': [], 'animationConfig': {'currentTime': None, 'speed': 1}}, 'mapState': {'bearing': 0, 'dragRotate': False, 'latitude': 40.24060796334474, 'longitude': 20.565835594966174, 'pitch': 0, 'zoom': 8.776177236597563, 'isSplit': False}, 'mapStyle': {'styleType': 'dark', 'topLayerGroups': {}, 'visibleLayerGroups': {'label': True, 'road': True, 'border': False, 'building': True, 'water': True, 'land': True, '3d building': False}, 'threeDBuildingColor': [9.665468314072013, 17.18305478057247, 31.1442867897876], 'mapStyles': {}}}} class Map(leafmap.Map): def __init__(self, **kwargs): super().__init__(**kwargs) self.updateMap() # Add what you want below # self.add_basemap("OpenTopoMap") # change_basemap(self) # self.add_shp() def updateMap(self): self.add_shp("public/deposito.shp", "Discharge") self.config = config # self.add_basemap("OpenTopoMap") # change_basemap(self) @solara.component def MapComponent(): m = Map() m.element( # type: ignore zoom=zoom.value, on_zoom=zoom.set, center=center.value, on_center=center.set, scroll_wheel_zoom=True, toolbar_ctrl=False, data_ctrl=False, ) m.config = config @solara.component def Page(): with solara.Column(style={"min-width": "500px"}): content, set_content = solara.use_state(b"") uploaded, set_uploaded = solara.use_state(b"") filename, set_filename = solara.use_state("") river_filename, set_river_filename = solara.use_state("") q_filename, set_q_filename = solara.use_state("") error_select_csv, set_error_select_csv = solara.use_state("") error_select_shp, set_error_select_shp = solara.use_state("") no_file_selected, set_no_file_selected = solara.use_state("") # removed_data, set_removed = solara.use_state("") size, set_size = solara.use_state(0) file_browser, set_file_browser = solara.use_state(cast(Optional[Path], None)) map_loaded, set_map_loaded = solara.use_state(False) formulas = ["Parker and Klingeman 1982", "Wilkock and Crowe 2003", "Engelund and Hansen 1967", "Yang formula 1989", "Wong and Parker 2006", "Ackers and White formula 1973"] formula = solara.reactive("Engelund and Hansen 1967") partitionings = ["Direct", "Bed material fraction (BMF)", "Transport capacity function (TCF)", "Shear stress correction approach"] partitioning = solara.reactive("Shear stress correction approach") timescale = solara.reactive("20") continuous_update = solara.reactive(True) def on_file(file: FileInfo): set_filename(file["name"]) set_size(file["size"]) f = file["file_obj"] set_content(f.read()) set_uploaded(False) def upload_file(): if content: file_path = os.path.join("public",filename) with open(file_path,"wb") as file: file.write(content) set_uploaded(True) def open_river_file(): if file_browser: file_path = os.path.join(os.getcwd(),file_browser) if file_path.endswith(".shp"): set_river_filename(file_path) set_error_select_shp(False) set_no_file_selected(False) else: set_error_select_shp(True) else: set_error_select_shp(True) def open_q_file(): if file_browser: file_path = os.path.join(os.getcwd(),file_browser) if file_path.endswith(".csv"): set_q_filename(file_path) set_error_select_csv(False) else: set_error_select_csv(True) else: set_error_select_csv(True) def remove_data(): for file in os.listdir(os.getcwd()+"/public"): os.remove(os.getcwd()+"/public/"+file) def run_dcascade(): if (river_filename == "" or q_filename == ""): set_no_file_selected(True) else: set_no_file_selected(False) sel_form = formulas.index(str(formula).replace("'",""))+1 sel_part = partitionings.index(str(partitioning).replace("'",""))+1 sel_timescale = int(str(timescale).replace("'","")) set_map_loaded(False) river = river_filename q = q_filename out = os.getcwd()+"/public/deposito" out_shp = out+".shp" out_prj = out+".prj" shutil.copyfile(river,out_prj) dcascade_main.main(river, q, timescale=sel_timescale, formula=sel_form, partitioning=sel_part, out=out_shp, version=False, verbose=False, debug=False, credits=False) set_map_loaded(True) with solara.Div() as main: with solara.Card("Dcascade"): if map_loaded: MapComponent() with solara.Card("Upload files"): solara.Markdown("Required \*.shp, \*.shx, \*.dbf and \*.prj files for **river** file and \*.csv for **q** file. (one at the time)") with solara.ColumnsResponsive(1, large=6): solara.FileDrop( label="Drag and drop a file here ", on_file=on_file, lazy=True, ) solara.Button("Upload file", color="primary", on_click=upload_file) if content and not uploaded: solara.Info(f"File {filename} has total length: {size}\n", text=True, dense=True, icon=True, ) # solara.Preformatted("\n".join(textwrap.wrap(repr(content)))) # solara.Preformatted("\n".join(textwrap.wrap(repr(filename)))) elif uploaded: solara.Success( f"{filename} uploaded", text=True, dense=True, icon=True, ) with solara.Card("Select parameters"): with solara.ColumnsResponsive(3, large=4): solara.InputText("Timescale (days)", value=timescale, continuous_update=continuous_update.value) solara.Select(label="Formula", value=formula, values=formulas) # solara.Markdown(f"**Selected**: {formula.value}") solara.Select(label="Partitioning ", value=partitioning, values=partitionings) # solara.Markdown(f"**Selected**: {partitioning.value}") with solara.Card("Select files"): solara.Markdown("Select **river** and **q** files from file explorer below, the uploaded files can be found in /public folder. To select files click on the explorer the click on *SELECT RIVER FILE* or *SELECT Q FILE* based on the file selected.") with solara.ColumnsResponsive(3, large=6): solara.Markdown(f"**River file**: {river_filename}") solara.Button("Select river file", color="primary", on_click=open_river_file) with solara.ColumnsResponsive(3, large=6): solara.Markdown(f"**Q file**: {q_filename}") solara.Button("Select Q file", color="primary", on_click=open_q_file) if error_select_csv: solara.Warning(f"Q file must be csv", text=True, dense=True, icon=True, ) if error_select_shp: solara.Warning(f"River file must be shp", text=True, dense=True, icon=True, ) solara.FileBrowser( can_select=False, on_file_open=set_file_browser, directory="./public" ) with solara.Card("Run model"): with solara.ColumnsResponsive(3, large=6): solara.Markdown("Click on DCASCADE button to run the model and generate the output map") solara.Button("DCASCADE", color="primary", on_click=run_dcascade) if no_file_selected: solara.Warning(f"Select both River and Q files", text=True, dense=True, icon=True, ) # solara.Button("REMOVE DATA", # color="secondary", # on_click=remove_data) # solara.Info(f"You are in directory: {directory}") # solara.Info(f"You selected path: {path}") # solara.Info(f"You opened file: {file}") # if removed_data: # solara.Success( # f"Removed data", # text=True, # dense=True, # icon=True, # )