Ответ 1
Проблема производительности связана с тем, что каждый маркер является отдельным элементом DOM. Браузеру удается выделить тысячи из них.
В вашем случае простым способом было бы использовать Circle Markers и отобразить их на холсте (например, используя карту preferCanvas
или с помощью специального renderer
для каждого из ваших маркеров кругов). Так работает Google Maps по умолчанию: его маркеры нарисованы на холсте.
var map = L.map('map', {
preferCanvas: true
});
var circleMarker = L.circleMarker(latLng, {
color: '#3388ff'
}).addTo(map);
или
var map = L.map('map');
var myRenderer = L.canvas({ padding: 0.5 });
var circleMarker = L.circleMarker(latLng, {
renderer: myRenderer,
color: '#3388ff'
}).addTo(map);
С помощью этого решения каждый маркер круга больше не является отдельным элементом DOM, а вместо этого нарисован листом на один холст, который гораздо проще обрабатывать для браузера.
Кроме того, Leaflet по-прежнему отслеживает положение мыши и связанные события и запускает соответствующие события на ваших маркерах Circle, чтобы вы все еще могли слушать такие события (например, щелчок мыши и т.д.).
Демо с 100 тыс. точек: https://jsfiddle.net/sgu5dc0k/