我正在使用leafletjs API在openstreetmaps上实现显示位置。这是场景,当页面加载时,正在触发JS函数,该函数将查询DB以获取所有设备的当前位置并在地图上将它们显示为标记。我正面临着两个主要问题:
- >我试图将弹出窗口与每个标记绑定,以便它可以是描述性的。换句话说,用户应该知道这个标记的设备。问题是弹出窗口正在标记上显示标记不可见。这是截图:
标记如下所示(关闭一个弹出窗口后):
- >在此页面上,我在表中显示设备名称。该表的第一列是复选框。当用户检查设备时,其标记会按预期显示在地图上(正常工作)。之后,如果用户取消选中该设备,则其标记消失。但是当用户再次重新选择该设备时,其标记不会出现。
这是我的代码:
function OnPageLoad() {
var IDs = GetAllSelectedDeviceIDs();
LoadOpenStreetMap(IDs);
}
var map;
var markers = new Array();
function LoadOpenStreetMap(deviceIDs) {
for (var i = 0; i < deviceIDs.length; i++) {
$.ajax({
url: "../Database/getcurrentlocation.php",
cache: false,
type: "post",
data: "deviceId=" + deviceIDs[i] + "&r=" + Math.random(),
dataType: "html",
async: false,
success: function (data) {
if (data != null) {
var dataArray = data.split(/~/);
SetOpenStreetMap(dataArray[0], dataArray[1], deviceIDs[i], i, flags[i]);
}
}
});
}
deviceIDs = GetAllSelectedDeviceIDs();
setTimeout(function () { LoadOpenStreetMap(deviceIDs); }, 500);
}
function SetOpenStreetMap(lati, longi, deviceID, markerIndex, markerFlag) {
if (!map) {
map = L.map('map').setView([lati, longi], 12);
L.tileLayer('http://{s}.tile.cloudmade.com/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/997/256/{z}/{x}/{y}.png', {
attribution: '',
maxZoom: 18
}).addTo(map);
}
if (markerFlag == 1) {
//need to add marker
if (!markers[markerIndex]) {
var popupLocation1 = new L.LatLng(lati, longi);
var popupContent1 = 'This is a nice popup.';
popup1 = new L.Popup();
popup1.setLatLng(popupLocation1);
popup1.setContent(popupContent1);
markers[markerIndex] = L.marker([lati, longi]).addTo(map);
markers[markerIndex].bindPopup(popupContent1);
map.addLayer(popup1);
}
else
markers[markerIndex].setLatLng([lati, longi]).update();
}
else {
//need to remove marker
if (markers[markerIndex]) {
map.removeLayer(markers[markerIndex]);
}
}
}
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:2)
要将弹出窗口放在带有一些偏移的标记上,则存在偏移属性:
if (markerFlag == 1) { //need to add marker
if (!markers[markerIndex]) {
var popupLocation1 = new L.LatLng(lati, longi);
var popupContent1 = 'This is a nice popup.';
popup1 = new L.Popup();
popup1.setLatLng(popupLocation1);
popup1.setContent(popupContent1);
popup1.offset = new L.Point(0, -20);
markers[markerIndex] = L.marker([lati, longi]).addTo(map);
/* markers[markerIndex].bindPopup(popupContent1); */
map.addLayer(popup1);
} else
markers[markerIndex].setLatLng([lati, longi]).update();
}
答案 1 :(得分:2)
在创建弹出窗口时设置选项对象内的偏移量。
var options = {
offset: new L.Point(1, -20)
};
var popup = L.popup(options)
.setLatLng([ lat, lng ])
.setContent('Your popup content goes here!')
.openOn(map)
;
“options”对象是传递给L.popup()
的第一个对象答案 2 :(得分:1)
要在标记上显示弹出窗口,只需在标记上调用bindPopup
方法。
这显示在QuickStart。
您不需要自己实例化弹出窗口。