From bccbcad79fd4790a42a00c1bc99364e3edeaaa0b Mon Sep 17 00:00:00 2001 From: jze9 Date: Wed, 23 Apr 2025 02:32:30 +0500 Subject: [PATCH] finish logic --- .python-version | 1 + README.md | 0 __pycache__/algam.cpython-313.pyc | Bin 0 -> 3454 bytes __pycache__/algam_pars_mif.cpython-313.pyc | Bin 0 -> 2554 bytes __pycache__/save.cpython-313.pyc | Bin 0 -> 2143 bytes algam.py | 51 ++++++ algam_pars_mif.py | 49 ++++++ main.py | 54 ++++++ pyproject.toml | 12 ++ save.py | 25 +++ uv.lock | 192 +++++++++++++++++++++ 11 files changed, 384 insertions(+) create mode 100644 .python-version create mode 100644 README.md create mode 100644 __pycache__/algam.cpython-313.pyc create mode 100644 __pycache__/algam_pars_mif.cpython-313.pyc create mode 100644 __pycache__/save.cpython-313.pyc create mode 100644 algam.py create mode 100644 algam_pars_mif.py create mode 100644 main.py create mode 100644 pyproject.toml create mode 100644 save.py create mode 100644 uv.lock diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/algam.cpython-313.pyc b/__pycache__/algam.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f048a2ce166c4c4fc761bb167ed8340a9284f5d GIT binary patch literal 3454 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 O3&*TmbP0^tRQeD7&Z~ zi}8F*)sov0j>CG9TmrO4n5YR%(!@)$CS8(G$eNramu04CAuRx30t;wC7Az@hm`62Z zmYy{{W9qy%)s!Fz4;M{~>J`JA;SqO+Qct&yGR?O$VcsD8(0B6-0kd92oj)eG_S;_L z+(&YPCJYObbsWelMo+A7dclWqzch1^MDSwv^(Wg z3DKIE3r+g>z0(GIX;?~;e?`iGjP6F^>J^X*Aou+*WB`zz|Af5oDIpyMb}dhK{oN-g zwC^TGN<i8*sTkaw(V+2+cuVO1%^5;XDpoA{+hxHxa|nB^D+ zea>N5rXA-B50;I29kF3*SId+c9_4bLS{4r%Oh)sb!)iQ|2MCy_DdTaYP%u5yu?bbADbKPvT;kQ|-au z&dxYxn!S9D4rk9gdDxfjx!IEGWv>_o!}ZwUU>37wDm5O`VH>8W>%3=YgJ;@mJiq%L zh|kEgSbQzk`#9FSTw9F|*2VSCL}OoFSx+2XI@UP0EHtw9;Il)AmkZxcES#@@xE|eq zV{BpU)~RpK+)dvfc$j&RsgJEjKYCf8eUL@{*h~7gk@3}$akNalWO;bx!IApdljsM} z!=(4KIJxx+v^)Zol`n1+Qj?O(QeXq&H|j_!XW}anv9wE zBC9K=$Uv+0r9COBAk_zm8W{gX6&dE{VMd`F9owqqx1J1ti+Drtz;AODL_d&ek>v0( zfo^m5Px>yqg+|VkS+c04$c63}{YvDNR21$AKrj{qXI124<~Rc@aj_t&6idOx!=oi? z)Abg%#Rz|u%# zWV!ok*Wr8pzq?Q^@_F)*z%XkQPpJkOz8-8p2p%x3)6bOykTCT?6&^pT!faiJ_JLCyAl8_|TL1(E7pTt-;3Z(zV95$DQft3h6$) z5h0yDH?A*Szjbvro_Z8Yv3^K(hp;zcQbS03eEfj)5nV4kg)01w={&0I@Dy2Fmbl(3 zg=N~*cEBvb!@<%JfMr4O9$j}m!!z@`;d#uQu6oqfbvB3&n9aW*hNbWY_LrLk@g><1 zBgz}g(guO)w)-niFAhYMbPI+Ec#uO*h1!+cywxh4A7^)L9vW?J{WKc}43^o&>TO7Z SApA&rUdRW8^e+U2ANWtmt;2i( literal 0 HcmV?d00001 diff --git a/algam.py b/algam.py new file mode 100644 index 0000000..42b65a3 --- /dev/null +++ b/algam.py @@ -0,0 +1,51 @@ +import os +import re +from shapely.geometry import Polygon +from algam_pars_mif import UnpackingMif + +class MifData: + def __init__(self,directory,name,cad_number,additional_info,square): + self.directory:str=directory + self.name:str=name + self.cad_number:str=cad_number + self.additional_info:str=additional_info + self.square:float=square + +class ReadMifDirectory(): + def __init__(self): + pass + + def find_mif_files(self,directory:str): + mif_files = [] # Список для хранения найденных MIF файлов + # Проходим по всем поддиректориям и файлам + for root, dirs, files in os.walk(directory): + for file in files: + # Проверяем, заканчивается ли имя файла на .mif + if file.lower().endswith('.mif'): + + cad_match = re.search(r'(?:\d+[_\W]*)+\d+', file) + if cad_match: + cad_number = re.sub(r'[^\d_]', '_', cad_match.group()) # Заменяем все НЕ цифры/подчёркивания на _ + cad_number = re.sub(r'_+', '_', cad_number).strip('_') # Чистим подчёркивания + # Берём текст ПОСЛЕ кадастрового номера (игнорируя разделители после него) + additional_info = file[cad_match.end():] + if cad_number.count('_') < 3: + cad_number = "" + additional_info = file + + + additional_info = re.sub(r'\.[^.]+$', '', additional_info) # Удаляем расширение + additional_info = re.sub(r'\s+', '_', additional_info) # Заменяем пробелы на _ + additional_info = re.sub(r'^[^\wа-яА-ЯёЁ]*', '', additional_info) # Удаляем спецсимволы в начале + additional_info = re.sub(r'[^\wа-яА-ЯёЁ_]', '', additional_info) # Удаляем оставшиеся спецсимволы + additional_info = re.sub(r'_+', '_', additional_info).strip('_') + + mif_files.append(MifData( + directory=os.path.join(root, file), + name=os.path.basename(file), + cad_number=cad_number, + additional_info=additional_info, + square=UnpackingMif(file_directory=os.path.join(root, file)) + )) + print(f"{mif_files[0].directory=}/{mif_files[0].name=}/{mif_files[0].cad_number=}/{mif_files[0].additional_info=}/{mif_files[0].square=}") + return mif_files \ No newline at end of file diff --git a/algam_pars_mif.py b/algam_pars_mif.py new file mode 100644 index 0000000..b07b245 --- /dev/null +++ b/algam_pars_mif.py @@ -0,0 +1,49 @@ +import os +import re +import numpy as np +import math + + +def UnpackingMif(file_directory: str): + try: + x, y = [], [] + readMif(file_directory, x, y) + temp_square=Square(x, y) + x.clear() + y.clear() + return temp_square + except FileNotFoundError: + return 0 + +def readMif(path: str, x, y): + with open(path,'r', encoding='Windows-1251') as file: + t = [] + region = False + for line in file: + if 'Region' in line: + region = True + continue + if region: + t.append(line) + t = t[1:-3] + for ch in t: + ch = re.sub('[\n]', '', ch) + ch = ch.split(" ") + if check_float(ch[0]) and check_float(ch[1]): + y.append(round(float(ch[0]), 2)) + x.append(round(float(ch[1]), 2)) + else: + continue + +def Square(x, y): + area = 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))) + rounded_area = math.ceil(area - 0.5) if (area % 1) >= 0.5 else round(area) + return int(rounded_area) # Возвращаем целое число + #return round(0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))), 0) + +def check_float(var): + try: + float(var) + except ValueError: + return False + return True \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..fbd3073 --- /dev/null +++ b/main.py @@ -0,0 +1,54 @@ +import tkinter as tk +from tkinter import filedialog +import algam +import save + + +#def Pars(): +# if algam.isint(enumer.get()): +# algam.split_file(input_file=excel_entry1.get(), chunk_size=int(enumer.get()),output_dir=directory_entry.get()) +# else: +# excel_label4 = tk.Label(root, text="должны быть только целочисленные цисла от 20 до 500", font=font) +# excel_label4.pack(anchor="w") + +def Pars(): + data = algam.ReadMifDirectory().find_mif_files(directory=directory_entry.get()) + + save.SaveDataXLSX(file_path=file_to_save_entry.get(),sheet_name="Лист1",data=data) + +root = tk.Tk() +root.title("Parser11(отяет по mif)") +font = ("Arial", 12) +root.configure(bg="#B85C38") +options = [""] + +#путь для сохранения файлов +def open_directory(event, entry): + directory_path = filedialog.askdirectory() + entry.delete(0, tk.END) + entry.insert(0, directory_path) + +# первое поле с списком +def open_excel_file(event, entry): + excel_path = filedialog.askopenfilename(filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*"))) + entry.delete(0, tk.END) + entry.insert(0, excel_path) + +# первое поле с списком +file_to_save_label = tk.Label(root, text="файл_для_сохранения", font=font) +file_to_save_label.pack(anchor="w") +file_to_save_entry = tk.Entry(root, font=font, width=70) +file_to_save_entry.pack(anchor="w") +file_to_save_entry.bind("", lambda event: open_excel_file(event, file_to_save_entry)) + +directory_label = tk.Label(root, text="Выберите директорию c mif:", font=font) +directory_label.pack(anchor="w") +directory_entry = tk.Entry(root, font=font, width=70) +directory_entry.pack(anchor="w") +directory_entry.bind("", lambda event: open_directory(event, directory_entry)) + +# кнопка +empty_button = tk.Button(root, text="->", command=Pars, font=font) +empty_button.pack(side="right", padx=10, pady=10) + +root.mainloop() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0693cd --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "kadastr11" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "openpyxl>=3.1.5", + "pandas>=2.2.3", + "pyproj>=3.7.1", + "shapely>=2.1.0", +] diff --git a/save.py b/save.py new file mode 100644 index 0000000..4844b79 --- /dev/null +++ b/save.py @@ -0,0 +1,25 @@ +import openpyxl as xl + +class SaveDataXLSX(): + def __init__(self,file_path:str,sheet_name:str,data): + wb = xl.load_workbook(filename=file_path) + sheet = wb[sheet_name] + max_row = sheet.max_row+2 + for new_row,file in enumerate(data): + sheet.cell(row=max_row+new_row,column=2,value=file.directory) + sheet.cell(row=max_row+new_row,column=3,value=file.cad_number) + sheet.cell(row=max_row+new_row,column=4,value=file.additional_info) + sheet.cell(row=max_row+new_row,column=5,value=file.square) + + wb.save(file_path) + def find_first_empty_row(file_path, sheet_name=None): + wb = xl.load_workbook(filename=file_path, read_only=True) + sheet = wb[sheet_name] if sheet_name else wb.active + + # Перебираем строки до первой пустой + for row in sheet.iter_rows(): + if all(cell.value is None for cell in row): + return row[0].row # Возвращаем номер строки (1-based) + + # Если все строки заполнены, возвращаем следующую после последней + return sheet.max_row + 1 \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..0560ca2 --- /dev/null +++ b/uv.lock @@ -0,0 +1,192 @@ +version = 1 +revision = 1 +requires-python = ">=3.13" + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, +] + +[[package]] +name = "kadastr11" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "openpyxl" }, + { name = "pandas" }, + { name = "pyproj" }, + { name = "shapely" }, +] + +[package.metadata] +requires-dist = [ + { name = "openpyxl", specifier = ">=3.1.5" }, + { name = "pandas", specifier = ">=2.2.3" }, + { name = "pyproj", specifier = ">=3.7.1" }, + { name = "shapely", specifier = ">=2.1.0" }, +] + +[[package]] +name = "numpy" +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/b2/ce4b867d8cd9c0ee84938ae1e6a6f7926ebf928c9090d036fc3c6a04f946/numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", size = 20273920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/a0/0aa7f0f4509a2e07bd7a509042967c2fab635690d4f48c6c7b3afd4f448c/numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", size = 20935102 }, + { url = "https://files.pythonhosted.org/packages/7e/e4/a6a9f4537542912ec513185396fce52cdd45bdcf3e9d921ab02a93ca5aa9/numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", size = 14191709 }, + { url = "https://files.pythonhosted.org/packages/be/65/72f3186b6050bbfe9c43cb81f9df59ae63603491d36179cf7a7c8d216758/numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", size = 5149173 }, + { url = "https://files.pythonhosted.org/packages/e5/e9/83e7a9432378dde5802651307ae5e9ea07bb72b416728202218cd4da2801/numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", size = 6684502 }, + { url = "https://files.pythonhosted.org/packages/ea/27/b80da6c762394c8ee516b74c1f686fcd16c8f23b14de57ba0cad7349d1d2/numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", size = 14084417 }, + { url = "https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", size = 16133807 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/4cc171a0acbe4666f7775cfd21d4eb6bb1d36d3a0431f48a73e9212d2278/numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", size = 15575611 }, + { url = "https://files.pythonhosted.org/packages/a3/45/40f4135341850df48f8edcf949cf47b523c404b712774f8855a64c96ef29/numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", size = 17895747 }, + { url = "https://files.pythonhosted.org/packages/f8/4c/b32a17a46f0ffbde8cc82df6d3daeaf4f552e346df143e1b188a701a8f09/numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", size = 6309594 }, + { url = "https://files.pythonhosted.org/packages/13/ae/72e6276feb9ef06787365b05915bfdb057d01fceb4a43cb80978e518d79b/numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", size = 12638356 }, + { url = "https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", size = 20963778 }, + { url = "https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", size = 14207279 }, + { url = "https://files.pythonhosted.org/packages/75/22/aa11f22dc11ff4ffe4e849d9b63bbe8d4ac6d5fae85ddaa67dfe43be3e76/numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", size = 5199247 }, + { url = "https://files.pythonhosted.org/packages/4f/6c/12d5e760fc62c08eded0394f62039f5a9857f758312bf01632a81d841459/numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", size = 6711087 }, + { url = "https://files.pythonhosted.org/packages/ef/94/ece8280cf4218b2bee5cec9567629e61e51b4be501e5c6840ceb593db945/numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", size = 14059964 }, + { url = "https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", size = 16121214 }, + { url = "https://files.pythonhosted.org/packages/db/54/3b9f89a943257bc8e187145c6bc0eb8e3d615655f7b14e9b490b053e8149/numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", size = 15575788 }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2e407e85df35b29f79945751b8f8e671057a13a376497d7fb2151ba0d290/numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", size = 17893672 }, + { url = "https://files.pythonhosted.org/packages/29/7e/d0b44e129d038dba453f00d0e29ebd6eaf2f06055d72b95b9947998aca14/numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", size = 6377102 }, + { url = "https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", size = 12750096 }, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "et-xmlfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "pyproj" +version = "3.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/10/a8480ea27ea4bbe896c168808854d00f2a9b49f95c0319ddcbba693c8a90/pyproj-3.7.1.tar.gz", hash = "sha256:60d72facd7b6b79853f19744779abcd3f804c4e0d4fa8815469db20c9f640a47", size = 226339 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/01/984828464c9960036c602753fc0f21f24f0aa9043c18fa3f2f2b66a86340/pyproj-3.7.1-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:5f8d02ef4431dee414d1753d13fa82a21a2f61494737b5f642ea668d76164d6d", size = 6253062 }, + { url = "https://files.pythonhosted.org/packages/68/65/6ecdcdc829811a2c160cdfe2f068a009fc572fd4349664f758ccb0853a7c/pyproj-3.7.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:0b853ae99bda66cbe24b4ccfe26d70601d84375940a47f553413d9df570065e0", size = 4660548 }, + { url = "https://files.pythonhosted.org/packages/67/da/dda94c4490803679230ba4c17a12f151b307a0d58e8110820405ca2d98db/pyproj-3.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83db380c52087f9e9bdd8a527943b2e7324f275881125e39475c4f9277bdeec4", size = 9662464 }, + { url = "https://files.pythonhosted.org/packages/6f/57/f61b7d22c91ae1d12ee00ac4c0038714e774ebcd851b9133e5f4f930dd40/pyproj-3.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b35ed213892e211a3ce2bea002aa1183e1a2a9b79e51bb3c6b15549a831ae528", size = 9497461 }, + { url = "https://files.pythonhosted.org/packages/b7/f6/932128236f79d2ac7d39fe1a19667fdf7155d9a81d31fb9472a7a497790f/pyproj-3.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a8b15b0463d1303bab113d1a6af2860a0d79013c3a66fcc5475ce26ef717fd4f", size = 10708869 }, + { url = "https://files.pythonhosted.org/packages/1d/0d/07ac7712994454a254c383c0d08aff9916a2851e6512d59da8dc369b1b02/pyproj-3.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:87229e42b75e89f4dad6459200f92988c5998dfb093c7c631fb48524c86cd5dc", size = 10729260 }, + { url = "https://files.pythonhosted.org/packages/b0/d0/9c604bc72c37ba69b867b6df724d6a5af6789e8c375022c952f65b2af558/pyproj-3.7.1-cp313-cp313-win32.whl", hash = "sha256:d666c3a3faaf3b1d7fc4a544059c4eab9d06f84a604b070b7aa2f318e227798e", size = 5855462 }, + { url = "https://files.pythonhosted.org/packages/98/df/68a2b7f5fb6400c64aad82d72bcc4bc531775e62eedff993a77c780defd0/pyproj-3.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:d3caac7473be22b6d6e102dde6c46de73b96bc98334e577dfaee9886f102ea2e", size = 6266573 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, +] + +[[package]] +name = "shapely" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/fe/3b0d2f828ffaceadcdcb51b75b9c62d98e62dd95ce575278de35f24a1c20/shapely-2.1.0.tar.gz", hash = "sha256:2cbe90e86fa8fc3ca8af6ffb00a77b246b918c7cf28677b7c21489b678f6b02e", size = 313617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/77/4e368704b2193e74498473db4461d697cc6083c96f8039367e59009d78bd/shapely-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b64423295b563f43a043eb786e7a03200ebe68698e36d2b4b1c39f31dfb50dfb", size = 1830029 }, + { url = "https://files.pythonhosted.org/packages/71/3c/d888597bda680e4de987316b05ca9db07416fa29523beff64f846503302f/shapely-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1b5578f45adc25b235b22d1ccb9a0348c8dc36f31983e57ea129a88f96f7b870", size = 1637999 }, + { url = "https://files.pythonhosted.org/packages/03/8d/ee0e23b7ef88fba353c63a81f1f329c77f5703835db7b165e7c0b8b7f839/shapely-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a7e83d383b27f02b684e50ab7f34e511c92e33b6ca164a6a9065705dd64bcb", size = 2929348 }, + { url = "https://files.pythonhosted.org/packages/d1/a7/5c9cb413e4e2ce52c16be717e94abd40ce91b1f8974624d5d56154c5d40b/shapely-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:942031eb4d8f7b3b22f43ba42c09c7aa3d843aa10d5cc1619fe816e923b66e55", size = 3048973 }, + { url = "https://files.pythonhosted.org/packages/84/23/45b90c0bd2157b238490ca56ef2eedf959d3514c7d05475f497a2c88b6d9/shapely-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2843c456a2e5627ee6271800f07277c0d2652fb287bf66464571a057dbc00b3", size = 3873148 }, + { url = "https://files.pythonhosted.org/packages/c0/bc/ed7d5d37f5395166042576f0c55a12d7e56102799464ba7ea3a72a38c769/shapely-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8c4b17469b7f39a5e6a7cfea79f38ae08a275427f41fe8b48c372e1449147908", size = 4052655 }, + { url = "https://files.pythonhosted.org/packages/c0/8f/a1dafbb10d20d1c569f2db3fb1235488f624dafe8469e8ce65356800ba31/shapely-2.1.0-cp313-cp313-win32.whl", hash = "sha256:30e967abd08fce49513d4187c01b19f139084019f33bec0673e8dbeb557c45e4", size = 1526600 }, + { url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5", size = 1707115 }, + { url = "https://files.pythonhosted.org/packages/75/ed/32952df461753a65b3e5d24c8efb361d3a80aafaef0b70d419063f6f2c11/shapely-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:673e073fea099d1c82f666fb7ab0a00a77eff2999130a69357ce11941260d855", size = 1824847 }, + { url = "https://files.pythonhosted.org/packages/ff/b9/2284de512af30b02f93ddcdd2e5c79834a3cf47fa3ca11b0f74396feb046/shapely-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d1513f915a56de67659fe2047c1ad5ff0f8cbff3519d1e74fced69c9cb0e7da", size = 1631035 }, + { url = "https://files.pythonhosted.org/packages/35/16/a59f252a7e736b73008f10d0950ffeeb0d5953be7c0bdffd39a02a6ba310/shapely-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6a7043178890b9e028d80496ff4c79dc7629bff4d78a2f25323b661756bab8", size = 2968639 }, + { url = "https://files.pythonhosted.org/packages/a5/0a/6a20eca7b0092cfa243117e8e145a58631a4833a0a519ec9b445172e83a0/shapely-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb638378dc3d76f7e85b67d7e2bb1366811912430ac9247ac00c127c2b444cdc", size = 3055713 }, + { url = "https://files.pythonhosted.org/packages/fb/44/eeb0c7583b1453d1cf7a319a1d738e08f98a5dc993fa1ef3c372983e4cb5/shapely-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:737124e87d91d616acf9a911f74ac55e05db02a43a6a7245b3d663817b876055", size = 3890478 }, + { url = "https://files.pythonhosted.org/packages/5d/6e/37ff3c6af1d408cacb0a7d7bfea7b8ab163a5486e35acb08997eae9d8756/shapely-2.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e6c229e7bb87aae5df82fa00b6718987a43ec168cc5affe095cca59d233f314", size = 4036148 }, + { url = "https://files.pythonhosted.org/packages/c8/6a/8c0b7de3aeb5014a23f06c5e9d3c7852ebcf0d6b00fe660b93261e310e24/shapely-2.1.0-cp313-cp313t-win32.whl", hash = "sha256:a9580bda119b1f42f955aa8e52382d5c73f7957e0203bc0c0c60084846f3db94", size = 1535993 }, + { url = "https://files.pythonhosted.org/packages/a8/91/ae80359a58409d52e4d62c7eacc7eb3ddee4b9135f1db884b6a43cf2e174/shapely-2.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e8ff4e5cfd799ba5b6f37b5d5527dbd85b4a47c65b6d459a03d0962d2a9d4d10", size = 1717777 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, +]