import streamlit as st import pandas as pd import numpy as np from geopy.distance import geodesic # Create a DataFrame with sample data data = pd.DataFrame({ 'lat': np.random.uniform(-90, 90, 1000), 'lon': np.random.uniform(-180, 180, 1000), 'value': np.random.rand(1000) * 100 }) # Function to calculate distance in meters between two coordinates def calculate_distance(lat1, lon1, lat2, lon2): coords_1 = (lat1, lon1) coords_2 = (lat2, lon2) return geodesic(coords_1, coords_2).meters # Create a sidebar for controls with st.sidebar: # Display a title st.title('Geospatial Dashboard') # Dropdown to select specific coordinates selected_coords = st.selectbox('Select Coordinates', ['Random', 'Custom']) if selected_coords == 'Custom': custom_lat = st.number_input('Enter Latitude', value=0.0) custom_lon = st.number_input('Enter Longitude', value=0.0) else: custom_lat, custom_lon = 0.0, 0.0 # Slider for setting the zoom level zoom_level = st.slider('Zoom Level', min_value=1, max_value=15, value=5) # Slider to set the radius in meters radius_in_meters = st.slider('Select Radius (in meters)', min_value=100, max_value=5000, value=1000) # Filter data based on the radius if selected_coords == 'Custom': filtered_data = data[data.apply(lambda x: calculate_distance(x['lat'], x['lon'], custom_lat, custom_lon), axis=1) <= radius_in_meters] st.map(filtered_data, zoom=zoom_level, use_container_width=True, style={'height': '100vh'}) else: st.map(data, zoom=zoom_level, use_container_width=True, style={'height': '100vh'})