"""Mathematische Helper-Funktionen — zentral statt 13× dupliziert.""" import math # Erdradius in Kilometern EARTH_RADIUS_KM = 6371.0 def haversine_km(lat1: float, lon1: float, lat2: float, lon2: float) -> float: """Distanz zwischen zwei GPS-Koordinaten in km (Haversine-Formel). Funktioniert für beliebige Punkte auf der Erde. Genauigkeit reicht für App-Zwecke (Umkreissuche etc.). """ lat1_rad = math.radians(lat1) lat2_rad = math.radians(lat2) dlat = math.radians(lat2 - lat1) dlon = math.radians(lon2 - lon1) a = (math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2) ** 2) return 2 * EARTH_RADIUS_KM * math.asin(math.sqrt(a)) def haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float: """Distanz in Metern (Convenience-Wrapper).""" return haversine_km(lat1, lon1, lat2, lon2) * 1000.0 def bbox_deg_from_km(lat: float, radius_km: float): """Bounding-Box-Approximation in Grad für radius_km um (lat, lon). Returns (lat_delta, lon_delta) — beide in Grad. Verwendung: WHERE lat BETWEEN ?-lat_delta AND ?+lat_delta etc. """ lat_delta = radius_km / 111.0 lon_delta = radius_km / (111.0 * max(abs(math.cos(math.radians(lat))), 0.01)) return lat_delta, lon_delta