streamlit-geospatial / pages /9_πŸ”²_Vector_Data_Visualization.py
giswqs's picture
Update hyperlinks (#138)
e189598 unverified
raw
history blame
3.88 kB
import os
import fiona
import geopandas as gpd
import streamlit as st
st.set_page_config(layout="wide")
st.sidebar.info(
"""
- Web App URL: <https://streamlit.gishub.org>
- GitHub repository: <https://github.com/giswqs/streamlit-geospatial>
"""
)
st.sidebar.title("Contact")
st.sidebar.info(
"""
Qiusheng Wu at [wetlands.io](https://wetlands.io) | [GitHub](https://github.com/giswqs) | [Twitter](https://twitter.com/giswqs) | [YouTube](https://www.youtube.com/c/QiushengWu) | [LinkedIn](https://www.linkedin.com/in/qiushengwu)
"""
)
# Define a whitelist of trusted URLs
trusted_urls = [
"https://github.com/giswqs/streamlit-geospatial/raw/master/data/us_states.geojson",
# Add more trusted URLs here
]
def is_trusted_url(url):
return url in trusted_urls
def save_uploaded_file(file_content, file_name):
"""
Save the uploaded file to a temporary directory
"""
import tempfile
import os
import uuid
_, file_extension = os.path.splitext(file_name)
file_id = str(uuid.uuid4())
file_path = os.path.join(tempfile.gettempdir(), f"{file_id}{file_extension}")
with open(file_path, "wb") as file:
file.write(file_content.getbuffer())
return file_path
def app():
st.title("Upload Vector Data")
row1_col1, row1_col2 = st.columns([2, 1])
width = 950
height = 600
with row1_col2:
backend = st.selectbox(
"Select a plotting backend", ["folium", "kepler.gl", "pydeck"], index=2
)
if backend == "folium":
import leafmap.foliumap as leafmap
elif backend == "kepler.gl":
import leafmap.kepler as leafmap
elif backend == "pydeck":
import leafmap.deck as leafmap
url = st.text_input(
"Enter a URL to a vector dataset",
"https://github.com/giswqs/streamlit-geospatial/raw/master/data/us_states.geojson",
)
data = st.file_uploader(
"Upload a vector dataset", type=["geojson", "kml", "zip", "tab"]
)
container = st.container()
if data or is_trusted_url(url):
if data:
file_path = save_uploaded_file(data, data.name)
layer_name = os.path.splitext(data.name)[0]
elif url:
file_path = url
layer_name = url.split("/")[-1].split(".")[0]
with row1_col1:
if file_path.lower().endswith(".kml"):
fiona.drvsupport.supported_drivers["KML"] = "rw"
gdf = gpd.read_file(file_path, driver="KML")
else:
gdf = gpd.read_file(file_path)
lon, lat = leafmap.gdf_centroid(gdf)
if backend == "pydeck":
column_names = gdf.columns.values.tolist()
random_column = None
with container:
random_color = st.checkbox("Apply random colors", True)
if random_color:
random_column = st.selectbox(
"Select a column to apply random colors", column_names
)
m = leafmap.Map(center=(lat, lon))
m.add_gdf(gdf, random_color_column=random_column)
st.pydeck_chart(m)
else:
m = leafmap.Map(center=(lat, lon), draw_export=True)
m.add_gdf(gdf, layer_name=layer_name)
# m.add_vector(file_path, layer_name=layer_name)
if backend == "folium":
m.zoom_to_gdf(gdf)
m.to_streamlit(width=width, height=height)
else:
with row1_col1:
m = leafmap.Map()
st.pydeck_chart(m)
app()