Я пытался добавить линию маршрута в простое приложение tkintermapview, но не могу найти код, который подходит под мои нужды. У меня есть список из около 10 мест, для которых мне нужно рассчитать расстояние по определенному маршруту, чтобы получить стоимость транспортировки.
Я пытался использовать строку кода, которую получил с помощью ИИ, но она не сработала, и во время поиска я нашел лишь информацию о других инструментах карт для Python, таких как kivy и canvas.
Вот код, который ИИ предложил использовать для получения желаемого результата:
`def draw_route(self, coords):
for coord in coords:
self.map_widget.set_marker(coord[0], coord[1], text="Точка", marker_color="red")
for i in range(len(coords) - 1):
self.map_widget.set_path(coords[i][0], coords[i][1], coords[i + 1][0], coords[i + 1][1], color="blue")`
У меня есть другая функция, которая рассчитывает расстояние, но она работает с ошибками, так как я не могу отобразить точный маршрут, который у меня есть.
Вот строка кода, которая используется для расчета расстояния между двумя точками:
def calculate_distance(self):
if len(self.route_coords) <2:
self.distance_label.configure(text=”***”)
return
total_distance = 0
for i in range(len(self.route_coords) - 1):
start = self.route_coords[i]
end = self.route_coords[i + 1]
total_distance += great_circle(start, end).kilometers
self.distance_label.configure(text=f"****: {total_distance: .2f} KM")
На этом все, спасибо за любую помощь и советы!!
Ответ
Чтобы нарисовать маршрут между двумя выбранными точками в приложении на tkinter с использованием библиотеки tkintermapview, вам нужно выполнить несколько шагов. Давайте обобщим ваш код и добавим необходимую функциональность для рисования маршрута и расчета расстояния.
Во-первых, убедитесь, что у вас установлены необходимые библиотеки:
pip install tkintermapview geopy
Пример кода для вашего приложения может выглядеть следующим образом:
import tkinter as tk
from tkintermapview import TkinterMapView
from geopy.distance import great_circle
class RouteApp:
def __init__(self, root):
self.root = root
self.root.title("Route Drawer")
self.map_widget = TkinterMapView(root, width=800, height=600)
self.map_widget.pack(pady=20)
self.route_coords = []
self.distance_label = tk.Label(root, text="Расстояние: ***")
self.distance_label.pack()
# Пример списка координат
self.places = [
("Точка 1", (55.7558, 37.6173)), # Москва
("Точка 2", (59.9343, 30.3351)), # Санкт-Петербург
("Точка 3", (48.8566, 2.3522)), # Париж
# Добавьте остальные места
]
self.create_place_buttons()
def create_place_buttons(self):
for place in self.places:
name, coords = place
button = tk.Button(self.root, text=name, command=lambda c=coords: self.select_place(c))
button.pack()
def select_place(self, coords):
self.route_coords.append(coords)
self.map_widget.set_marker(coords[0], coords[1], text="Выбрано", marker_color="red")
if len(self.route_coords) > 1:
self.draw_route(self.route_coords)
self.calculate_distance()
def draw_route(self, coords):
# Очищаем предыдущий путь
self.map_widget.delete_path()
# Рисуем маршрут
for i in range(len(coords) - 1):
self.map_widget.set_path(coords[i][0], coords[i][1], coords[i + 1][0], coords[i + 1][1], color="blue")
def calculate_distance(self):
if len(self.route_coords) < 2:
self.distance_label.configure(text="Расстояние: ***")
return
total_distance = 0
for i in range(len(self.route_coords) - 1):
start = self.route_coords[i]
end = self.route_coords[i + 1]
total_distance += great_circle(start, end).kilometers
self.distance_label.configure(text=f"Расстояние: {total_distance:.2f} KM")
if __name__ == "__main__":
root = tk.Tk()
app = RouteApp(root)
root.mainloop()
Объяснение кода:
-
Импорт необходимых библиотек: Здесь мы импортируем нужные модули: tkinter для создания GUI, tkintermapview для отображения карты и geopy для расчета расстояния.
-
Создание класса
RouteApp
: В этом классе определяется логика приложения. -
Инициализация карты: В методе
__init__
создается карта и метка для отображения расстояния. -
Кнопки для выбора мест: В методе
create_place_buttons
создаются кнопки для каждого места из списка. При нажатии на кнопку выбирается соответствующая координата. -
Добавление выбранных координат: Метод
select_place
добавляет координаты в список маршрута и обновляет карту. -
Рисование маршрута: Метод
draw_route
рисует маршрут между выбранными точками. - Расчет расстояния: Метод
calculate_distance
считает общее расстояние между всеми выбранными точками и обновляет текст метки.
С помощью этого кода вы сможете рисовать маршрут между двумя или более точками и вычислять расстояние между ними. Убедитесь, что вы обновляете список мест по вашему усмотрению.