#javascript #leaflet
Вопрос:
Я использую листовку 1.6.0. Я хочу регулярно менять цвет геоджсона, что следует делать, если не ошибаюсь, с setStyle
помощью .
Для достижения этой цели я использую интервал, подобный следующему:
geo_json = L.geoJSON(geo, {
style: {
stroke: true,
color: "black",
fillColor: "blue"
}
}).addTo(map);
function high(obj) {
const current_color = obj.options.style.color
console.log(obj.options.style)
if (current_color == "black") {
console.log("to blue")
obj.setStyle({
color: "blue",
fillColor: "yellow",
stroke: true
})
} else {
console.log("to black")
obj.setStyle({
color: "black",
fillColor: "back",
stroke: true
})
}
}
var inter = setInterval(high, 100, geo_json)
Однако это не работает.
При первом прохождении high
функции цвет устанавливается правильно. Но во время следующих итераций значение obj.options.style.color по-прежнему остается «черным». Как следствие, он никогда больше не превратится из синего в черный. Похоже setStyle
, что это не влияет на свойства объекта, даже если он меняет свой цвет.
Вот скрипка.
Как я должен правильно использовать setStyle
, чтобы повторно обновить цвет моего geojson ?
Комментарии:
1. Просто для справки, это действительно ожидаемое поведение, и оно может действительно подойти для вашего случая: обновляя только стиль дочерних слоев, стиль группы слоев GeoJSON остается на своем начальном значении, что позволяет использовать
resetStyle()
метод.
Ответ №1:
Проблема в том, что функция setStyle
L. GeoJOSN изменяет только стиль дочерних слоев, а не его самого:
setStyle: function (style) {
return this.eachLayer(function (layer) {
this._setLayerStyle(layer, style);
}, this);
},
Если вы хотите изменить параметр стиля слоя GeoJSON, вам необходимо обновить свойство вручную:
var newStyle = {
color: "black",
fillColor: "back",
stroke: true
};
obj.setStyle(newStyle);
obj.options.style = Object.assign({}, obj.options.style, newStyle); // merge the new style into the old one