DeepSeek代码之旅2:卫星地图标记方法之——Pyside6实现

liftword4周前 (04-05)技术文章15

现在写代码,开始习惯把DeepSeek当作字典工具了,对于自己陌生的地方,问一问它,它均会给出详细的答案,包括使用方法方案,这以后的程序员真要得加油了!普通程序员危机重重了!不多说了,那个行业都要多学习,不学习迟早就要下岗了!之前我使用html实现了地图标记功能,现在我使用Pyside6去实现图形化界面功能。完整代码可以查看文末。

主要实现的方法:Pyside6的QWebEngineView加载HTML文件访问地图,QWebEngineView与JavaScript双向通信实现获取坐标值、添加标记、删除标记、加载标记等功能。

技术难点:

1、监听点击事件并回传坐标

在 HTML 中,通过高德地图的 map.on('click', ...) 监听点击事件,并通过 window.pyObject 将坐标传递给 PySide6。

html文件中:

                // 监听地图点击事件
                map.on('click', (e) => {
                    const lng = e.lnglat.getLng();
                    const lat = e.lnglat.getLat();
                    // 调用 PySide6 暴露的方法
                    if (window.pyObject) {
                        window.pyObject.onMapClicked(lng, lat);
                    }
                });

py文件中:

       class Bridge(QObject):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.map_window = parent

    @Slot(float, float)
    def onMapClicked(self, lng, lat):
        # 安全更新 UI
        QMetaObject.invokeMethod(
            self.map_window.input_lng, "setText",
            Qt.QueuedConnection, Q_ARG(str, str(lng))
        )
        QMetaObject.invokeMethod(
            self.map_window.input_lat, "setText",
            Qt.QueuedConnection, Q_ARG(str, str(lat))
        )
        print(f"坐标已接收: {lng}, {lat}")  # 控制台输出确认
#……其他程序模块
				# 配置 QWebChannel
        self.channel = QWebChannel()
        self.bridge = Bridge(self)
        self.channel.registerObject("pyObject", self.bridge)   #创建一个 QWebChannel 实例
        self.browser.page().setWebChannel(self.channel)
#……其他程序模块

通过上面两个函数,就会实现:

(1)点击地图获取坐标:用户点击地图时,JavaScript 会捕获经纬度并通过
window.pyObject.onMapClicked(lng, lat) 传递给 PySide6。

(2)自动填充输入框:PySide6 接收到坐标后,自动填充经度和纬度的输入框。

2、标记点操作

通过QWebEngineView绑定HTML之后,就可以对HTML中的JavaScript函数进行相应的操作,以添加标记为例

python代码部分:

    def add_marker(self):
        lng = self.input_lng.text()
        lat = self.input_lat.text()
        title = self.input_title.text()
        if lng and lat:
            js_code = f"addMarker({lng}, {lat}, '{title}')"
            self.browser.page().runJavaScript(js_code)

HTML代码部分:

        function addMarker(lng, lat, title) {
            // 获取当前页面的URL
            var currentURL = window.location.href;
            // 提取目录路径
            var directoryPath = currentURL.substring(0, currentURL.lastIndexOf('/') + 1);
            if (!map) return;
            const marker = new AMap.Marker({
                position: [lng, lat],
                map: map,
                icon: directoryPath + "towerdot.png" 
            }); 
            marker.setExtData({ title: title || "未命名标记" });
            marker.on('click', () => {
                    new AMap.InfoWindow({
                        content: `${title}
经纬度:${lng},${lat}` }).open(map, marker.getPosition()); }); markers.push(marker); }

从html中我们看出,添加标记点之后通过icon显示自己的图标(当前目录下towerdot.png这个图表),也可以使用官方的地址为"
https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png"。其他标签操作类似。

代码地址:
https://gitee.com/tangzonghuan/map-tool.git

相关文章

基于Python的地图绘制教程

本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。1 示例代码1.1 导入相关模块...

GeoPandas轻松绘制交互式在线地图

1 简介今天为大家详细介绍新版geopandas中,利用explore()制作在线地图可视化的方法:2 在geopandas中制作在线地图可视化explore()方法类似我们熟悉的plot()方法,是...

Python使用bokeh及folium实现地理位置信息的交互可视化

Talk is cheap,show U the code!1.普通版(常规地图)import numpy as np from bokeh.plotting import figure, show,...

Python高德地图指定区域经纬度数据抓取

在这里插入图片描述@Author : Runsen高德地图【东莞理工学院】如下链接为从高德地图获取【东莞理工学院】这个区域边界经纬度坐标点的链接https://ditu.amap.com/servic...

软件测试|教你用matplotlib绘制热力图

前言热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,较大的值由较深的颜色表示,较小的值由较浅的颜色表示;较大的值由偏暖的颜色表示,较小的值由较冷的颜色表示,等等。...