Spaces:
Sleeping
Sleeping
| import os | |
| import zipfile | |
| import gradio as gr | |
| import pandas as pd | |
| import plotly.graph_objects as go | |
| from geo_tools import ( | |
| shapefile_to_latlong, | |
| mask_shapefile_to_grid_indices, | |
| points_to_shapefile, | |
| get_cached_grid_indices, | |
| ) | |
| DATA_DIR = "data/" | |
| MASK_PATH = os.path.join(DATA_DIR, "serp.shp") | |
| HOSP_PATH = os.path.join(DATA_DIR, "hospitals.shp") | |
| POLICE_PATH = os.path.join(DATA_DIR, "police.shp") | |
| OUT_DIR = "out/" | |
| def gr_generate_map( | |
| side_len: str, | |
| show_hospitals: bool = True, | |
| show_police: bool = True, | |
| region: str = "None", | |
| ): | |
| token = "pk.eyJ1IjoiZGlsaXRoIiwiYSI6ImNsaTZ3b3I4MjF6MmczZG80cXBmeTgyaGsifQ.JmrU3qbp2jlK_9Yl2il8pw" | |
| side_len = float(side_len) | |
| show_mask = False | |
| scattermaps = [] | |
| grid_path = MASK_PATH[: -len(".shp")] + f"-gap={side_len}.shp" | |
| prefix = ".".join(grid_path.split(".")[:-1]) | |
| if not os.path.exists(grid_path): | |
| indices, labels = mask_shapefile_to_grid_indices(MASK_PATH, side_len) | |
| points_to_shapefile(indices, labels, grid_path) | |
| file_list = [prefix + ext for ext in (".shp", ".shx", ".prj", ".dbf", ".cpg")] | |
| with zipfile.ZipFile(prefix + ".zip", "w") as fp: | |
| for file in file_list: | |
| fp.write(file, compress_type=zipfile.ZIP_DEFLATED) | |
| grid_point_df = pd.DataFrame( | |
| data=[ | |
| [labels[i], f"{indices[i][1]}, {indices[i][0]}"] | |
| for i in range(len(indices)) | |
| ], | |
| columns=["Name", "Coordinates"], | |
| ) | |
| grid_point_df.to_csv(prefix + ".csv", index=False) | |
| else: | |
| indices, labels = get_cached_grid_indices(grid_path) | |
| grid_point_df = pd.read_csv(prefix + ".csv") | |
| box = go.Scattermapbox( | |
| lat=indices[:, 1], | |
| lon=indices[:, 0], | |
| mode="markers+text", | |
| text=labels, | |
| marker=go.scattermapbox.Marker(size=6), | |
| ) | |
| box.name = "Grids" | |
| box.textfont.update({"color": "White"}) | |
| scattermaps.append(box) | |
| if show_mask: | |
| contours = shapefile_to_latlong(MASK_PATH) | |
| for contour in contours: | |
| lons = contour[:, 0] | |
| lats = contour[:, 1] | |
| scattermaps.append( | |
| go.Scattermapbox( | |
| fill="toself", | |
| lat=lats, | |
| lon=lons, | |
| mode="markers", | |
| marker=go.scattermapbox.Marker(size=6), | |
| ) | |
| ) | |
| if show_hospitals: | |
| indices, labels = get_cached_grid_indices(HOSP_PATH) | |
| box = go.Scattermapbox( | |
| lat=indices[:, 1], | |
| lon=indices[:, 0], | |
| mode="markers+text", | |
| text=labels, | |
| marker=go.scattermapbox.Marker(size=10), | |
| ) | |
| box.name = "Hospitals" | |
| box.textfont.update({"color": "White"}) | |
| scattermaps.append(box) | |
| if show_police: | |
| indices, labels = get_cached_grid_indices(POLICE_PATH) | |
| box = go.Scattermapbox( | |
| lat=indices[:, 1], | |
| lon=indices[:, 0], | |
| mode="markers+text", | |
| text=labels, | |
| marker=go.scattermapbox.Marker(size=10), | |
| ) | |
| box.name = "Police Stations" | |
| box.textfont.update({"color": "White"}) | |
| scattermaps.append(box) | |
| fig = go.Figure(scattermaps) | |
| center = (7.753769, 80.691730) | |
| if region == "Ussangoda": | |
| center = (6.0994295, 80.9860763) | |
| elif region == "Indikolapelessa": | |
| center = (6.3602253, 80.9371957) | |
| elif region == "Ginigalpelessa": | |
| center = (6.3846744, 80.8868755) | |
| elif region == "Yudhaganawa": | |
| center = (7.665643, 80.9529867) | |
| elif region == "Seruwila": | |
| center = (8.335057, 81.320460) | |
| elif region == "Rupaha": | |
| center = (7.0401336625287, 80.89709495963253) | |
| modebar_icons = [ | |
| "lasso", | |
| "select", | |
| "pan", | |
| "zoomin", | |
| "zoomout", | |
| "toImage", | |
| "resetview", | |
| ] | |
| if token: | |
| fig.update_layout( | |
| mapbox=dict( | |
| style="satellite-streets", | |
| accesstoken=token, | |
| center=go.layout.mapbox.Center(lat=center[0], lon=center[1]), | |
| pitch=0, | |
| zoom=6 if region == "None" else 13, | |
| ), | |
| mapbox_layers=[ | |
| { | |
| # "below": "traces", | |
| "sourcetype": "raster", | |
| "sourceattribution": "United States Geological Survey", | |
| "source": [ | |
| "https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}" | |
| ], | |
| } | |
| ], | |
| modebar_remove=modebar_icons, | |
| ) | |
| else: | |
| fig.update_layout( | |
| mapbox_style="open-street-map", | |
| hovermode="closest", | |
| mapbox=dict( | |
| bearing=0, | |
| center=go.layout.mapbox.Center(lat=center[0], lon=center[1]), | |
| pitch=0, | |
| zoom=6 if region == "None" else 13, | |
| ), | |
| modebar_remove=modebar_icons, | |
| ) | |
| return fig, prefix + ".zip", prefix + ".csv", grid_point_df | |
| with gr.Blocks() as demo: | |
| gr.Markdown("""# Serpentinite Sampling Grid Generator""") | |
| with gr.Tab("Sampling"): | |
| grid_side_len = gr.Textbox(value="100", label="Sampling Gap (m)") | |
| grid_show_hosp = gr.Checkbox(True, label="Show Hospitals") | |
| grid_show_police = gr.Checkbox(True, label="Show Police Stations") | |
| grid_button = gr.Button("Generate Grid") | |
| grid_map = gr.Plot(label="Plot") | |
| grid_region = gr.Radio( | |
| label="Zoom to Region", | |
| choices=[ | |
| "None", | |
| "Ussangoda", | |
| "Indikolapelessa", | |
| "Ginigalpelessa", | |
| "Yudhaganawa", | |
| "Seruwila", | |
| "Rupaha", | |
| ], | |
| ) | |
| grid_shapefile = gr.File(label="Grid Shapefile") | |
| grid_point_info = gr.File(label="Grid Point Info") | |
| grid_point_table = gr.Dataframe(label="Grid Point Info Table") | |
| grid_button.click( | |
| gr_generate_map, | |
| inputs=[grid_side_len], | |
| outputs=[grid_map, grid_shapefile, grid_point_info, grid_point_table], | |
| ) | |
| grid_region.change( | |
| gr_generate_map, | |
| inputs=[ | |
| grid_side_len, | |
| grid_show_hosp, | |
| grid_show_police, | |
| grid_region, | |
| ], | |
| outputs=[grid_map, grid_shapefile, grid_point_info, grid_point_table], | |
| ) | |
| demo.queue(concurrency_count=10).launch(debug=True) | |