Python 从JS到PyQt5的鼠标单击存储lat long
我正在尝试将lat/lng存储在鼠标单击到几何点上。 因此,基本上,当用户单击地图时,我需要获取这些坐标(lat/lng)并将其存储到变量中,例如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
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