Earthquake_app / app.py
Karlsen's picture
Update app.py
e7402bc verified
raw
history blame contribute delete
No virus
3.83 kB
import streamlit as st
import requests
import pandas as pd
from datetime import datetime
# Define the base URL for the USGS Earthquake API
BASE_URL = "https://earthquake.usgs.gov/fdsnws/event/1/query"
# Function to get earthquake data
def get_earthquake_data(starttime, endtime, minmagnitude, latitude, longitude, maxradiuskm):
params = {
"format": "geojson",
"starttime": starttime,
"endtime": endtime,
"minmagnitude": minmagnitude,
"latitude": latitude,
"longitude": longitude,
"maxradiuskm": maxradiuskm,
}
response = requests.get(BASE_URL, params=params)
if response.status_code == 200:
data = response.json()
return data["features"]
else:
st.error("Error fetching data from the API.")
return []
# Function to get latitude and longitude from a place name using Nominatim
def get_lat_lon(place_name):
url = f"https://nominatim.openstreetmap.org/search?q={place_name}&format=json&limit=1"
headers = {
'User-Agent': 'YourAppName/1.0 (your_email@example.com)'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
results = response.json()
if results:
latitude = float(results[0]["lat"])
longitude = float(results[0]["lon"])
return latitude, longitude
else:
st.error("No results found for the specified place.")
return None, None
else:
st.error(f"Error fetching coordinates for the place. HTTP status code: {response.status_code}")
return None, None
# Streamlit app
def main():
st.title("Earthquake Data Lookup")
# Input field for the place name
place_name = st.sidebar.text_input("Enter City or Country Name", "San Francisco")
if place_name:
latitude, longitude = get_lat_lon(place_name)
if latitude is not None and longitude is not None:
st.sidebar.write(f"Coordinates for {place_name}: ({latitude}, {longitude})")
starttime = st.sidebar.date_input("Start Date", datetime(2024, 1, 1))
endtime = st.sidebar.date_input("End Date", datetime.now())
minmagnitude = st.sidebar.number_input("Minimum Magnitude", min_value=0.0, max_value=10.0, value=5.0, step=0.1)
maxradiuskm = st.sidebar.number_input("Radius (km)", min_value=0.0, max_value=20001.6, value=500.0, step=1.0)
if st.sidebar.button("Fetch Data"):
with st.spinner("Fetching data..."):
features = get_earthquake_data(starttime, endtime, minmagnitude, latitude, longitude, maxradiuskm)
if features:
records = [
{
"Time": feature["properties"]["time"],
"Magnitude": feature["properties"]["mag"],
"Place": feature["properties"]["place"],
"Latitude": feature["geometry"]["coordinates"][1],
"Longitude": feature["geometry"]["coordinates"][0],
"Depth (km)": feature["geometry"]["coordinates"][2],
}
for feature in features
]
df = pd.DataFrame(records)
df["Time"] = pd.to_datetime(df["Time"], unit='ms')
st.dataframe(df)
st.map(df.rename(columns={"Latitude": "lat", "Longitude": "lon"}))
else:
st.info("No data found for the given parameters.")
else:
st.error("Could not fetch coordinates. Please check the place name.")
if __name__ == "__main__":
main()