Вам необходимо решить, используете ли вы маркеры или слои символов. Маркеры более гибки по внешнему виду, предоставляя вам полный доступ к HTML, поэтому вы можете легко отображать любое изображение. Слои символов проще связать непосредственно с данными и лучше взаимодействовать с другими слоями (например, скрываться, а не сталкиваться друг с другом.)
Пока пойдем с маркерами. Ваша проблема с первым подходом заключается в том, что вы каждый раз создаете новые маркеры, не удаляете старые и не обновляете их. Если вы хотите обновить их, вам сначала нужно сохранить их:
var geojson;
var markers = [];
// ...
geojson.features.forEach(function(marker, markerIndex) {
// Check if we have made this marker before
var marker = markers[markerIndex];
var el = marker && marker.getElement();
if (!el) {
// create a DOM element for the marker
el = document.createElement('div');
el.addEventListener('click', function() {
// we refer to geojson.features[] rather than this particular marker, so it will update properly when the data changes
window.alert(geojson.features[markerIndex].properties.message);
});
// add marker to map
markers[markerIndex] = new mapboxgl.Marker(el);
marker
.setLngLat(marker.geometry.coordinates)
.addTo(map);
}
// Either update existing marker, or set up new one, it's the same.
el.className = 'marker';
el.style.backgroundImage = 'url(http://****images/avatars/' + marker.properties.imagename+ '.png';
el.style.width = marker.properties.iconSize[0] + 'px';
el.style.height = marker.properties.iconSize[1] + 'px';
marker.setLngLat(marker.geometry.coordinates);
// ....
Если вы используете слои символов, это, вероятно, проще. Вам просто нужно загрузить свои собственные изображения один раз в начале:
map.loadImage('image1', 'http://****images/avatars/image1.png';
, то:
map.addLayer({
"id": "drone",
"type": "symbol",
"source": "drone",
"layout": {
"icon-image": "image1"
}
});