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.")