Spaces:
Sleeping
Sleeping
File size: 3,110 Bytes
5b24075 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import streamlit as st
from streamlit_folium import st_folium
import folium
from geopy.geocoders import Nominatim
# Define the bounding box
ZUERICH_BBOX = [8.364, 47.240, 9.0405, 47.69894]
def within_bbox(lat, lon, bbox):
"""Check if a point is within the given bounding box."""
return bbox[1] <= lat <= bbox[3] and bbox[0] <= lon <= bbox[2]
def select_coordinates():
st.title("Step 1: Select Location")
instructions = """
1. Choose a crop classification location. Search for a location or click on the map.
2. Proceed to the "Perform Crop Classification" step.
_Note:_ The location must be within the green ZüriCrop area.
"""
st.sidebar.header("Instructions")
st.sidebar.markdown(instructions)
# Initialize a map centered around the midpoint of the bounding box
midpoint_lat = (ZUERICH_BBOX[1] + ZUERICH_BBOX[3]) / 2
midpoint_lon = (ZUERICH_BBOX[0] + ZUERICH_BBOX[2]) / 2
m = folium.Map(location=[midpoint_lat, midpoint_lon], zoom_start=9)
# Add the bounding box to the map as a rectangle
folium.Rectangle(
bounds=[[ZUERICH_BBOX[1], ZUERICH_BBOX[0]], [ZUERICH_BBOX[3], ZUERICH_BBOX[2]]],
color="green",
fill=True,
fill_opacity=0.1
).add_to(m)
# Search for a location
geolocator = Nominatim(user_agent="streamlit-app")
location_query = st.text_input("Search for a location:")
if location_query:
location = geolocator.geocode(location_query)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], tooltip=location.address).add_to(m)
m.location = [lat, lon]
m.zoom_start = 12
if within_bbox(lat, lon, ZUERICH_BBOX):
st.success(f"Location found: {location.address}. It is within the bounding box.")
st.session_state["selected_location"] = (lat, lon)
else:
st.error(f"Location found: {location.address}. It is outside the bounding box.")
else:
st.error("Location not found. Please try again.")
# Add a click event listener to capture coordinates
m.add_child(folium.LatLngPopup())
# Display the map using streamlit-folium
st_data = st_folium(m, height=500, width=800)
# Check if the user clicked within the bounding box
if st_data["last_clicked"]:
lat, lon = st_data["last_clicked"]["lat"], st_data["last_clicked"]["lng"]
if within_bbox(lat, lon, ZUERICH_BBOX):
st.success(f"Selected Location: Latitude {lat}, Longitude {lon}")
st.session_state["selected_location"] = (lat, lon)
else:
st.error(f"Selected Location is outside the allowed area. Please select a location within the bounding box.")
# Proceed to the next step
link_disabled = "selected_location" not in st.session_state
st.sidebar.page_link("pages/2_Perform_Crop_Classification.py", label="Proceed to Crop Classification", icon="🌾", disabled=link_disabled)
if __name__ == "__main__":
select_coordinates() |