| import streamlit as st |
| from streamlit_folium import st_folium |
| import folium |
| from geopy.geocoders import Nominatim |
|
|
| |
| 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) |
|
|
| |
| 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) |
|
|
| |
| 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) |
|
|
| |
| 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.") |
|
|
| |
| m.add_child(folium.LatLngPopup()) |
|
|
| |
| st_data = st_folium(m, height=500, width=800) |
|
|
| |
| 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.") |
| |
| |
| 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() |