import json

# Чтение данных из файла
with open('russia.geojson', 'r', encoding='utf-8') as infile:
    data = json.load(infile)

# Поля, которые нужно оставить
fields_to_keep = ['id', 'name', '_cartodb_id0', 'cartodb_id']


# Функция для округления координат до 3 знаков после запятой
def round_coordinates(coords):
    if isinstance(coords[0], list):
        # Обработка вложенных списков (для MultiPolygon или других сложных структур)
        return [round_coordinates(c) for c in coords]
    else:
        # Округление координат точки
        return [round(coord, 3) for coord in coords]


# Функция для удаления дубликатов из списка координат на самом нижнем уровне вложенности
def remove_duplicate_coordinates(coords):
    if not all(isinstance(c, list) and len(c) == 3 for c in coords):
        # Если это не список пар координат (lon, lat), пропускаем обработку
        return coords

    seen = set()
    unique_coords = []
    for coord in coords:
        coord_tuple = tuple(coord)  # Преобразуем список координат в кортеж для использования в множестве
        if coord_tuple not in seen:
            seen.add(coord_tuple)
            unique_coords.append(coord)
    return unique_coords


# Обновляем свойства, округляем и удаляем дубликаты координат в каждом объекте features
for feature in data['features']:
    # Сжатие свойств
    feature['properties'] = {key: feature['properties'][key] for key in fields_to_keep if key in feature['properties']}

    # Округление координат
    rounded_coords = round_coordinates(feature['geometry']['coordinates'])

    # Удаление дубликатов для координатных структур (обрабатываем только нижний уровень)
    if feature['geometry']['type'] == 'Point':
        # Для точки просто округляем координаты
        feature['geometry']['coordinates'] = rounded_coords
    elif feature['geometry']['type'] in ['Polygon', 'MultiLineString']:
        # Удаляем дубликаты на уровне списков координат (например, [[lon, lat], [lon, lat], ...])
        feature['geometry']['coordinates'] = [remove_duplicate_coordinates(part) for part in rounded_coords]
    elif feature['geometry']['type'] == 'MultiPolygon':
        # Удаляем дубликаты в многоуровневых структурах (например, [[[lon, lat], [lon, lat], ...], ...])
        feature['geometry']['coordinates'] = [[remove_duplicate_coordinates(part) for part in polygon] for polygon in
                                              rounded_coords]

# Запись результата в новый файл
with open('russia_2.geojson', 'w', encoding='utf-8') as outfile:
    json.dump(data, outfile, ensure_ascii=False, separators=(',', ':'))

print("Обработка завершена. Результат записан в russia_2.geojson.")
