Spaces:
Runtime error
Runtime error
import streamlit as st | |
import geopandas as gpd | |
import folium | |
from streamlit_folium import st_folium | |
from folium.plugins import Draw | |
# Title of the app | |
st.title("Vector Data Editor") | |
# Default file path | |
default_file_path = "./nyc_roads.geojson" | |
# Option to choose whether to load the default file or upload a new one | |
use_default = st.checkbox("Load default file (nyc_roads.geojson)", value=True) | |
if use_default: | |
# Load the vector data from the default file path | |
try: | |
gdf = gpd.read_file(default_file_path) | |
except Exception as e: | |
st.error(f"Error reading the default file: {e}") | |
st.stop() | |
else: | |
# File uploader for vector data | |
uploaded_file = st.file_uploader("Choose a vector file", type=["geojson", "shp"]) | |
if uploaded_file is not None: | |
# Load the vector data (GeoJSON or SHP) into a GeoDataFrame | |
try: | |
gdf = gpd.read_file(uploaded_file) | |
except Exception as e: | |
st.error(f"Error reading file: {e}") | |
st.stop() | |
else: | |
st.write("Please upload a vector file to start editing.") | |
st.stop() | |
# Create a Folium map centered on the uploaded/default data | |
m = folium.Map(location=[gdf.geometry.centroid.y.mean(), gdf.geometry.centroid.x.mean()], zoom_start=10) | |
# Add the vector data to the map in an editable form | |
geo_json = folium.GeoJson(gdf, name="Loaded Data").add_to(m) | |
# Add the Draw plugin to the map to enable editing | |
draw = Draw( | |
export=True, | |
edit_options={'edit': {'selectedPathOptions': None}}, | |
draw_options={'polyline': False, 'polygon': True, 'circle': False, 'marker': True} | |
) | |
draw.add_to(m) | |
# Display the map in Streamlit | |
output = st_folium(m, width=800, height=600) | |
# Handle the edited data | |
if output["last_active_drawing"]: | |
# Get the last edited drawing from the map | |
edited_geojson = output["last_active_drawing"] | |
edited_gdf = gpd.GeoDataFrame.from_features(edited_geojson["features"]) | |
# Display the edited GeoDataFrame | |
st.write(edited_gdf) | |
# Save changes and download the edited data | |
if st.button("Save Changes"): | |
edited_gdf.to_file("edited_data.geojson", driver="GeoJSON") | |
with open("edited_data.geojson", "rb") as file: | |
st.download_button("Download Edited File", data=file, file_name="edited_data.geojson") |