-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
128 lines (113 loc) · 4.59 KB
/
main.py
File metadata and controls
128 lines (113 loc) · 4.59 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import streamlit as st
import requests
import folium
from streamlit_folium import st_folium
st.set_page_config(page_title="Address Finder", page_icon="📍", layout="centered")
st.title("📍 Address Finder on the Map")
# --- States ---
if "map_data" not in st.session_state:
st.session_state.map_data = None
if "suggestions" not in st.session_state:
st.session_state.suggestions = []
if "confirmed_address" not in st.session_state:
st.session_state.confirmed_address = None
if "last_input" not in st.session_state:
st.session_state.last_input = ""
# --- Función de sugerencias ---
def get_suggestions(query):
if not query or len(query) < 3:
return []
url = "https://nominatim.openstreetmap.org/search"
params = {"q": query, "format": "json", "limit": 5, "addressdetails": 1}
headers = {"User-Agent": "streamlit-map-app/1.0"}
try:
resp = requests.get(url, params=params, headers=headers, timeout=5)
if resp.status_code == 200:
data = resp.json()
return [d["display_name"] for d in data]
except:
return []
return []
# --- Input ---
address = st.text_input("Enter an address:", placeholder="Example: New York, USA")
if address != st.session_state.last_input:
st.session_state.confirmed_address = None
st.session_state.map_data = None
st.session_state.last_input = address
# --- Suggestions ---
if address and not st.session_state.confirmed_address:
st.session_state.suggestions = get_suggestions(address)
else:
st.session_state.suggestions = []
if st.session_state.suggestions:
st.write("🔎 **Suggestions:**")
for i, sug in enumerate(st.session_state.suggestions):
if st.button(sug, key=f"sug-{i}"):
st.session_state.confirmed_address = sug
st.session_state.suggestions = []
# Obtener coordenadas
url = "https://nominatim.openstreetmap.org/search"
params = {"q": sug, "format": "json", "limit": 1}
headers = {"User-Agent": "streamlit-map-app/1.0"}
try:
resp = requests.get(url, params=params, headers=headers, timeout=10)
if resp.status_code == 200:
data = resp.json()
if data:
lat = float(data[0]["lat"])
lon = float(data[0]["lon"])
display_name = data[0]["display_name"]
st.session_state.map_data = {
"lat": lat,
"lon": lon,
"display_name": display_name,
"address": sug,
}
except Exception as e:
st.error(f"Error connecting to the API: {e}")
# --- Enter ---
if address and not st.session_state.suggestions and not st.session_state.map_data and not st.session_state.confirmed_address:
url = "https://nominatim.openstreetmap.org/search"
params = {"q": address, "format": "json", "limit": 1}
headers = {"User-Agent": "streamlit-map-app/1.0"}
try:
resp = requests.get(url, params=params, headers=headers, timeout=10)
if resp.status_code == 200:
data = resp.json()
if data:
lat = float(data[0]["lat"])
lon = float(data[0]["lon"])
display_name = data[0]["display_name"]
st.session_state.map_data = {
"lat": lat,
"lon": lon,
"display_name": display_name,
"address": address,
}
st.session_state.confirmed_address = address
else:
st.warning("Address not found.")
except Exception as e:
st.error(f"Error connecting to the API: {e}")
# --- Show map ---
if st.session_state.map_data:
lat = st.session_state.map_data["lat"]
lon = st.session_state.map_data["lon"]
display_name = st.session_state.map_data["display_name"]
address = st.session_state.map_data["address"]
st.success(f"Address found: {display_name}")
st.write(f"🌍 Coordinates: ({lat:.5f}, {lon:.5f})")
map_ = folium.Map(location=[lat, lon], zoom_start=5)
# Marker
folium.Marker([lat, lon], popup=address, tooltip="Location").add_to(map_)
# US population TileLayer
folium.TileLayer(
tiles="http://localhost:8000/tiles/{z}/{x}/{y}.png",
attr="US Population",
name="Population",
overlay=True,
control=True,
opacity=0.6
).add_to(map_)
folium.LayerControl().add_to(map_)
st_folium(map_, width=800, height=500)