Вы правы: Mapbox GL JS не хранит ссылки на маркеры . Однако вы можете хранить свои собственные ссылки на маркеры в массиве во время их создания.
В этом примере ниже я зацикливаюсь на наборе точечных объектов GeoJSON и создаю собственный HTML-маркер для каждого:
let markersArray = [];
geojson.features.forEach(feature => {
// create a HTML element for each feature
let el = document.createElement("div");
el.className = "marker";
el.innerHTML = `
<img src="custom-marker.png" height="20px" width="20px" />
<span class="marker-label">${feature.properties.name}</span>
`;
// make a marker for each feature and add to the map
let marker = new mapboxgl.Marker({
element: el,
anchor: "top"
})
.setLngLat(feature.geometry.coordinates)
.addTo(map);
// add to my own array in an object with a custom 'id' string from my geojson
markersArray.push({
id: feature.properties.id,
marker
});
});
Эта строка id
может быть любой, что вы хотите. Вы даже можете сохранить другие параметры, если хотите иметь возможность запрашивать другие вещи, такие как широта / долгота:
markersArray.push({
id: feature.properties.id,
coordinates: feature.geometry.coordinates,
marker
});
Затем, если я хочу получить доступ к членам экземпляра маркера (например, setDraggable
), я могу использовать Array.find()
, чтобы вернуть первый экземпляр, который соответствует моим параметрам поиска в markersArray
let someIdQuery = "some-id";
let queriedMarkerObj = markersArray.find(
marker => marker.id === someIdQuery
);
queriedMarkerObj.marker.setDraggable(true);
(Обратите внимание, что Array.find()
просто возвращает первый экземпляр в массиве, который соответствует вашему условию. Используйте что-то вроде Array.filter()
, если вы хотите иметь возможность запрашивать более одного маркера.)