【发布时间】:2021-06-02 09:48:10
【问题描述】:
我一直在努力寻找解决方案以使其工作或这个问题的答案,但我失败了,所以这里是:
我有一张定制的假想地图(假设它来自游戏),我想添加搜索栏来搜索我添加的标记。以前的方法不允许我添加“L.Control.Search”来搜索标记,所以我采用了来自https://github.com/stefanocudini/leaflet-search 的方法,使用名为“outside.html”的示例。
我使用一个函数从数组中向 LayerGroup 添加标记。所以我把它分成两个数组来添加到两个不同的组中。
之前我是用这个方法来添加自定义图标的:
// Add Marker
var city1 = L.marker(map.unproject([5074, 4952], map.getMaxZoom()), {icon: city1_icon})
.bindPopup('<b>City1</b>').bindTooltip('C1', {permanent: true}).openTooltip();
// Custom Icon
var city1_icon = L.icon({
iconUrl: 'ICONS/RENDERS/city1.png',
iconSize: [45, 100],
iconAnchor: [22.5, 100],
popupAnchor: [0, -75],
shadowUrl: 'ICONS/RENDERS/city1_shadow.png',
shadowSize: [41, 35],
shadowAnchor: [0, 35]
});
但是现在要添加标记,我正在使用这种方法并且标记的图标不会从默认值改变:
//sample data values to populate map
// ==================================================================================
var data = [
{"loc":[5627, 3946], "title":"City11", "coord":"123"},
];
var data2 = [
{"loc2":[3326, 5544], "title2":"City21", "coord2":"321"},
];
var markersLayer = new L.LayerGroup(); //layer contain searched elements
map.addLayer(markersLayer);
var markersLayer2 = new L.LayerGroup();
map.addLayer(markersLayer2);
map.addControl( new L.Control.Search({
layer: L.layerGroup([markersLayer, markersLayer2]),
initial: false,
zoom: 4,
collapsed: false,
}) ); // end addControl
//inizialize search control
////////////populate map with markers from sample data
for(i in data) {
var title = data[i].title, //value searched
loc = data[i].loc, //position found
coord = data[i].coord, //icon used
cityMarker = new L.Marker(map.unproject(loc, map.getMaxZoom()), {title: title}, {icon: city1_icon})
.bindPopup('title: '+ title + ' ' + coord);
markersLayer.addLayer(cityMarker);
}
for(i in data2) {
var title2 = data2[i].title2, //value searched
loc2 = data2[i].loc2, //position found
coord2 = data2[i].coord2, //icon used
cityMarker2 = new L.Marker(map.unproject(loc2, map.getMaxZoom()), {title: title2}, {icon: city2_icon})
.bindPopup('title: '+ title2 + ' ' + coord2);
markersLayer2.addLayer(cityMarker2);
}
// Custom Icons
var city1_icon = L.icon({
iconUrl: 'ICONS/RENDERS/city1.png',
iconSize: [45, 100],
iconAnchor: [22.5, 100],
popupAnchor: [0, -75],
shadowUrl: 'ICONS/RENDERS/city1_shadow.png',
shadowSize: [41, 35],
shadowAnchor: [0, 35]
});
// Custom Icon
var city2_icon = L.icon({
iconUrl: 'ICONS/RENDERS/city2.png',
iconSize: [45, 100],
iconAnchor: [22.5, 100],
popupAnchor: [0, -75],
shadowUrl: 'ICONS/RENDERS/city2_shadow.png',
shadowSize: [41, 35],
shadowAnchor: [0, 35]
});
除了自定义图标之外的一切都有效。
附:我不太擅长JS
任何帮助将不胜感激:)
【问题讨论】:
-
L.Marker构造方法将选项字典作为其第二个参数;您将两个字典作为第二个和第三个参数传递给它。所以应该是{title: title2, icon: city2_icon},而不是{title: title2}, {icon: city2_icon}。 -
感谢您的想法!我之前试过了,现在也试过了。由于某种神秘的原因,它破坏了新标记的添加顺序。 (我知道,因为只有第一层的第一个项目出现在搜索中,地图上没有显示标记图标)。似乎在标记的选项中添加除
title之外的任何内容都会破坏功能:( UPD:所以我发现了问题,我将 var 图标放在初始代码下方,当我将其转移到初始功能之上时,它突然开始显示自定义图标。感谢您的帮助,@IvanSanchez
标签: javascript search leaflet icons marker