#!/usr/bin/env python3
# Группировка фото по геопозиции: кластеризация GPS-точек (порог ~150 м)
# + обратное геокодирование через Яндекс.Геокодер (бесплатно без ключа — нет; используем offline-приближение)
import json, math, sys

def haversine(lat1, lon1, lat2, lon2):
    R = 6371000
    p1, p2 = math.radians(lat1), math.radians(lat2)
    dp = math.radians(lat2 - lat1)
    dl = math.radians(lon2 - lon1)
    a = math.sin(dp/2)**2 + math.cos(p1)*math.cos(p2)*math.sin(dl/2)**2
    return R * 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))

def clusterize(points, threshold=150):
    """points: список (key, lat, lon). Возвращает список кластеров [{center, keys, count}]"""
    clusters = []
    for key, lat, lon in points:
        placed = False
        for c in clusters:
            if haversine(lat, lon, c["lat"], c["lon"]) <= threshold:
                c["keys"].append(key)
                # пересчёт центра
                n = len(c["keys"])
                c["lat"] = (c["lat"] * (n-1) + lat) / n
                c["lon"] = (c["lon"] * (n-1) + lon) / n
                placed = True
                break
        if not placed:
            clusters.append({"keys": [key], "lat": lat, "lon": lon})
    return clusters

if __name__ == "__main__":
    cache = json.load(open("/root/site/video/gps_cache2.json", encoding="utf-8"))
    points = []
    for key, val in cache.items():
        gps = val.get("gps")
        if gps:
            points.append((key, gps[0], gps[1]))
    print(f"Фото с GPS: {len(points)}")
    clusters = clusterize(points, 150)
    clusters.sort(key=lambda c: -len(c["keys"]))
    print(f"Кластеров (объектов): {len(clusters)}")
    for i, c in enumerate(clusters, 1):
        print(f"  Кластер {i}: {len(c['keys'])} фото, центр {c['lat']:.5f},{c['lon']:.5f}")
        # примеры имён
        names = [cache[k]["name"] for k in c["keys"][:5]]
        print(f"    примеры: {names}")
