let ol = require('openlayers');
let AbstractStyle = require('./abstract');
let UniformStyle = require('./uniform');
let SymbolFabric = require('./../symbols/symbolFabric');
let LegendItem = require('./legendItem');
let mem = require('mem');
/**
* Класс UniqueStyle создает стиль, основанный на частных значениях
* @extends AbstractStyle
*/
class UniqueStyle extends AbstractStyle {
/**
* Создает экземпляр стиля типа UniqueStyle
* @param params
*/
constructor(params) {
super(params);
this.type = "unique";
this.geometryType = params.geometryType;
this.params = params;
this.field = params.field;
this.styles = this.create(params);
this.styleDefault = this.createDefault(params);
this.memoize = {};
}
getStyle() {
let field = this.field;
let styles = this.styles;
let styleDefault = this.styleDefault;
let params = this.params;
let memoize = this.memoize;
const styleFunction = function (feature, resolution) {
let style = styleDefault.style;
let classify;
try {
classify = feature.get(field);
if (memoize[classify]) return memoize[classify];
if (classify) {
style = styles[classify].style;
style.setText(SymbolFabric().text(params, feature));
}
}
catch (e) {
style = styleDefault.style;
style.setText(SymbolFabric().text(params, feature));
}
memoize[classify] = style;
return style;
};
return styleFunction;
}
setStyle(style) {
this.styles = style;
}
styleArray() {
let self = this;
let params = self.params;
let geometryType = self.geometryType || super.testGeometry(params);
let styles = [];
let field = self.field;
let index = 0;
let defaultProperties = {};
defaultProperties[field] = undefined;
let defaultLegendItem = new LegendItem({
index: index,
field: field,
value: undefined,
properties: defaultProperties,
style: self.styleDefault,
geometryType: geometryType
});
styles.push(defaultLegendItem);
for (let value in params.values) {
let properties = {};
properties[field] = value;
let label = field + "=" + value;
let valueLegendItem = new LegendItem({
index: ++index,
properties: properties,
label: label,
style: params.values[value],
geometryType: geometryType
});
styles.push(valueLegendItem);
}
return styles;
}
legend() {
return this.styleArray();
}
create(params) {
let styleContainer = {};
let styleParameters = params.values;
for (let key in styleParameters) {
styleContainer[key] = new UniformStyle(styleParameters[key])
}
return styleContainer;
}
createDefault(params) {
let styleParameters = params.default;
return new UniformStyle(styleParameters);
}
}
module.exports = UniqueStyle;