ESJL commited on
Commit
b5b80df
·
verified ·
1 Parent(s): 5f88845

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -0
app.py ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import geopandas as gpd
4
+ import openpyxl
5
+
6
+ # ---------------------------------------
7
+ # Função para formatar visualização
8
+ # ---------------------------------------
9
+ def formatar_float_visualizacao(df, casas=4):
10
+ df_visual = df.copy()
11
+ float_cols = df_visual.select_dtypes(include=['float']).columns
12
+ df_visual[float_cols] = df_visual[float_cols].round(casas)
13
+ return df_visual
14
+
15
+ # ---------------------------------------
16
+ # Carregar shapefile dos eixos
17
+ # ---------------------------------------
18
+ gdf_eixos = gpd.read_file("EixosLogradouros.shp", engine="fiona")
19
+ gdf_eixos_proj = gdf_eixos.to_crs("EPSG:4326")
20
+
21
+ # ---------------------------------------
22
+ # Funções auxiliares
23
+ # ---------------------------------------
24
+ def carregar_abas(arquivo_excel):
25
+ if arquivo_excel is None:
26
+ return gr.update(choices=[]), None
27
+ xls = pd.ExcelFile(arquivo_excel.name)
28
+ abas = xls.sheet_names
29
+ return gr.update(choices=abas, value=abas[0]), abas[0]
30
+
31
+
32
+ def listar_colunas(arquivo_excel, aba_selecionada):
33
+ if arquivo_excel is None or aba_selecionada is None:
34
+ return gr.update(choices=[]), gr.update(choices=[])
35
+
36
+ df = pd.read_excel(arquivo_excel.name, sheet_name=aba_selecionada)
37
+ colunas = df.columns.tolist()
38
+ return gr.update(choices=colunas), gr.update(choices=colunas)
39
+
40
+
41
+ def exibir_tabela(arquivo_excel, aba_selecionada, nome_coluna_num):
42
+ if arquivo_excel is None or aba_selecionada is None:
43
+ return None, ""
44
+
45
+ df = pd.read_excel(arquivo_excel.name, sheet_name=aba_selecionada)
46
+
47
+ if nome_coluna_num in df.columns:
48
+ df[nome_coluna_num] = pd.to_numeric(df[nome_coluna_num], errors='coerce').fillna(0).astype(int)
49
+
50
+ return formatar_float_visualizacao(df), f"O DataFrame possui {df.shape[0]} linhas e {df.shape[1]} colunas."
51
+
52
+
53
+ def obter_cdlog_por_nmidelog(nome_logradouro):
54
+ if not nome_logradouro:
55
+ return None
56
+ cdlog_unicos = gdf_eixos_proj[gdf_eixos_proj["NMIDEABR"] == nome_logradouro]["CDLOG"].unique()
57
+ return int(cdlog_unicos[0]) if len(cdlog_unicos) > 0 else None
58
+
59
+
60
+ # ---------------------------------------
61
+ # Interpolação
62
+ # ---------------------------------------
63
+ def interpolar_enderecos(df, col_cdlog, col_num):
64
+
65
+ df[col_num] = pd.to_numeric(df[col_num], errors='coerce').fillna(0).astype(int)
66
+ resultados = []
67
+ falhas = []
68
+
69
+ for _, row in df.iterrows():
70
+
71
+ cdlog = row[col_cdlog]
72
+ numero = row[col_num]
73
+
74
+ segmentos = gdf_eixos_proj[gdf_eixos_proj['CDLOG'] == cdlog]
75
+
76
+ if segmentos.empty:
77
+ resultados.append((None, None))
78
+ falhas.append({"cdlog": cdlog, "numero": numero, "motivo": "CDLOG não encontrado"})
79
+ continue
80
+
81
+ if numero % 2 == 0:
82
+ cond = (segmentos['NRPARINI'] <= numero) & (segmentos['NRPARFIN'] >= numero)
83
+ else:
84
+ cond = (segmentos['NRIMPINI'] <= numero) & (segmentos['NRIMPFIN'] >= numero)
85
+
86
+ segmentos_validos = segmentos[cond]
87
+
88
+ if segmentos_validos.empty:
89
+ resultados.append((None, None))
90
+ falhas.append({"cdlog": cdlog, "numero": numero, "motivo": "Numeração fora do intervalo"})
91
+ continue
92
+
93
+ linha = segmentos_validos.iloc[0]
94
+ geom = linha.geometry
95
+
96
+ ini = linha['NRPARINI'] if numero % 2 == 0 else linha['NRIMPINI']
97
+ fim = linha['NRPARFIN'] if numero % 2 == 0 else linha['NRIMPFIN']
98
+
99
+ frac = (numero - ini) / (fim - ini)
100
+ frac = max(0, min(1, frac))
101
+
102
+ ponto = geom.interpolate(geom.length * frac)
103
+
104
+ resultados.append((ponto.x, ponto.y))
105
+
106
+ df["lon"] = [x for x, y in resultados]
107
+ df["lat"] = [y for x, y in resultados]
108
+
109
+ output_path = "dados_interpolados.xlsx"
110
+ df.to_excel(output_path, index=False)
111
+
112
+ return formatar_float_visualizacao(df), output_path, pd.DataFrame(falhas)
113
+
114
+
115
+ # ---------------------------------------
116
+ # Interface
117
+ # ---------------------------------------
118
+ with gr.Blocks() as app:
119
+
120
+ gr.Markdown("## DAI - Geolocalização (Sem Mapa)")
121
+
122
+ arquivo = gr.File(label="Arquivo Excel", file_types=[".xlsx"])
123
+
124
+ dropdown_abas = gr.Dropdown(label="Aba")
125
+ linhas_colunas_output = gr.Textbox(label="Linhas e Colunas", interactive=False)
126
+
127
+ dropdown_cdlog = gr.Dropdown(label="Coluna CDLOG")
128
+ dropdown_num = gr.Dropdown(label="Coluna Número")
129
+
130
+ tabela_output = gr.Dataframe(label="Prévia", interactive=True)
131
+
132
+ btn_confirmar = gr.Button("Confirmar Dados")
133
+ btn_interpolar = gr.Button("Obter Coordenadas")
134
+
135
+ tabela_interpolada = gr.Dataframe(label="Com Coordenadas")
136
+ arquivo_excel_output = gr.File(label="Arquivo Gerado")
137
+ falhas_output = gr.Dataframe(label="Falhas")
138
+
139
+ # Eventos
140
+ arquivo.change(fn=carregar_abas, inputs=arquivo, outputs=[dropdown_abas, dropdown_abas])
141
+
142
+ dropdown_abas.change(
143
+ fn=exibir_tabela,
144
+ inputs=[arquivo, dropdown_abas, dropdown_num],
145
+ outputs=[tabela_output, linhas_colunas_output]
146
+ ).then(
147
+ fn=listar_colunas,
148
+ inputs=[arquivo, dropdown_abas],
149
+ outputs=[dropdown_cdlog, dropdown_num]
150
+ )
151
+
152
+ btn_interpolar.click(
153
+ fn=interpolar_enderecos,
154
+ inputs=[tabela_output, dropdown_cdlog, dropdown_num],
155
+ outputs=[tabela_interpolada, arquivo_excel_output, falhas_output]
156
+ )
157
+
158
+ app.launch(server_name="0.0.0.0", server_port=7860)