Я пытаюсь показать разные слои GeoJSON с разными масштабными слоями, используя Leaflet API. Я могу загрузить и отобразить все три слоя одновременно (хотя на самом деле я не хочу, чтобы все они отображались одновременно). Я могу загрузить и отобразить их на разных уровнях масштабирования.
У меня есть код, настроенный таким образом, чтобы на уровнях масштабирования 1-6 на карте отображался один слой GeoJSON. На уровнях 7-10, он покажет другой, а на уровнях 11+ он покажет третий. Отображение их работает. То, что я пытаюсь заставить работать сейчас, это отключение других, если они отображаются. Переход с 1-6 до 7-10 работает (это означает, что он корректно отключает слой 1-6), но не с 7-10 до 11+ (что означает, что слой 7-10 остается на месте), и я не могу понять почему (он использует тот же код).
Вот ajax для слоев GeoJSON:
function getJson(defaultStyle, map, simp, geojsonLayer){
var url = 'file' + simp + '.json';
map.removeLayer(geojsonLayer);
geojsonLayer.clearLayers();
$.getJSON(url, function(data){
geojsonLayer = L.geoJson(data, {
style: defaultStyle,
onEachFeature: onEachFeature
});
geojsonLayer.addTo(map);
});
}
А вот и основная функция, которая вызывает ajax в зависимости от масштаба. simpCounter изначально равен 0.
map.on('zoomend', function(e) {
if (map.getZoom() >= 7 && map.getZoom() <= 10) {
if (simpCounter == 0 || simpCounter == 2) {
getJson(defaultStyle, map, 60, geojsonLayer);
simpCounter = 1;
}
} else if (map.getZoom() >= 11) {
if (simpCounter == 0 || simpCounter == 1) {
getJson(defaultStyle, map, 35, geojsonLayer);
simpCounter = 2;
}
}
});
Итак, еще раз, первый переход корректно отключает старый слой, а второй переход - нет. Спасибо за помощь.
источник
Ответы:
Попробуйте это вместо этого:
И для вашей вызывающей функции:
Когда вы передаете аргументы
map
,geojsonLayer
иdefaultStyle
в вызовеgetJson(defaultStyle, map, 60, geojsonLayer);
вы создаете новые экземпляры объектов. Затем вы выполняете работу с экземплярами, которые могут отражаться на экране, но как только он возвращается в «основной цикл», он в основном забывает все, что только что сделал, и возвращается в предыдущее состояние.Так как я предполагаю, что вы определили
defaultStyle
,map
и начальнуюgeojsonLayer
популяцию в глобальной области вы просто должны назвать их, нет необходимости передавать их. С внесенными мною изменениями он изменяет глобальные параметры,map
поэтому они сохраняются после завершения вызовов функций.Это решение сработало для меня. Вы можете увидеть все содержимое файла, которое я сделал здесь: http://pastebin.com/yMYQJ2jK
Я также определяю конечный уровень масштабирования для 1-7, чтобы вы могли видеть свои исходные данные JSON, когда вернетесь к исходному уровню масштабирования, в противном случае они будут потеряны и никогда не будут вызываться, пока вы не перезагрузите страницу!
источник
return
заявлением. Использование глобальных переменных в javascript кажется обычным делом, поэтому сделать это будет проще всего.листовка имеет тип структуры данных группы сбора данных, а также интерфейс управления слоями, который можно включать и выключать, когда вы кодируете его в качестве прослушивателей событий при помощи флажка.
источник
Я написал приведенный ниже пример, чтобы показать, как удалить несколько слоев слоя geoJSON.
источник