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()