"""Функции дедупликации GPS-треков (ET-008).""" def compute_dedup_key(geom_bounds: tuple, metadata: dict) -> str: """Вычисляет ключ дедупликации для трека. Args: geom_bounds: (min_lon, min_lat, max_lon, max_lat) metadata: dict с полями length_m и created_at Returns: Строка вида "{bbox_round}|{length_bucket}|{date_bucket}" """ min_lon, min_lat, max_lon, max_lat = geom_bounds # Округление bbox до 2 знаков после запятой bbox_round = ( round(min_lon, 2), round(min_lat, 2), round(max_lon, 2), round(max_lat, 2), ) # Длина в бакетах по 1 км length_m = metadata.get("length_m", 0) or 0 length_bucket = round(length_m / 1000) * 1000 # Дата: первые 10 символов (YYYY-MM-DD) или пустая строка created_at = metadata.get("created_at") or "" date_bucket = created_at[:10] if created_at else "" return f"{bbox_round}|{length_bucket}|{date_bucket}"