Python 从JS到PyQt5的鼠标单击存储lat long

Python 从JS到PyQt5的鼠标单击存储lat long,python,pyqt,pyqt5,qtwebengine,qtwebchannel,Python,Pyqt,Pyqt5,Qtwebengine,Qtwebchannel,我正在尝试将lat/lng存储在鼠标单击到几何点上。 因此,基本上,当用户单击地图时,我需要获取这些坐标(lat/lng)并将其存储到变量中,例如point=point(lat,lng),以便计算最近的几何体并从PostGIS中提取数据 我知道我需要建立后端和@pyqtSlot(float,float),但由于我是新手,我无法让它工作。我有这个代码是由QtDesigner生成的,你不必为所有的按钮而烦恼。 以下是HTML/JS部分: maphtml = ''' <!DOCTYPE

我正在尝试将lat/lng存储在鼠标单击到几何点上。 因此,基本上,当用户单击地图时,我需要获取这些坐标(lat/lng)并将其存储到变量中,例如
point=point(lat,lng)
,以便计算最近的几何体并从PostGIS中提取数据

我知道我需要建立后端和
@pyqtSlot(float,float)
,但由于我是新手,我无法让它工作。我有这个代码是由QtDesigner生成的,你不必为所有的按钮而烦恼。 以下是HTML/JS部分:

maphtml = '''
    <!DOCTYPE HTML>
    <html>
    <head>
    <meta name="robots" content="index, all" />    
    <script src="qrc:///qtwebchannel/qwebchannel.js"></script>
    <title>WebGL Earth API - Side-by-side - Basic Leaflet 
    compatibility</title>
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet- 
    0.7.2/leaflet.css" />
    <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
    <script src="http://www.webglearth.com/v2/api.js"></script>
    <script src="scripts/qwebchannel.js"></script>
    <script>
    var backend;
    new QWebChannel(qt.webChannelTransport, function (channel) {
    backend = channel.objects.backend;


    });
    function init() {
    var m = {};

    start_(L, 'L');
    start_(WE, 'WE');

    function start_(API, suffix) {
    var mapDiv = 'map' + suffix;
    var map = API.map(mapDiv, {
    center: [51.505, -0.09],
    zoom: 4,
    dragging: true,
    scrollWheelZoom: true,
    proxyHost: 'http://srtm.webglearth.com/cgi-bin/corsproxy.fcgi?url='
    });
    m[suffix] = map;

    //Add baselayer
    API.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{
    attribution: '© OpenStreetMap contributors'
    }).addTo(map);

    //Add TileJSON overlay
    var json = {"profile": "mercator", "name": "Grand Canyon USGS", "format": 
    "png", "bounds": [15.976953506469728, 45.813157465613884], "minzoom": 10, 
    "version": "1.0.0", "maxzoom": 16, "center": [15.976953506469728, 
    45.813157465613884, 16], "type": "overlay", "description": "", 
    "basename": 
    "grandcanyon", "tilejson": "2.0.0", "sheme": "xyz", "tiles": 
    ["http://tileserver.maptiler.com/grandcanyon/{z}/{x}/{y}.png"]};
    if (API.tileLayerJSON) {
    var overlay2 = API.tileLayerJSON(json, map);
    } else {
    //If not able to display the overlay, at least move to the same location
    map.setView([json.center[1], json.center[0]], json.center[2]);
    }



    //Print coordinates of the mouse
    map.on('click', function(e) {

    document.getElementById('coords').innerHTML = e.latlng.lat + ', ' + 
    e.latlng.lng;
    backend.foo(e.latlng.lat,e.latlng.lng)

    });
    }

    //Synchronize view
    m['L'].on('click', function(e) {
    var center = m['L'].getCenter();
    var zoom = m['L'].getZoom();
    m['WE'].setView([center['lat'], center['lng']], zoom);
    });
    }
    </script>
    <style>
    html, body{padding: 0; margin: 0; overflow: hidden;}
    #mapL, #mapWE {position:absolute !important; top: 0; right: 0; bottom: 0; 
    left: 0;
    background-color: #fff; position: absolute !important;}
    #mapL {right: 0%;}
    #mapWE {left: 100%;}
    #coords {position: absolute; bottom: 0;}
    </style>
    </head>
    <body onload="javascript:init()">
    <div id="mapL"></div>
    <div id="mapWE"></div>
    <div id="coords"></div>
    </body>
    </html>
    '''
我看到了类似的问题,但到目前为止还没能解决。。。 在PyQt4中,我几乎可以使用它,但由于我不擅长JS,我不知道如何从以下代码返回getCenter()的lat/lng intead.lat:

if(主窗口的类型!=“未定义”){
var onMapMove=函数(e){MainWindow.onMapMove(map.getCenter().lat,
map.getCenter().lng)};
地图上('点击',地图移动);

onMapMove();
我不能很好地处理您的代码,因为它的格式不好,而且缺少要定义的元素,所以我的答案将基于向您展示一个示例

首先,它没有将所有代码放在一个文件中,这使得维护代码变得困难,在这种情况下,我将其分为以下文件:

.
├── index.html
├── main.py
├── utils.css
└── utils.js
window.onload=function(){
新的QWebChannel(qt.WebChannel传输,功能(通道){
window.backend=channel.objects.backend;
});
var m={};
开始(L,'L');
开始(我们,'我们');
函数启动(API,后缀){
var mapDiv='map'+后缀;
var map=API.map(mapDiv{
中间:[51.505,-0.09],
缩放:4,
是的,
滚轮缩放:对,
代理主机:'http://srtm.webglearth.com/cgi-bin/corsproxy.fcgi?url='
});
m[后缀]=映射;
//添加基层
API.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'{
属性:“©OpenStreetMap贡献者”
}).addTo(地图);
//添加TileJSON覆盖
var json={
“简介”:“墨卡托”,
“名称”:“大峡谷美国地质勘探局”,
“格式”:“png”,
“界限”:[15.976953506469728,45.813157465613884],
“minzoom”:10,
“版本”:“1.0.0”,
“最大缩放”:16,
“中心”:[15.97695350646928,
45.813157465613884, 16
],
“类型”:“覆盖”,
“说明”:“,
“basename”:“大峡谷”,
“tilejson”:“2.0.0”,
“sheme”:“xyz”,
“瓷砖”:[“http://tileserver.maptiler.com/grandcanyon/{z} /{x}/{y}.png“]
};
if(API.tilleayerjson){
var overlay2=API.tileLayerJSON(json,map);
}否则{
//如果无法显示覆盖,至少移动到同一位置
setView([json.center[1],json.center[0]],json.center[2]);
}
//打印鼠标的坐标
地图上('点击')功能(e){
document.getElementById('coords').innerHTML=e.latlng.lat+','+e.latlng.lng;
点击backend.pointClicked(e.latlng.lat,e.latlng.lng);
});
}
//同步视图
m['L'].('click',函数(e){
var center=m['L'].getCenter();
var zoom=m['L'].getZoom();
m['WE'].setView([center['lat'],center['lng'],zoom);
});
}
html,正文{
填充:0;
保证金:0;
溢出:隐藏;
}
#mapL,#mapWE{
位置:绝对!重要;
排名:0;
右:0;
底部:0;
左:0;
背景色:#fff;
位置:绝对!重要;
}
#mapL{
右:0%;
}
#马普韦{
左:100%;
}
#库德{
位置:绝对位置;
底部:0;
}

WebGL地球API-并排-基本传单兼容性

点是什么?
点是shapely的几何对象!谢谢你!我在看你所有类似的答案,你是PyQt的rockstar!我知道我的代码乱七八糟…因为它是由QtDesigner生成的,我只是将实现之前生成的代码粘贴到GUI上。再次感谢你!我将实现这个示例到my代码,@ValentinoVizner根据您提供的信息,我已加入我的解决方案,您可以在以下链接中找到:。请不要忘记将我的答案标记为正确,因为您指出这是表示感谢的最佳方式。因此,如果您不知道,请给自己一点时间,并回顾一下感谢!您真的知道吗关于PyQt的内容太多了,希望有一天我能和你们一样学到同样的知识。我已经记下了它,并将回顾这次旅行!
.
├── index.html
├── main.py
├── utils.css
└── utils.js