import requests import folium import pandas as pd from datetime import datetime, timedelta import time import os import json # Kandilli Rasathanesi API URL KANDILLI_API_URL = "https://api.orhanaydogdu.com.tr/deprem/kandilli/live" CACHE_DIR = os.path.join(os.path.dirname(__file__), "cache") os.makedirs(CACHE_DIR, exist_ok=True) def get_kandilli_data(hours=12, min_mag=1.0, use_cache=True, cache_max_age_minutes=15): """Kandilli Rasathanesi API'den son depremleri çek""" # Cache dosyası cache_file = os.path.join(CACHE_DIR, f"kandilli_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) try: # API isteği gönder print(f"Fetching earthquake data from Kandilli API for the last {hours} hours...") response = requests.get(KANDILLI_API_URL, timeout=10) response.raise_for_status() # Hata kontrolü # JSON verisini al data = response.json() # Zaman aralığına ve minimum büyüklüğe göre filtrele if "result" in data: filtered_results = [] for quake in data["result"]: try: # Tarih formatını kontrol et ve dönüştür quake_time = datetime.strptime(quake.get("date", ""), "%Y.%m.%d %H:%M:%S") if quake_time >= start_time and float(quake.get("mag", 0)) >= min_mag: filtered_results.append(quake) except (ValueError, TypeError) as e: print(f"Date conversion error: {e}") continue data["result"] = filtered_results # Ö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"Kandilli 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("earthquake_id", ""), "time": quake.get("date", ""), "latitude": float(quake.get("geojson", {}).get("coordinates", [0, 0, 0])[1]), "longitude": float(quake.get("geojson", {}).get("coordinates", [0, 0, 0])[0]), "depth": float(quake.get("depth", 0)), "magnitude": float(quake.get("mag", 0)), "location": quake.get("title", ""), "type": quake.get("mag_type", "") }) except (ValueError, TypeError, IndexError) 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 Büyüklüğü
≥ 5.0
4.0 - 4.9
3.0 - 3.9
< 3.0