使用python 3使用PyQt4 QWebView查看地图

Ays*_*ser 3 python pyqt pyqt4 openstreetmap python-3.x

我正在构建一个程序,该程序可以根据数据库中的特定坐标显示带有标记的地图,因此过程是:

  1. 使用(folium)从osm获取地图
  2. 添加标记
  3. 将地图另存为HTML
  4. 在QWebView中显示map.html。

但是,如果坐标始终在变化,例如(车辆跟踪系统),则这种方法不实用。

无论如何,有没有一种方法可以避免在前面的过程中添加或更新地图上的标记,而不必创建map.html文件,然后将其加载到QWebView中,然后每次都显示它。

谢谢

eyl*_*esc 5

不久前,我创建了一个小图书馆,使用PyQt和Google MapsOpenStreetMap在地图中显示标记,由于您的问题,我添加了此功能,因此您可以从此链接下载代码并尝试示例:qOSMExample2.py

在此答案中,我将向您展示代码中最重要的部分,以便您可以添加自定义功能。

QWebView支持javascript,因此我使用了传单库,它包含在html中,如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>


    <style type="text/css">
			html { height: 100%; }
			body { height: 100%; margin: 0; padding: 0 }
			#mapid { height: 100% }
    </style>

    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.3/dist/leaflet.css"
          integrity="sha512-07I2e+7D8p6he1SIM+1twR5TIrhUQn9+I6yjqD53JQjFiMf8EtC93ty0/5vJTZGF8aAocvHYNEDJajGdNx1IsQ=="
          crossorigin=""/>

    <script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet.js"
            integrity="sha512-A7vV8IFfih/D732iSSKi20u/ooOfj/AGehOKq0f4vLT1Zr2Y+RX7C+w8A1gaSasGtRUZpF/NZgzSAu4/Gc41Lg=="
            crossorigin=""></script>

    <script type="text/javascript" src="qOSM.js"></script>
</head>
<body onload="initialize()">
<div id="mapid" style="width:100%; height:100%"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

另外,如果我们观察到,我已经导入了qOSM.js文件,该文件实现了创建,移动地图以及与标记相同的逻辑。

另一个重要的是将python与javascript进行交互pyqt提供了2个功能:

无效的QWebFrame :: addToJavaScriptWindowObject(const QString&name,QObject * object)

使对象在框架的JavaScript上下文中的名称下可用。该对象将作为框架窗口对象的子对象插入。[...]

self.page().mainFrame().addToJavaScriptWindowObject("qtWidget", self)
Run Code Online (Sandbox Code Playgroud)

QVariant QWebFrame :: evaluateJavaScript(const QString&scriptSource)

使用此框架作为上下文评估scriptSource定义的JavaScript,并返回最后执行的语句的结果。

def runScript(self, script):
    return self.page().mainFrame().evaluateJavaScript(script)
Run Code Online (Sandbox Code Playgroud)

第一个功能允许我们在js中嵌入python对象,因此我们可以从js输出信号并将其连接到python插槽。第二个面向执行js函数并接收返回的内容。总之,第一个用于异步获取答案,第二个用于同步获取答案。

在下一部分中,我展示了实现上述功能的js:

self.page().mainFrame().addToJavaScriptWindowObject("qtWidget", self)
Run Code Online (Sandbox Code Playgroud)

输出: