Добавление фильтров и выделение объекта на на карте
…видео инструкция в обработке

Код для реализации такого интерфейса.
Файл mainwindow.py
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
import pandas as pd
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.df = pd.read_csv("./data.csv")
self.ui.cmbPopulation.addItem('50000-100000', (50000, 100000))
self.ui.cmbPopulation.addItem('100000-500000', (100001, 500000))
self.ui.cmbPopulation.addItem('500000-1млн.', (500001, 1000000))
self.ui.cmbPopulation.addItem('от 1млн.', (1000001, 100000000))
self.ui.cmbPopulation.currentIndexChanged.connect(self.show_map)
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):
city = self.df[self.df.id == _id].iloc[0]
self.ui.edtCity.setText(city.settlement)
self.ui.edtInfo.setText(f"""
Население: {city.population}<br>
Муниципалитет: {city.municipality}<br>
Регион: {city.region}
""".strip())
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)
###
left, right = self.ui.cmbPopulation.currentData()
cities = self.df.loc[(left <= self.df.population) & (self.df.population <=right)]
sw = cities[['latitude_dd', 'longitude_dd']].min().values.tolist()
ne = cities[['latitude_dd', 'longitude_dd']].max().values.tolist()
for city in cities.itertuples():
ClickableMarker(
location=[city.latitude_dd, city.longitude_dd],
id=city.id,
icon=folium.Icon(icon="cat", prefix='fa')
).add_to(m)
m.fit_bounds([sw, ne])
###
# подключение карты к интерфейсу
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())
код файла интерфейса mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>827</width>
<height>541</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QComboBox" name="cmbPopulation"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QWebEngineView" name="web">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Количество людей</string>
</property>
</widget>
</item>
<item row="0" column="2" rowspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Информация</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLineEdit" name="edtCity"/>
</item>
<item row="1" column="0">
<widget class="QTextEdit" name="edtInfo"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>QWebEngineView</class>
<extends>QWidget</extends>
<header location="global">QtWebEngineWidgets/QWebEngineView</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
Добавление фильтров и выделение объекта на на карте
…видео инструкция в обработке
