This commit is contained in:
2024-11-15 15:03:05 +03:00
parent f3345a102e
commit 9d68048e17
7 changed files with 2639544 additions and 6 deletions

40
main_clear_json_kwarg.py Normal file
View File

@@ -0,0 +1,40 @@
import json
import os
def clear_string_values(data):
"""
Рекурсивно очищает все строковые значения, оставляя только пустые кавычки (""),
не изменяя значения None или другие типы данных.
"""
if isinstance(data, str):
return ""
elif isinstance(data, list):
return [clear_string_values(item) for item in data]
elif isinstance(data, dict):
return {key: clear_string_values(value) for key, value in data.items()}
return data
def process_json_file(file_path):
"""
Обрабатывает указанный JSON-файл, очищая строковые значения, и сохраняет результат
в новый файл с суффиксом '_cleared'.
"""
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
# Очищаем все строковые значения
cleared_data = clear_string_values(data)
# Сохраняем результат в новый файл с суффиксом '_cleared'
new_file_path = f"{os.path.splitext(file_path)[0]}_cleared.json"
with open(new_file_path, 'w', encoding='utf-8') as new_file:
json.dump(cleared_data, new_file, ensure_ascii=False, indent=4)
print(f"Файл с очищенными данными сохранен как: {new_file_path}")
# Укажите путь к вашему JSON-файлу
file_path = 'E:\code\kvant.app\FS_primer.json'
process_json_file(file_path)

55
main_conv_reg_to_city.py Normal file
View File

@@ -0,0 +1,55 @@
import json
# Загрузка данных о регионах из внешнего JSON
def load_region_data(data_file="regions_data.json"):
try:
with open(data_file, "r", encoding="utf-8") as f:
return json.load(f).get("regions", [])
except FileNotFoundError:
print(f"Файл {data_file} не найден.")
return []
# Функция для добавления городов в GeoJSON
def add_cities_to_geojson(input_geojson="russia_2.geojson", output_geojson="updated_russia_2.geojson"):
# Загрузка исходного GeoJSON файла
with open(input_geojson, "r", encoding="utf-8") as f:
geo_data = json.load(f)
# Загрузка данных о регионах
region_data = load_region_data()
region_map = {region["id"]: region for region in region_data}
for feature in geo_data.get("features", []):
# Обработка данных региона
region_id = feature["properties"].get("id")
region_info = region_map.get(region_id, {})
# Добавление информации о главном городе
major_city = region_info.get("major_cities", None)
if major_city:
# Примерные координаты (замените на реальные для каждого города, если они известны)
city_coords = [[-100.0, 60.0]] # Заглушка, замените на реальные координаты для каждого города
city_feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": city_coords
},
"properties": {
"name": major_city,
"region_id": region_id
}
}
# Добавляем город в список фич
geo_data["features"].append(city_feature)
# Запись обновленного GeoJSON файла
with open(output_geojson, "w", encoding="utf-8") as f:
json.dump(geo_data, f, ensure_ascii=False, indent=4)
print(f"Файл обновлен и сохранен как {output_geojson}")
# Запуск функции
add_cities_to_geojson()

55
main_decoder_text_uni.py Normal file
View File

@@ -0,0 +1,55 @@
import os
import json
def decode_text(text):
"""
Преобразует строки с ошибкой кодировки из Latin-1 в UTF-8.
"""
try:
return text.encode('latin1').decode('utf-8')
except (UnicodeEncodeError, UnicodeDecodeError):
return text
def recursive_decode(obj):
"""
Рекурсивно декодирует строки в объекте JSON.
"""
if isinstance(obj, str):
return decode_text(obj)
elif isinstance(obj, list):
return [recursive_decode(item) for item in obj]
elif isinstance(obj, dict):
return {key: recursive_decode(value) for key, value in obj.items()}
return obj
def process_json_file(file_path):
"""
Обрабатывает JSON-файл, декодируя строки с ошибочной кодировкой Latin-1.
Создает новый файл с суффиксом '_decoded'.
"""
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
# Рекурсивно декодируем все строки в JSON-структуре
decoded_data = recursive_decode(data)
# Создаем новый файл с суффиксом '_decoded'
new_file_path = f"{os.path.splitext(file_path)[0]}_decoded.json"
with open(new_file_path, 'w', encoding='utf-8') as new_file:
json.dump(decoded_data, new_file, ensure_ascii=False, indent=4)
print(f"Создан файл: {new_file_path}")
def process_directory(directory_path):
"""
Рекурсивно обрабатывает все JSON-файлы в указанной директории.
"""
for root, _, files in os.walk(directory_path):
for file_name in files:
if file_name.endswith('.json'):
file_path = os.path.join(root, file_name)
print(f"Обработка файла: {file_path}")
process_json_file(file_path)
# Укажите путь к папке с JSON-файлами
directory_path = 'E:\code\kvant.app'
process_directory(directory_path)

View File

@@ -5,14 +5,57 @@ with open('russia.geojson', 'r', encoding='utf-8') as infile:
data = json.load(infile) data = json.load(infile)
# Поля, которые нужно оставить # Поля, которые нужно оставить
fields_to_keep = ['id', 'name', 'full_name', 'major_cities', '_cartodb_id0', 'cartodb_id'] fields_to_keep = ['id', 'name', '_cartodb_id0', 'cartodb_id']
# Обновляем свойства в каждом объекте features
# Функция для округления координат до 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']: for feature in data['features']:
# Сжатие свойств
feature['properties'] = {key: feature['properties'][key] for key in fields_to_keep if key in feature['properties']} 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: with open('russia_2.geojson', 'w', encoding='utf-8') as outfile:
json.dump(data, outfile, ensure_ascii=False, separators=(',', ':')) json.dump(data, outfile, ensure_ascii=False, separators=(',', ':'))
print("Обработка завершена. Результат записан в output.json.") print("Обработка завершена. Результат записан в russia_2.geojson.")

27
main_reg_sort.py Normal file
View File

@@ -0,0 +1,27 @@
import json
# Чтение данных из файла
with open('regions_data.json', 'r', encoding='utf-8') as infile:
data = json.load(infile)
# Функция для заполнения пустых полей
def fill_missing_data(region):
fields = ["population", "square", "additionalInfo"]
for field in fields:
if field not in region or region[field] in [None, ""]:
region[field] = "" # Заполняем пустым значением
return region
# Обработка данных регионов
data['regions'] = [fill_missing_data(region) for region in data['regions']]
data['regions'].sort(key=lambda x: x['id']) # Сортировка регионов по id
# Обработка данных городов
data['cities'] = [fill_missing_data(city) for city in data.get('cities', [])]
data['cities'].sort(key=lambda x: x['id']) # Сортировка городов по id
# Запись обновленных данных в файл
with open('sorted_regions_data.json', 'w', encoding='utf-8') as outfile:
json.dump(data, outfile, ensure_ascii=False, indent=2)
print("Обработка завершена. Данные отсортированы и записаны в sorted_regions_data.json")

2639320
russia.geojson

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long