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 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, min_mag=1.0): """Son depremleri çek ve haritada göster""" # Verileri çek quake_data = get_kandilli_data(hours=hours, min_mag=min_mag) # 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_kandilli_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}")