151100
This commit is contained in:
40
main_clear_json_kwarg.py
Normal file
40
main_clear_json_kwarg.py
Normal 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
55
main_conv_reg_to_city.py
Normal 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
55
main_decoder_text_uni.py
Normal 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)
|
||||||
@@ -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
27
main_reg_sort.py
Normal 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
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
Reference in New Issue
Block a user