Spaces:
Running
Running
import ee | |
import json | |
import streamlit as st | |
import geemap.foliumap as geemap | |
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/@giswqs) | [LinkedIn](https://www.linkedin.com/in/giswqs) | |
""" | |
) | |
def nlcd(): | |
# st.header("National Land Cover Database (NLCD)") | |
row1_col1, row1_col2 = st.columns([3, 1]) | |
width = 950 | |
height = 600 | |
Map = geemap.Map(center=[40, -100], zoom=4) | |
# Select the seven NLCD epoches after 2000. | |
years = ["2001", "2004", "2006", "2008", "2011", "2013", "2016", "2019"] | |
# Get an NLCD image by year. | |
def getNLCD(year): | |
# Import the NLCD collection. | |
dataset = ee.ImageCollection("USGS/NLCD_RELEASES/2019_REL/NLCD") | |
# Filter the collection by year. | |
nlcd = dataset.filter(ee.Filter.eq("system:index", year)).first() | |
# Select the land cover band. | |
landcover = nlcd.select("landcover") | |
return landcover | |
with row1_col2: | |
selected_year = st.multiselect("Select a year", years) | |
add_legend = st.checkbox("Show legend") | |
if selected_year: | |
for year in selected_year: | |
Map.addLayer(getNLCD(year), {}, "NLCD " + year) | |
if add_legend: | |
Map.add_legend( | |
legend_title="NLCD Land Cover Classification", builtin_legend="NLCD" | |
) | |
with row1_col1: | |
Map.to_streamlit(width=width, height=height) | |
else: | |
with row1_col1: | |
Map.to_streamlit(width=width, height=height) | |
def search_data(): | |
# st.header("Search Earth Engine Data Catalog") | |
Map = geemap.Map() | |
if "ee_assets" not in st.session_state: | |
st.session_state["ee_assets"] = None | |
if "asset_titles" not in st.session_state: | |
st.session_state["asset_titles"] = None | |
col1, col2 = st.columns([2, 1]) | |
dataset = None | |
with col2: | |
keyword = st.text_input("Enter a keyword to search (e.g., elevation)", "") | |
if keyword: | |
ee_assets = geemap.search_ee_data(keyword) | |
asset_titles = [x["title"] for x in ee_assets] | |
asset_types = [x["type"] for x in ee_assets] | |
translate = { | |
"image_collection": "ee.ImageCollection('", | |
"image": "ee.Image('", | |
"table": "ee.FeatureCollection('", | |
"table_collection": "ee.FeatureCollection('", | |
} | |
dataset = st.selectbox("Select a dataset", asset_titles) | |
if len(ee_assets) > 0: | |
st.session_state["ee_assets"] = ee_assets | |
st.session_state["asset_titles"] = asset_titles | |
if dataset is not None: | |
with st.expander("Show dataset details", True): | |
index = asset_titles.index(dataset) | |
html = geemap.ee_data_html(st.session_state["ee_assets"][index]) | |
html = html.replace("\n", "") | |
st.markdown(html, True) | |
ee_id = ee_assets[index]["id"] | |
uid = ee_assets[index]["uid"] | |
st.markdown(f"""**Earth Engine Snippet:** `{ee_id}`""") | |
ee_asset = f"{translate[asset_types[index]]}{ee_id}')" | |
if ee_asset.startswith("ee.ImageCollection"): | |
ee_asset = ee.ImageCollection(ee_id) | |
elif ee_asset.startswith("ee.Image"): | |
ee_asset = ee.Image(ee_id) | |
elif ee_asset.startswith("ee.FeatureCollection"): | |
ee_asset = ee.FeatureCollection(ee_id) | |
vis_params = st.text_input( | |
"Enter visualization parameters as a dictionary", {} | |
) | |
layer_name = st.text_input("Enter a layer name", uid) | |
button = st.button("Add dataset to map") | |
if button: | |
vis = {} | |
try: | |
if vis_params.strip() == "": | |
# st.error("Please enter visualization parameters") | |
vis_params = "{}" | |
vis = json.loads(vis_params.replace("'", '"')) | |
if not isinstance(vis, dict): | |
st.error("Visualization parameters must be a dictionary") | |
try: | |
Map.addLayer(ee_asset, vis, layer_name) | |
except Exception as e: | |
st.error(f"Error adding layer: {e}") | |
except Exception as e: | |
st.error(f"Invalid visualization parameters: {e}") | |
with col1: | |
Map.to_streamlit() | |
else: | |
with col1: | |
Map.to_streamlit() | |
def app(): | |
st.title("Earth Engine Data Catalog") | |
apps = ["Search Earth Engine Data Catalog", "National Land Cover Database (NLCD)"] | |
selected_app = st.selectbox("Select an app", apps) | |
if selected_app == "National Land Cover Database (NLCD)": | |
nlcd() | |
elif selected_app == "Search Earth Engine Data Catalog": | |
search_data() | |
app() | |