-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lectura.py
211 lines (166 loc) · 7.73 KB
/
Lectura.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import tkinter as tk
from tkinter import ttk
from tkinter import simpledialog
from tkinter import messagebox
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from shapely.geometry import LineString
import geopandas as gpd
import fiona
import matplotlib.pyplot as plt
import folium
from IPython.display import IFrame
from IPython.display import display
from shapely.geometry import LineString
import matplotlib.cm as cm
import matplotlib.colors as mcolors
import matplotlib.patches as mpatches
from ipywidgets import Dropdown
from ipywidgets import interact
import numpy as np
import time
import matplotlib.pyplot as plt
fiona.drvsupport.supported_drivers['kml'] = 'rw' # enable KML support which is disabled by default
fiona.drvsupport.supported_drivers['KML'] = 'rw' # enable KML support which is disabled by default
# Ruta al archivo KML
filename = "FORUM8 Rally Japan 2024.kml"
layers = fiona.listlayers(filename)
# Función para cargar el layer seleccionado y la subetapa
def seleccionar_layer_y_subetapa():
# Crear la ventana principal
root = tk.Tk()
root.title("Seleccionar Layer y Subetapa")
# Zona para dibujar el mapa (vacía al principio)
fig, ax = plt.subplots(figsize=(10, 6))
ax.axis('off') # Inicialmente no mostrar nada
# Incrustar el gráfico en Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(padx=10, pady=10)
# Variable para el layer y la subetapa seleccionados
layer_var = tk.StringVar()
subetapa_var = tk.StringVar()
# Desplegable para seleccionar el layer
layer_selector_label = tk.Label(root, text="Seleccionar Layer")
layer_selector_label.pack(pady=10)
layer_selector = ttk.Combobox(root, values=layers, textvariable=layer_var)
layer_selector.pack(padx=10, pady=5)
# Función para cargar las subetapas del layer seleccionado
def cargar_subetapas(event):
selected_layer = layer_var.get()
# Cargar el archivo KML y obtener el layer
gdf = gpd.read_file(filename, driver="KML", layer=selected_layer)
subetapas = gdf['Name'].unique()
# Crear el desplegable para seleccionar subetapa
subetapa_selector = ttk.Combobox(root, values=subetapas, textvariable=subetapa_var)
subetapa_selector.pack(pady=5)
# Vinculamos el evento de selección del layer para cargar las subetapas
layer_selector.bind("<<ComboboxSelected>>", cargar_subetapas)
# Función para visualizar el mapa
def visualizar_mapa():
selected_layer = layer_var.get()
selected_subetapa = subetapa_var.get()
if selected_layer and selected_subetapa:
# Cargar el archivo KML y obtener el layer
gdf = gpd.read_file(filename, driver="KML", layer=selected_layer)
# Filtrar por la subetapa seleccionada
gdf_subetapa = gdf[gdf['Name'] == selected_subetapa]
# Transformar a un CRS proyectado (por ejemplo, UTM o Web Mercator EPSG:3857)
gdf_projected = gdf_subetapa.to_crs(epsg=3099)
# Calcular la longitud de cada tramo en metros
gdf_projected['length_m'] = gdf_projected.length
# Convertir la longitud a kilómetros
gdf_projected['length_km'] = gdf_projected['length_m'] / 1000
# Obtener la longitud total
longitud_total = gdf_projected['length_km'].sum()
# Crear la figura y el eje con matplotlib
fig, ax = plt.subplots(figsize=(10, 6))
# Plotea las geometrías usando geopandas
gdf_projected.plot(ax=ax, color='blue', edgecolor='black')
# Personalizar el gráfico
ax.set_title(f"{selected_subetapa} \n Distancia total {longitud_total:.2f} kms", fontsize=14)
ax.set_xlabel("Longitud (m)", fontsize=10)
ax.set_ylabel("Latitud (m)", fontsize=10)
ax.axis("off")
# Mostrar el mapa dentro de Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(pady=20)
else:
messagebox.showwarning("Advertencia", "Debe seleccionar un layer y una subetapa.")
# Función para continuar con la creación de la leyenda
def continuar_leyenda():
selected_layer = layer_var.get()
selected_subetapa = subetapa_var.get()
if selected_layer and selected_subetapa:
crear_leyenda(selected_layer, selected_subetapa)
else:
messagebox.showwarning("Advertencia", "Debe seleccionar un layer y una subetapa.")
# Botón para visualizar el mapa
boton_visualizar = tk.Button(root, text="Visualización", command=visualizar_mapa)
boton_visualizar.pack(pady=10)
# Botón para continuar con la leyenda
boton_continuar = tk.Button(root, text="Continuar", command=continuar_leyenda)
boton_continuar.pack(pady=10)
# Ejecutar la ventana principal
root.mainloop()
# Función para crear la leyenda
def crear_leyenda(layer, subetapa):
# Crear la ventana de creación de leyenda
root = tk.Tk()
root.title("Crear Leyenda")
# Crear la figura y el eje solo una vez
fig, ax = plt.subplots(figsize=(6, 3))
ax.axis('off') # Ocultar los ejes
# Incrustar el gráfico en Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack()
# Variables globales para almacenar los colores y significados
colors = []
significados = []
# Función para agregar color y significado
def agregar_color_significado():
color = color_entry.get() # Obtener el color seleccionado
significado = significado_entry.get() # Obtener el significado ingresado
if color and significado: # Solo agregar si ambos son válidos
colors.append(color)
significados.append(significado)
graficar_leyenda() # Actualizar la leyenda con los nuevos datos
# Limpiar los campos para la siguiente entrada
color_entry.delete(0, tk.END)
significado_entry.delete(0, tk.END)
# Función para graficar la leyenda
def graficar_leyenda():
# Limpiar los ejes antes de graficar nuevamente
ax.clear()
ax.axis('off') # Asegurarse de que los ejes estén ocultos
# Dibujar cada color y su significado
for i, (color, significado) in enumerate(zip(colors, significados)):
ax.add_patch(plt.Rectangle((0, i), 2, 1, color=color)) # Rectángulo con el color
ax.text(2.1, i + 0.45, significado, va='center', fontsize=12)
# Ajustar los límites del gráfico
ax.set_xlim(0, 3)
ax.set_ylim(0, len(colors))
# Actualizar la imagen en el canvas
canvas.draw()
# Crear los campos para color y significado
color_label = tk.Label(root, text="Ingresa el color (en formato nombre o hexadecimal):")
color_label.pack(pady=5)
color_entry = tk.Entry(root)
color_entry.pack(pady=5)
significado_label = tk.Label(root, text="Ingresa el significado:")
significado_label.pack(pady=5)
significado_entry = tk.Entry(root)
significado_entry.pack(pady=5)
# Botón para agregar color y significado
boton_agregar = tk.Button(root, text="Agregar Color y Significado", command=agregar_color_significado)
boton_agregar.pack(pady=10)
# Botón para ir al siguiente paso
def siguiente_paso():
print("Avanzar al siguiente paso") # Aquí puedes definir lo que debe hacer el siguiente paso
boton_siguiente = tk.Button(root, text="Siguiente Paso", command=siguiente_paso)
boton_siguiente.pack(pady=10)
# Ejecutar la ventana de leyenda
root.mainloop()
# Llamamos a la función principal para iniciar el proceso
seleccionar_layer_y_subetapa()