Files
kadastr12/main1.py
2025-06-08 01:12:22 +05:00

182 lines
8.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from lxml import etree
from difflib import SequenceMatcher
data=[]
class Data_farame():
def __init__(self,section_KPTR,cadastral_number,cadastral_quarter,object_type,land_plot_area,error_in_determining_area,availability_coordinates,explanations):
self.section_KPTR = section_KPTR #Раздел КПТР
self.cadastral_number = cadastral_number #Кадастровый номер
self.cadastral_quarter = cadastral_quarter #Кадастровый квартал
self.object_type = object_type #Вид объекта
self.land_plot_area = land_plot_area #Площадь ЗУ
self.error_in_determining_area = error_in_determining_area #Погрешность определения площади
self.availability_coordinates = availability_coordinates #наличие координат
self.explanations = explanations #Пояснения
class super_visor():
def find_best_match(self,input_str: str) -> str:
keywords = {
"FormParcels":"Образование ЗУ",
"SpecifyParcels":"Уточнение ЗУ",
"CadastralErrorsParcels":"Исправление ЗУ",
"ExistObjectsRealty":"Уточнение ОКС",
"CadastralErrorsOKS":"Исправление ОКС"
}
# Сравниваем коэффициент схожести (0.0 - 1.0) строки с каждым ключевым словом
best_match = max(keywords, key=lambda word: SequenceMatcher(None, input_str, word.lower()).ratio())
return keywords[best_match]
def chec_kad_number(self,atrebut):
if '@attributes' in atrebut:
if 'CadastralNumber' in atrebut['@attributes']:
return atrebut['@attributes']['CadastralNumber']
if 'CadastralNumber' in atrebut:
if '#text' in atrebut['CadastralNumber'][0]:
return atrebut['CadastralNumber'][0]['#text']
return "нет"
def get_cad_block(self,cad_block):
temp = ""
for item in cad_block:
temp += f"{item['#text']}, "
return temp
def chec_cad_block(self, atrebut):
if 'CadastralBlocks' in atrebut:
if 'CadastralBlock' in atrebut['CadastralBlocks'][0]:
return self.get_cad_block(atrebut['CadastralBlocks'][0]['CadastralBlock'])
if 'CadastralBlock' in atrebut:
return atrebut['CadastralBlock'][0]['#text']
return "нет"
def get_object_type(self,type:str):
if type == "002001002000":
return "Здание"
if type == "002001004000":
return "Сооружение"
if type == "002001005000":
return "Объект"
def chec_object_type(self, atrebut):
if 'ObjectType' in atrebut:
return self.get_object_type(atrebut['ObjectType'][0]['#text'])
return "нет"
def chec_area(self,atrebut):
if "Area" in atrebut:
if "Area" in atrebut['Area'][0]:
if '#text' in atrebut['Area'][0]['Area'][0]:
return atrebut['Area'][0]['Area'][0]['#text']
return "нет"
def chec_inaccuracy(self, atrebut):
if "Area" in atrebut:
if "Inaccuracy" in atrebut['Area'][0]:
if '#text' in atrebut['Area'][0]['Inaccuracy'][0]:
return atrebut['Area'][0]['Inaccuracy'][0]['#text']
return "нет"
def chec_koordinat(self,atrebut):
if 'EntitySpatial' in atrebut:
if 'SpatialElement' in atrebut['EntitySpatial'][0]:
return "да"
else:
return "нет"
else:
return "нет"
def chec_explanations(self,atrebut):
if 'Explanations' in atrebut:
return atrebut['Explanations'][0]['#text']
return "нет"
def chec_object(self, atrebut):
if '@attributes' in atrebut:
if 'CadastralNumber' in atrebut['@attributes']:
return True
if 'CadastralNumber' in atrebut:
if '#text' in atrebut['CadastralNumber'][0]:
return True
return False
def __init__(self, xml):
i = 0
for section_name, section_data in xml.get('Package', [{}])[0].items():
for group in section_data:
if isinstance(group, dict):
for item_type, item_list in group.items():
for obj in item_list:
if isinstance(obj, dict):
if self.chec_object(obj):
data.append(
Data_farame(
section_KPTR=self.find_best_match(section_name),
cadastral_number=self.chec_kad_number(obj),
cadastral_quarter=self.chec_cad_block(obj),
object_type=self.chec_object_type(obj),
land_plot_area=self.chec_area(obj),
error_in_determining_area=self.chec_inaccuracy(obj),
availability_coordinates=self.chec_koordinat(obj),
explanations=self.chec_explanations(obj)
)
)
else:
for inner_key, inner_items in obj.items():
for real_obj in inner_items:
if isinstance(real_obj, dict):
data.append(
Data_farame(
section_KPTR=self.find_best_match(section_name),
cadastral_number=self.chec_kad_number(real_obj),
cadastral_quarter=self.chec_cad_block(real_obj),
object_type=self.chec_object_type(real_obj),
land_plot_area=self.chec_area(real_obj),
error_in_determining_area=self.chec_inaccuracy(real_obj),
availability_coordinates=self.chec_koordinat(real_obj),
explanations=self.chec_explanations(real_obj)
)
)
pass
def lxml_to_dict(element):
result = {}
# Обрабатываем атрибуты (если есть)
if element.attrib:
result["@attributes"] = element.attrib
# Обрабатываем текстовое содержимое (если есть)
if element.text and element.text.strip():
result["#text"] = element.text.strip()
# Группируем все дочерние элементы в списки
children_by_tag = {}
for child in element:
child_tag = child.tag
if child_tag not in children_by_tag:
children_by_tag[child_tag] = []
children_by_tag[child_tag].append(lxml_to_dict(child))
# Добавляем в результат (всегда списками)
for tag, children in children_by_tag.items():
result[tag] = children # Всегда массив, даже если элемент один
return result
#tree = etree.parse('C:/Users/jze9/Downloads/12. ХМЛ КПТР в ексель/Исходные данные/Карта-план в хмл прмиер Копейск на кк 74 30 0104002/MapPlanTerritory_EA8F3032-3AF5-4FE2-9A0D-72BCCF94DF06.xml')
#tree = etree.parse('C:/Users/jze9/Downloads/12. ХМЛ КПТР в ексель/Исходные данные/Карта-план в хмл прмиер Копейск на кк 74 30 0104002/MapPlanTerritory_54F3719F-2ED8-48FF-8442-9813191EBA51.xml')
tree = etree.parse('C:/Users/jze9/Downloads/12. ХМЛ КПТР в ексель/Исходные данные/Карта-план в хмл прмиер Копейск на кк 74 30 0104002/MapPlanTerritory_E2DF5B75-E136-48DA-BB4C-8887BA4ABF46.xml')
xml_dict = lxml_to_dict(tree.getroot())
temp = super_visor(xml_dict)
pass