import requests import folium import pandas as pd from datetime import datetime, timedelta import time import os import json # AFAD API URL AFAD_API_URL = "https://deprem.afad.gov.tr/apiv2/event/filter" CACHE_DIR = os.path.join(os.path.dirname(__file__), "cache") def get_afad_data(hours=12, use_cache=True, cache_max_age_minutes=15): """AFAD API'den son depremleri çek""" # Cache dizinini oluştur os.makedirs(CACHE_DIR, exist_ok=True) cache_file = os.path.join(CACHE_DIR, f"afad_data_{hours}h.json") # Önbellekten veri yükleme kontrolü if use_cache and os.path.exists(cache_file): file_age_minutes = (time.time() - os.path.getmtime(cache_file)) / 60 if file_age_minutes < cache_max_age_minutes: try: with open(cache_file, 'r', encoding='utf-8') as f: print(f"Loading cached data (age: {file_age_minutes:.1f} minutes)") return json.load(f) except Exception as e: print(f"Cache loading error: {e}") # Zaman aralığını hesapla end_time = datetime.now() start_time = end_time - timedelta(hours=hours) # API parametreleri params = { "start": start_time.strftime("%Y-%m-%d %H:%M:%S"), "end": end_time.strftime("%Y-%m-%d %H:%M:%S"), "minMag": 1.0, # Minimum büyüklük "orderby": "timedesc" # Zamana göre sırala (en yeni en üstte) } try: # API isteği gönder print(f"Fetching earthquake data from AFAD API for the last {hours} hours...") response = requests.get(AFAD_API_URL, params=params, timeout=10) response.raise_for_status() # Hata kontrolü # JSON verisini al data = response.json() # Önbelleğe kaydet with open(cache_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False) return data except Exception as e: print(f"AFAD API error: {e}") # API hatası durumunda önbellekteki veriyi kullanmayı dene if os.path.exists(cache_file): try: with open(cache_file, 'r', encoding='utf-8') as f: print(f"Using cached data due to API error") return json.load(f) except Exception as cache_error: print(f"Cache error: {cache_error}") # Hiçbir veri yoksa boş sonuç döndür return {"result": []} def create_quake_map(quake_data): """Deprem verilerini haritada göster""" # Boş veri kontrolü if not quake_data or "result" not in quake_data or not quake_data["result"]: # Boş harita döndür m = folium.Map(location=[39.0, 35.0], zoom_start=5) folium.Marker( [39.0, 35.0], popup="Deprem verisi bulunamadı", icon=folium.Icon(color="gray") ).add_to(m) return m # Deprem verilerini DataFrame'e dönüştür quakes = [] for quake in quake_data["result"]: try: quakes.append({ "id": quake.get("eventID", ""), "time": quake.get("date", ""), "latitude": float(quake.get("latitude", 0)), "longitude": float(quake.get("longitude", 0)), "depth": float(quake.get("depth", 0)), "magnitude": float(quake.get("magnitude", 0)), "location": quake.get("location", ""), "type": quake.get("type", "") }) except (ValueError, TypeError) as e: print(f"Data conversion error: {e}") continue df = pd.DataFrame(quakes) if df.empty: # Boş harita döndür m = folium.Map(location=[39.0, 35.0], zoom_start=5) folium.Marker( [39.0, 35.0], popup="Deprem verisi bulunamadı", icon=folium.Icon(color="gray") ).add_to(m) return m # Türkiye'nin merkezi center_lat = df["latitude"].mean() center_lon = df["longitude"].mean() # Harita oluştur m = folium.Map(location=[center_lat, center_lon], zoom_start=6) # Depremleri haritaya ekle for _, row in df.iterrows(): # Büyüklüğe göre renk belirle if row["magnitude"] >= 5.0: color = "red" elif row["magnitude"] >= 4.0: color = "orange" elif row["magnitude"] >= 3.0: color = "yellow" else: color = "green" # Büyüklüğe göre çap belirle radius = row["magnitude"] * 5000 # Popup içeriği popup_html = f"""

Deprem Bilgisi

Tarih: {row["time"]}
Büyüklük: {row["magnitude"]}
Derinlik: {row["depth"]} km
Konum: {row["location"]}
""" # Dairesel işaret ekle folium.Circle( location=[row["latitude"], row["longitude"]], radius=radius, color=color, fill=True, fill_color=color, fill_opacity=0.4, popup=folium.Popup(popup_html, max_width=300) ).add_to(m) # Merkez noktası ekle folium.CircleMarker( location=[row["latitude"], row["longitude"]], radius=5, color=color, fill=True, fill_color="white", fill_opacity=0.7, popup=folium.Popup(popup_html, max_width=300) ).add_to(m) # Lejant ekle legend_html = """

Deprem Büyüklüğü

≥ 5.0

4.0 - 4.9

3.0 - 3.9

< 3.0

""" m.get_root().html.add_child(folium.Element(legend_html)) return m def get_latest_quakes(hours=12): """Son depremleri çek ve haritada göster""" # Verileri çek quake_data = get_afad_data(hours) # Harita oluştur quake_map = create_quake_map(quake_data) # Son güncelleme bilgisi ekle timestamp = datetime.now().strftime("%d.%m.%Y %H:%M:%S") quake_map.get_root().html.add_child(folium.Element( f'
' f'Son Güncelleme: {timestamp}
' )) # HTML olarak döndür return quake_map._repr_html_() # Test if __name__ == "__main__": # Son depremleri çek quake_data = get_afad_data(hours=24) print(f"Fetched {len(quake_data.get('result', []))} earthquakes") # Haritayı oluştur quake_map = create_quake_map(quake_data) # Haritayı HTML olarak kaydet output_file = "son_depremler.html" quake_map.save(output_file) print(f"Map saved to {output_file}")