Как нарисовать маршрут между двумя точками, выбранными из списка, в tkintermapview?

Вопросы и ответы

Я пытался добавить линию маршрута в простое приложение 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()

Объяснение кода:

  1. Импорт необходимых библиотек: Здесь мы импортируем нужные модули: tkinter для создания GUI, tkintermapview для отображения карты и geopy для расчета расстояния.

  2. Создание класса RouteApp: В этом классе определяется логика приложения.

  3. Инициализация карты: В методе __init__ создается карта и метка для отображения расстояния.

  4. Кнопки для выбора мест: В методе create_place_buttons создаются кнопки для каждого места из списка. При нажатии на кнопку выбирается соответствующая координата.

  5. Добавление выбранных координат: Метод select_place добавляет координаты в список маршрута и обновляет карту.

  6. Рисование маршрута: Метод draw_route рисует маршрут между выбранными точками.

  7. Расчет расстояния: Метод calculate_distance считает общее расстояние между всеми выбранными точками и обновляет текст метки.

С помощью этого кода вы сможете рисовать маршрут между двумя или более точками и вычислять расстояние между ними. Убедитесь, что вы обновляете список мест по вашему усмотрению.

Оцените материал
Добавить комментарий

Капча загружается...