percept-map / app.py
mdanish's picture
switch to OAuth auth. method
27431a7
raw
history blame
3.21 kB
import streamlit as st
import folium
from streamlit_folium import st_folium
import requests
from PIL import Image
from io import BytesIO
import os
# Securely get the token from environment variables
MAPILLARY_ACCESS_TOKEN = os.environ.get('MAPILLARY_ACCESS_TOKEN')
# Verify token exists
if not MAPILLARY_ACCESS_TOKEN:
st.error("Mapillary access token not found. Please configure it in the Space secrets.")
st.stop()
def get_nearest_image(lat, lon, radius=50):
"""
Get the nearest Mapillary image to given coordinates
"""
params = {
'fields': 'id,thumb_1024_url',
'limit': 1
}
query = f"""
{{
"point": {{"type": "Point", "coordinates": [{lon}, {lat}]}},
"radius": {radius}
}}
"""
header = {'Authorization' : 'OAuth {}'.format(MAPILLARY_ACCESS_TOKEN)}
try:
response = requests.post(
"https://graph.mapillary.com/images/search",
json=query,
params=params,
headers=header
)
response.raise_for_status()
data = response.json()
if 'data' in data and len(data['data']) > 0:
return data['data'][0]
return None
except requests.exceptions.RequestException as e:
st.error(f"Error fetching Mapillary data: {str(e)}")
return None
def main():
st.title("Amsterdam Street View Explorer")
# Initialize the map centered on Amsterdam
amsterdam_coords = [52.3676, 4.9041]
m = folium.Map(location=amsterdam_coords, zoom_start=13)
# Add a marker for Amsterdam city center
folium.Marker(
amsterdam_coords,
popup="Amsterdam City Center",
icon=folium.Icon(color="red", icon="info-sign")
).add_to(m)
# Display the map and get clicked coordinates
map_data = st_folium(m, height=400, width=700)
# Check if a location was clicked
if map_data['last_clicked']:
lat = map_data['last_clicked']['lat']
lng = map_data['last_clicked']['lng']
st.write(f"Selected coordinates: {lat:.4f}, {lng:.4f}")
# Get nearest Mapillary image
with st.spinner('Fetching street view image...'):
image_data = get_nearest_image(lat, lng)
if image_data:
# Display the image
try:
response = requests.get(image_data['thumb_1024_url'])
image = Image.open(BytesIO(response.content))
st.image(image, caption="Street View", use_column_width=True)
# Add download button
st.download_button(
label="Download Image",
data=response.content,
file_name=f"streetview_{lat}_{lng}.jpg",
mime="image/jpeg"
)
except Exception as e:
st.error(f"Error displaying image: {str(e)}")
else:
st.warning("No street view images found at this location. Try a different spot.")
if __name__ == "__main__":
main()