Обработка клика на карту и маркеры
…видео инструкция в обработке

Обработка кликов требует доабвления дополнительных классов
Класс для инициализации шины данных
class BridgeFolium(folium.MacroElement):
_template = template.Template(
"""
{% macro script(this, kwargs) %}
var mainWindow;
// Ждём загрузки страницы
document.addEventListener('DOMContentLoaded', function() {
// Создаём WebChannel
new QWebChannel(qt.webChannelTransport, function(channel) {
mainWindow = channel.objects.mainWindow;
});
// Ждём загрузки карты Leaflet
setTimeout(function() {
// Добавляем обработчик клика
{{this._parent.get_name()}}.on('click', function(e) {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (mainWindow) {
mainWindow.receive_coordinates(lat, lng);
}
});
}, 1000);
});
{% endmacro %}
"""
)
и класс для создания кликабельного маркера
class ClickableMarker(folium.Marker):
_template = template.Template(
"""
{% macro script(this, kwargs) %}
var {{ this.get_name() }} = L.marker(
{{ this.location|tojson }},
{{ this.options|tojavascript }}
).addTo({{ this._parent.get_name() }}).on('click', (e) => {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (mainWindow) {
mainWindow.marker_clicked(lat, lng, {{ this.options|tojavascript }}.id);
}
});
{% endmacro %}
"""
)
итоговый файл после добавления этих двух классов будет выглядеть вот так:
import sys
import os
import PySide6
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWebChannel import QWebChannel
from PySide6.QtCore import Slot
from mainwindow import Ui_MainWindow
import folium
from folium import template
import io
dirname = os.path.dirname(PySide6.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
class BridgeFolium(folium.MacroElement):
_template = template.Template(
"""
{% macro script(this, kwargs) %}
var mainWindow;
// Ждём загрузки страницы
document.addEventListener('DOMContentLoaded', function() {
// Создаём WebChannel
new QWebChannel(qt.webChannelTransport, function(channel) {
mainWindow = channel.objects.mainWindow;
});
// Ждём загрузки карты Leaflet
setTimeout(function() {
// Добавляем обработчик клика
{{this._parent.get_name()}}.on('click', function(e) {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (mainWindow) {
mainWindow.receive_coordinates(lat, lng);
}
});
}, 1000);
});
{% endmacro %}
"""
)
class ClickableMarker(folium.Marker):
_template = template.Template(
"""
{% macro script(this, kwargs) %}
var {{ this.get_name() }} = L.marker(
{{ this.location|tojson }},
{{ this.options|tojavascript }}
).addTo({{ this._parent.get_name() }}).on('click', (e) => {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (mainWindow) {
mainWindow.marker_clicked(lat, lng, {{ this.options|tojavascript }}.id);
}
});
{% endmacro %}
"""
)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.show_map()
@Slot(float, float)
def receive_coordinates(self, lat, lng):
print(lat, lng)
@Slot(float, float, int)
def marker_clicked(self, lat, lng, _id):
print("Marker:", lat, lng, _id)
def show_map(self):
# создание объекты карты
m = folium.Map(
location=[52.286387, 104.280660],
zoom_start=11,
tiles="CartoDB Voyager",
attributionControl=0
)
m.add_child(BridgeFolium())
# Добавляем JavaScript в HTML-код карты
m.get_root().html.add_child(folium.Element("""<script src="qrc:///qtwebchannel/qwebchannel.js"></script>"""))
self.channel = QWebChannel()
self.channel.registerObject("mainWindow", self)
self.ui.web.page().setWebChannel(self.channel)
###
ClickableMarker(
location=[52.286387, 104.280660],
id=123,
icon=folium.Icon(icon="cat", prefix='fa')
).add_to(m)
###
# подключение карты к интерфейсу
m_data = io.BytesIO()
m.save(m_data, close_file=False)
self.ui.web.setHtml(m_data.getvalue().decode())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
Обработка клика на карту и маркеры
…видео инструкция в обработке
