Inam65's picture
Update app.py
e63e435 verified
import streamlit as st
import folium
from streamlit_folium import st_folium
from geopy.geocoders import Nominatim
from datetime import datetime
# Initialize Geolocator with English enforced
geolocator = Nominatim(user_agent="Inam65/Simple-map-access", timeout=10) # Remember ALWAYS MATCH YOUR user_agent with NAME OF YOUR APPLICATION
# Streamlit App
st.set_page_config(page_title="World Map Search", layout="wide")
st.title("🌍 Interactive World Map Search (English Only)")
# Session states initialization
if 'latitude' not in st.session_state:
st.session_state['latitude'] = 20.0
if 'longitude' not in st.session_state:
st.session_state['longitude'] = 0.0
if 'location_name' not in st.session_state:
st.session_state['location_name'] = ""
# Date input (default today)
default_date = datetime.utcnow().date()
selected_date = st.text_input("Date (YYYY-MM-DD)", value=str(default_date))
# Layout: 3 columns for inputs
col1, col2, col3 = st.columns(3)
with col1:
latitude_input = st.text_input("Latitude", value=str(st.session_state['latitude']))
with col2:
longitude_input = st.text_input("Longitude", value=str(st.session_state['longitude']))
with col3:
location_search = st.text_input("Search Location (English only)", value=st.session_state['location_name'])
# Search button
if st.button("Search"):
with st.spinner("πŸ”Ž Searching and updating the location..."):
# First try location search
if location_search.strip() != "":
location = geolocator.geocode(location_search, language="en")
if location:
st.session_state['latitude'] = location.latitude
st.session_state['longitude'] = location.longitude
st.session_state['location_name'] = location.address
st.success(f"βœ… Location found: {location.address}")
st.balloons()
else:
st.error("❌ Location not found. Please try another keyword.")
# If no location given, fall back to lat/lon
else:
try:
lat = float(latitude_input)
lon = float(longitude_input)
location = geolocator.reverse((lat, lon), language="en")
if location:
st.session_state['location_name'] = location.address
st.success(f"βœ… Coordinates updated to: {location.address}")
st.balloons()
else:
st.warning("⚠️ Valid coordinates but no address found.")
st.session_state['latitude'] = lat
st.session_state['longitude'] = lon
except ValueError:
st.error("❌ Invalid latitude or longitude format.")
# Map
st.subheader("πŸ—ΊοΈ Map View:")
# Create Map
m = folium.Map(
location=[st.session_state['latitude'], st.session_state['longitude']],
zoom_start=5,
control_scale=True,
tiles="CartoDB positron"
)
# Add marker in English popup
folium.Marker(
[st.session_state['latitude'], st.session_state['longitude']],
popup=f"πŸ“ {st.session_state['location_name'] or 'Selected Location'}",
tooltip="Click for location",
).add_to(m)
# Display Map
st_data = st_folium(m, width=1000, height=600)
# Update lat/lon if user clicks on the map
if st_data and st_data.get("last_clicked"):
clicked_lat = st_data["last_clicked"]["lat"]
clicked_lon = st_data["last_clicked"]["lng"]
st.session_state['latitude'] = clicked_lat
st.session_state['longitude'] = clicked_lon
try:
location = geolocator.reverse((clicked_lat, clicked_lon), language="en")
if location:
st.session_state['location_name'] = location.address
else:
st.session_state['location_name'] = ""
except:
st.session_state['location_name'] = ""
st.experimental_rerun()