62 lines
3.3 KiB
Python
62 lines
3.3 KiB
Python
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.")
|