Skip to content
Snippets Groups Projects
StationLayer.ts 4.02 KiB
Newer Older
Peter Morstein's avatar
Peter Morstein committed
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import GeoJSON from 'ol/format/GeoJSON';
Peter Morstein's avatar
Peter Morstein committed
import {Circle as CircleStyle, Fill, Stroke, Style, Text, Icon} from 'ol/style';
Peter Morstein's avatar
Peter Morstein committed
import MapProperties from './MapProperties';
import colormap from 'colormap';
export interface TemperatureSeries{
    date: number;
    value: number;
}
export default class StationLayer{
    public static readonly layerName: string = "StationLayer";
    private allTemperatureBounds: {min: number, max: number} = {min: 0, max: 0}; //min/max of all station temperature, expect for colormap
    private layer: VectorLayer;
Peter Morstein's avatar
Peter Morstein committed
    private mapProperties: MapProperties;
    private year: number = 2000;
Peter Morstein's avatar
Peter Morstein committed

    
    private colorMap: string[];
Peter Morstein's avatar
Peter Morstein committed

    constructor(mapProperties: MapProperties){
        this.mapProperties = mapProperties;

        this.colorMap = colormap({colormap:'RdBu', nshades: 20, format: 'hex', alpha: 1});

Peter Morstein's avatar
Peter Morstein committed
        this.layer = new VectorLayer({
            className: StationLayer.layerName,
Peter Morstein's avatar
Peter Morstein committed
            source: new VectorSource({
Peter Morstein's avatar
Peter Morstein committed
                url: "http://localhost:42000/",
Peter Morstein's avatar
Peter Morstein committed
                format: new GeoJSON(),
            }),
            style: (feature)=>{return this.stationStyle(feature)}
        });
        
        
        var b = this.layer.on('change', ()=>{
            if(this.allTemperatureBounds.max==0){
                this.layer.getSource().getFeatures().forEach(feature => {
                    feature.getKeys().forEach(element => {
                        
                        if(!isNaN(element) && Number.parseInt(element)>=1800 && feature.get(element)!=null){
                            if(feature.get(element)<this.allTemperatureBounds.min && feature.get(element)>=-10){
                                this.allTemperatureBounds.min = feature.get(element);
                            }else if(feature.get(element)>this.allTemperatureBounds.max){
Peter Morstein's avatar
Peter Morstein committed
                                this.allTemperatureBounds.max = feature.get(element) + 2;
Peter Morstein's avatar
Peter Morstein committed

                this.mapProperties.setTemperatureBound(this.allTemperatureBounds);
Peter Morstein's avatar
Peter Morstein committed
    }

    public getLayer(): any{
        return this.layer;
    }

    protected stationStyle(feature){

        let fontSize = 15
Peter Morstein's avatar
Peter Morstein committed
        let label = '';
Peter Morstein's avatar
Peter Morstein committed
        if(this.mapProperties.getZoomLevel()>=8){
Peter Morstein's avatar
Peter Morstein committed
            label += feature.get("station_id");
        let iconColor = "none";

        if(feature.get(this.year)){
            let temperature = feature.get(this.year);
            let temperaturePos = (temperature - this.allTemperatureBounds.min) / (Math.abs(this.allTemperatureBounds.min)+this.allTemperatureBounds.max));
            let colorPos = Math.round(this.colorMap.length * temperaturePos) - 1;
            iconColor = this.colorMap[colorPos];
Peter Morstein's avatar
Peter Morstein committed
        }

Peter Morstein's avatar
Peter Morstein committed
        return new Style({
            text: new Text({
                font: fontSize+'px Helvetica,bold',
                overflow: true,
                fill: new Fill({
                    color: 'rgba(0,0,0,1)'
                }),
                offsetY: 24,
Peter Morstein's avatar
Peter Morstein committed
                text: label
Peter Morstein's avatar
Peter Morstein committed
            }),
            image: new Icon({
                crossOrigin: 'anonymous',
                imgSize: [24, 24],
Peter Morstein's avatar
Peter Morstein committed
                scale: this.mapProperties.getZoomLevel() * 0.15,
                src: this.mapProperties.getTemperatureIcon(iconColor)
Peter Morstein's avatar
Peter Morstein committed
              })
    public getTemperatureSeriesFromFeature(feature: any): TemperatureSeries[]{
        let series: TemperatureSeries[] = new Array<TemperatureSeries>();
        feature.getKeys().forEach(element => {
            if(!isNaN(element) && Number.parseInt(element)>=1800 && feature.get(element)!=null){
                series.push({date: Number.parseInt(element), value: feature.get(element)});
            }
        });
        return series;
    }

Peter Morstein's avatar
Peter Morstein committed
    public newYear(year: number ):void{
        this.year = year;
        this.layer.changed();
    }

    public getColorMap(){

Peter Morstein's avatar
Peter Morstein committed
    }

Peter Morstein's avatar
Peter Morstein committed
}