Обработка среднего множества значений

Я вставляю маркеры с определенным значением на карту Openstreetmap через листовку. Кроме того, я хочу, чтобы эти маркеры получали Clusterd при уменьшении масштаба карты. Значок кластера должен показывать среднее значение кластера. Пока проблем нет. Я перебираю все маркеры в каждом кластере, складываю значения вместе, а затем делю на количество маркеров. Затем я создаю собственный значок, который окрашивается в зависимости от значения и имеет метку со средним значением. Это отлично работает для небольшого количества маркеров. Проблема в том, что мне нужно вставить МНОГО маркеров в северной части Германии. Я имею в виду не менее 50 000.

В этом случае браузер не может загрузить страницу. Но если я установлю масштаб по умолчанию на 18, он загрузит страницу. И нет никаких проблем при уменьшении масштаба страницы. Я вставляю свой код ниже:

var markers = L.markerClusterGroup({
		chunkedLoading: true, 
		chunkProgress: updateProgressBar,
		showCoverageOnHover: false,
		maxClusterRadius: 100,
		iconCreateFunction : function(cluster) {
			var val = 0;
			for (i = 0; i < cluster.getAllChildMarkers().length; i++) {
				val = val
						+ parseInt(cluster.getAllChildMarkers()[i].options.speed)
			} 
			var avg = val / cluster.getAllChildMarkers().length;
			avg = Math.round(avg * 10) / 10;
					
			
			return new L.divIcon({
				html: "<div style='background-color: " + generateColor(avg) + "'><span>" + avg + "</span></div>",
				className: ' marker-cluster',
				iconSize: new L.point(40, 40)
			})
		}
	});  

Теперь мне нужно решение, чтобы сделать эту карту функциональной.


person Matthes Schucht    schedule 03.03.2017    source источник
comment
я бы сохранил результат из cluster.getAllChildMarkers() в локальную переменную (не знаю, действительно ли это дорогой вызов функции).   -  person cyr_x    schedule 03.03.2017


Ответы (1)


Трудно точно сказать, в чем ваше узкое место, без надлежащего воспроизведения случая.

Вы могли бы хотя бы начать с кэширования массива маркеров:

function iconCreateFunction(cluster) {
    var val = 0,
        childMarkers = cluster.getAllChildMarkers(), // Store in local variable to avoid having to execute it many times.
        total = childMarkers.length;

    for (i = 0; i < total; i++) {
        val = val + parseInt(childMarkers[i].options.speed)
    } 
    var avg = val / total;
    avg = Math.round(avg * 10) / 10;


    return new L.divIcon({
        html: "<div style='background-color: " + generateColor(avg) + "'><span>" + avg + "</span></div>",
        className: ' marker-cluster',
        iconSize: new L.point(40, 40)
    })
}
person ghybs    schedule 03.03.2017
comment
Спасибо, это сделало это хотя бы немного быстрее. Я думаю, что мне нужно пойти с решением, в котором я просто загружаю некоторые точки данных в карту или что-то в этом роде. Как будто вам нужно предварительно выбрать регион, который вы хотите увидеть - person Matthes Schucht; 06.03.2017