Spaces:
Running
Running
import re | |
import json | |
import streamlit as st | |
import pandas as pd | |
import geopandas as gpd | |
import leafmap.foliumap as leafmap | |
# wide streamlit display | |
st.set_page_config(layout="wide") | |
file_url = st.query_params.get("file_url", [None]) | |
print(f"{file_url=}") | |
if file_url: | |
if file_url.startswith("https://drive.google.com/file/d/"): | |
ID = file_url.replace("https://drive.google.com/file/d/", "").split("/")[0] | |
file_url = f"https://drive.google.com/uc?id={ID}" | |
input_gdf = gpd.read_file(file_url) | |
input_gdf = input_gdf.to_crs(epsg=7761) # Gujarat zone | |
def format_fn(x): | |
return input_gdf.drop(columns=["geometry"]).loc[x].to_dict() | |
input_geometry_idx = st.selectbox("Select the geometry", input_gdf.index, format_func=format_fn) | |
geometry_gdf = input_gdf[input_gdf.index == input_geometry_idx] | |
m = leafmap.Map() | |
m.add_wms_layer( | |
"https://wayback.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/WMTS/1.0.0/GoogleMapsCompatible/MapServer/tile/56450/{z}/{y}/{x}", | |
layers="0", | |
) | |
m.add_gdf( | |
geometry_gdf.to_crs(epsg=4326), | |
layer_name="Geometry", | |
zoom_to_layer=True, | |
style_function=lambda x: {"color": "red", "fillOpacity": 0.0}, | |
) | |
m.to_streamlit() | |
# Metrics | |
stats_df = pd.DataFrame() | |
stats_df["Points"] = json.loads(geometry_gdf.to_crs(4326).to_json())["features"][0]["geometry"]["coordinates"] | |
stats_df["Area (ha)"] = geometry_gdf.geometry.area.item() / 10000 | |
stats_df["Perimeter (m)"] = geometry_gdf.geometry.length.item() | |
st.write("<h3><div style='text-align: center;'>Geometry Metrics</div></h3>", unsafe_allow_html=True) | |
# st.markdown( | |
# f"""| Metric | Value | | |
# | --- | --- | | |
# | Area (ha) | {stats_df['Area (ha)'].item():.2f} ha| | |
# | Perimeter (m) | {stats_df['Perimeter (m)'].item():.2f} m |""" | |
# unsafe_allow_html=True) | |
st.markdown( | |
f""" | |
<div style="display: flex; justify-content: center;"> | |
<table> | |
<tr> | |
<th>Metric</th> | |
<th>Value</th> | |
</tr> | |
<tr> | |
<td>Area (ha)</td> | |
<td>{stats_df['Area (ha)'].item():.2f} ha</td> | |
</tr> | |
<tr> | |
<td>Perimeter (m)</td> | |
<td>{stats_df['Perimeter (m)'].item():.2f} m</td> | |
</tr> | |
</table> | |
</div> | |
""", | |
unsafe_allow_html=True, | |
) | |
csv = stats_df.T.to_csv(index=True) | |
st.download_button( | |
"Download Geometry Metrics", csv, f"{file_url}_metrics.csv", "text/csv", use_container_width=True | |
) | |
else: | |
st.warning("Please provide a KML or GeoJSON URL as a query parameter, e.g., `?file_url=<your_file_url>`") | |