Refactoring and added type
This commit is contained in:
		
							parent
							
								
									872e9f528c
								
							
						
					
					
						commit
						03df7ac58b
					
				@ -343,12 +343,12 @@ export default abstract class LeafletMap {
 | 
			
		||||
 | 
			
		||||
    // Polyline
 | 
			
		||||
 | 
			
		||||
    updatePolylines(polyData: FormattedData[][]) {
 | 
			
		||||
        polyData.forEach((data: FormattedData[]) => {
 | 
			
		||||
            if (data.length) {
 | 
			
		||||
                const dataSource = polyData.map(arr => arr[0]);
 | 
			
		||||
                if (this.polylines.get(data[0].entityName)) {
 | 
			
		||||
                    this.updatePolyline(data[0].entityName, data, dataSource, this.options);
 | 
			
		||||
    updatePolylines(polyData: FormattedData[][], data?: FormattedData) {
 | 
			
		||||
        polyData.forEach((dataSource) => {
 | 
			
		||||
            data = data || dataSource[0];
 | 
			
		||||
            if (dataSource.length) {
 | 
			
		||||
                if (this.polylines.get(data.$datasource.entityName)) {
 | 
			
		||||
                    this.updatePolyline(data, dataSource, this.options);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    this.createPolyline(data, dataSource, this.options);
 | 
			
		||||
@ -357,22 +357,20 @@ export default abstract class LeafletMap {
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    createPolyline(data: FormattedData[], dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
        if (data.length)
 | 
			
		||||
            this.ready$.subscribe(() => {
 | 
			
		||||
                const poly = new Polyline(this.map,
 | 
			
		||||
                    data.map(el => this.convertPosition(el)).filter(el => !!el), data, dataSources, settings);
 | 
			
		||||
                const bounds = poly.leafletPoly.getBounds();
 | 
			
		||||
                this.fitBounds(bounds);
 | 
			
		||||
                this.polylines.set(data[0].entityName, poly);
 | 
			
		||||
            });
 | 
			
		||||
    createPolyline(data: FormattedData, dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
        this.ready$.subscribe(() => {
 | 
			
		||||
            const poly = new Polyline(this.map,
 | 
			
		||||
              dataSources.map(el => this.convertPosition(el)).filter(el => !!el), data, dataSources, settings);
 | 
			
		||||
            const bounds = poly.leafletPoly.getBounds();
 | 
			
		||||
            this.fitBounds(bounds);
 | 
			
		||||
            this.polylines.set(data.$datasource.entityName, poly);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updatePolyline(key: string, data: FormattedData[], dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
    updatePolyline(data: FormattedData, dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
        this.ready$.subscribe(() => {
 | 
			
		||||
            const poly = this.polylines.get(key);
 | 
			
		||||
            poly.updatePolyline(settings, data.map(el => this.convertPosition(el)), dataSources);
 | 
			
		||||
            const bounds = poly.leafletPoly.getBounds();
 | 
			
		||||
            const poly = this.polylines.get(data.$datasource.entityName);
 | 
			
		||||
            poly.updatePolyline(dataSources.map(el => this.convertPosition(el)).filter(el => !!el), data, dataSources, settings);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ import { Datasource } from '@app/shared/models/widget.models';
 | 
			
		||||
import _ from 'lodash';
 | 
			
		||||
import { Observable, Observer, of } from 'rxjs';
 | 
			
		||||
import { map } from 'rxjs/operators';
 | 
			
		||||
import { createLabelFromDatasource, hashCode, isNumber, padValue } from '@core/utils';
 | 
			
		||||
import { createLabelFromDatasource, hashCode, isNumber, isUndefined, padValue } from '@core/utils';
 | 
			
		||||
 | 
			
		||||
export function createTooltip(target: L.Layer,
 | 
			
		||||
    settings: MarkerSettings | PolylineSettings | PolygonSettings,
 | 
			
		||||
@ -70,6 +70,9 @@ export function interpolateOnLineSegment(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function findAngle(startPoint: FormattedData, endPoint: FormattedData, latKeyName: string, lngKeyName: string): number {
 | 
			
		||||
  if(isUndefined(startPoint) || isUndefined(endPoint)){
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
  let angle = -Math.atan2(endPoint[latKeyName] - startPoint[latKeyName], endPoint[lngKeyName] - startPoint[lngKeyName]);
 | 
			
		||||
  angle = angle * 180 / Math.PI;
 | 
			
		||||
  return parseInt(angle.toFixed(2), 10);
 | 
			
		||||
 | 
			
		||||
@ -21,11 +21,11 @@ import { FormattedData, PolygonSettings } from './map-models';
 | 
			
		||||
export class Polygon {
 | 
			
		||||
 | 
			
		||||
    leafletPoly: L.Polygon;
 | 
			
		||||
    tooltip;
 | 
			
		||||
    data;
 | 
			
		||||
    dataSources;
 | 
			
		||||
    tooltip: L.Popup;
 | 
			
		||||
    data: FormattedData;
 | 
			
		||||
    dataSources: FormattedData[];
 | 
			
		||||
 | 
			
		||||
    constructor(public map, polyData: FormattedData, dataSources, private settings: PolygonSettings) {
 | 
			
		||||
    constructor(public map, polyData: FormattedData, dataSources: FormattedData[], private settings: PolygonSettings) {
 | 
			
		||||
        this.dataSources = dataSources;
 | 
			
		||||
        this.data = polyData;
 | 
			
		||||
        const polygonColor = this.getPolygonColor(settings);
 | 
			
		||||
 | 
			
		||||
@ -17,82 +17,83 @@
 | 
			
		||||
import L, { PolylineDecoratorOptions } from 'leaflet';
 | 
			
		||||
import 'leaflet-polylinedecorator';
 | 
			
		||||
 | 
			
		||||
import { PolylineSettings } from './map-models';
 | 
			
		||||
import { FormattedData, PolylineSettings } from './map-models';
 | 
			
		||||
import { safeExecute } from '@home/components/widget/lib/maps/maps-utils';
 | 
			
		||||
 | 
			
		||||
export class Polyline {
 | 
			
		||||
 | 
			
		||||
    leafletPoly: L.Polyline;
 | 
			
		||||
    polylineDecorator: L.PolylineDecorator;
 | 
			
		||||
    dataSources;
 | 
			
		||||
    data;
 | 
			
		||||
  leafletPoly: L.Polyline;
 | 
			
		||||
  polylineDecorator: L.PolylineDecorator;
 | 
			
		||||
  dataSources: FormattedData[];
 | 
			
		||||
  data: FormattedData;
 | 
			
		||||
 | 
			
		||||
    constructor(private map: L.Map, locations, data, dataSources, settings: PolylineSettings) {
 | 
			
		||||
        this.dataSources = dataSources;
 | 
			
		||||
        this.data = data;
 | 
			
		||||
  constructor(private map: L.Map, locations: L.LatLng[], data: FormattedData, dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
    this.dataSources = dataSources;
 | 
			
		||||
    this.data = data;
 | 
			
		||||
 | 
			
		||||
        this.leafletPoly = L.polyline(locations,
 | 
			
		||||
            this.getPolyStyle(settings)
 | 
			
		||||
        ).addTo(this.map);
 | 
			
		||||
    this.leafletPoly = L.polyline(locations,
 | 
			
		||||
      this.getPolyStyle(settings)
 | 
			
		||||
    ).addTo(this.map);
 | 
			
		||||
 | 
			
		||||
        if (settings.usePolylineDecorator) {
 | 
			
		||||
            this.polylineDecorator = L.polylineDecorator(this.leafletPoly, this.getDecoratorSettings(settings)).addTo(this.map);
 | 
			
		||||
    if (settings.usePolylineDecorator) {
 | 
			
		||||
      this.polylineDecorator = L.polylineDecorator(this.leafletPoly, this.getDecoratorSettings(settings)).addTo(this.map);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getDecoratorSettings(settings: PolylineSettings): PolylineDecoratorOptions {
 | 
			
		||||
    return {
 | 
			
		||||
      patterns: [
 | 
			
		||||
        {
 | 
			
		||||
          offset: settings.decoratorOffset,
 | 
			
		||||
          endOffset: settings.endDecoratorOffset,
 | 
			
		||||
          repeat: settings.decoratorRepeat,
 | 
			
		||||
          symbol: L.Symbol[settings.decoratorSymbol]({
 | 
			
		||||
            pixelSize: settings.decoratorSymbolSize,
 | 
			
		||||
            polygon: false,
 | 
			
		||||
            pathOptions: {
 | 
			
		||||
              color: settings.useDecoratorCustomColor ? settings.decoratorCustomColor : this.getPolyStyle(settings).color,
 | 
			
		||||
              stroke: true
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    getDecoratorSettings(settings: PolylineSettings): PolylineDecoratorOptions {
 | 
			
		||||
        return {
 | 
			
		||||
            patterns: [
 | 
			
		||||
                {
 | 
			
		||||
                    offset: settings.decoratorOffset,
 | 
			
		||||
                    endOffset: settings.endDecoratorOffset,
 | 
			
		||||
                    repeat: settings.decoratorRepeat,
 | 
			
		||||
                    symbol: L.Symbol[settings.decoratorSymbol]({
 | 
			
		||||
                        pixelSize: settings.decoratorSymbolSize,
 | 
			
		||||
                        polygon: false,
 | 
			
		||||
                        pathOptions: {
 | 
			
		||||
                            color: settings.useDecoratorCustomColor ? settings.decoratorCustomColor : this.getPolyStyle(settings).color,
 | 
			
		||||
                            stroke: true
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            interactive: false,
 | 
			
		||||
        } as PolylineDecoratorOptions
 | 
			
		||||
    }
 | 
			
		||||
  updatePolyline(locations: L.LatLng[], data: FormattedData, dataSources: FormattedData[], settings: PolylineSettings) {
 | 
			
		||||
    this.data = data;
 | 
			
		||||
    this.dataSources = dataSources;
 | 
			
		||||
    this.leafletPoly.setLatLngs(locations);
 | 
			
		||||
    this.leafletPoly.setStyle(this.getPolyStyle(settings));
 | 
			
		||||
    //  this.setPolylineLatLngs(data);
 | 
			
		||||
    if (this.polylineDecorator)
 | 
			
		||||
      this.polylineDecorator.setPaths(this.leafletPoly);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    updatePolyline(settings, data, dataSources) {
 | 
			
		||||
        this.data = data;
 | 
			
		||||
        this.dataSources = dataSources;
 | 
			
		||||
        this.leafletPoly.setStyle(this.getPolyStyle(settings));
 | 
			
		||||
        //  this.setPolylineLatLngs(data);
 | 
			
		||||
        if (this.polylineDecorator)
 | 
			
		||||
            this.polylineDecorator.setPaths(this.leafletPoly);
 | 
			
		||||
  getPolyStyle(settings: PolylineSettings): L.PolylineOptions {
 | 
			
		||||
    return {
 | 
			
		||||
      interactive: false,
 | 
			
		||||
      color: settings.useColorFunction ?
 | 
			
		||||
        safeExecute(settings.colorFunction,
 | 
			
		||||
          [this.data, this.dataSources, this.data.dsIndex]) : settings.color,
 | 
			
		||||
      opacity: settings.useStrokeOpacityFunction ?
 | 
			
		||||
        safeExecute(settings.strokeOpacityFunction,
 | 
			
		||||
          [this.data, this.dataSources, this.data.dsIndex]) : settings.strokeOpacity,
 | 
			
		||||
      weight: settings.useStrokeWeightFunction ?
 | 
			
		||||
        safeExecute(settings.strokeWeightFunction,
 | 
			
		||||
          [this.data, this.dataSources, this.data.dsIndex]) : settings.strokeWeight,
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    getPolyStyle(settings: PolylineSettings): L.PolylineOptions {
 | 
			
		||||
        return {
 | 
			
		||||
            color: settings.useColorFunction ?
 | 
			
		||||
                safeExecute(settings.colorFunction,
 | 
			
		||||
                    [this.data, this.dataSources, this.dataSources[0]?.dsIndex]) : settings.color,
 | 
			
		||||
            opacity: settings.useStrokeOpacityFunction ?
 | 
			
		||||
                safeExecute(settings.strokeOpacityFunction,
 | 
			
		||||
                    [this.data, this.dataSources, this.dataSources[0]?.dsIndex]) : settings.strokeOpacity,
 | 
			
		||||
            weight: settings.useStrokeWeightFunction ?
 | 
			
		||||
                safeExecute(settings.strokeWeightFunction,
 | 
			
		||||
                    [this.data, this.dataSources, this.dataSources[0]?.dsIndex]) : settings.strokeWeight,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  removePolyline() {
 | 
			
		||||
    this.map.removeLayer(this.leafletPoly);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    removePolyline() {
 | 
			
		||||
        this.map.removeLayer(this.leafletPoly);
 | 
			
		||||
    }
 | 
			
		||||
  getPolylineLatLngs() {
 | 
			
		||||
    return this.leafletPoly.getLatLngs();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    getPolylineLatLngs() {
 | 
			
		||||
        return this.leafletPoly.getLatLngs();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setPolylineLatLngs(latLngs) {
 | 
			
		||||
        this.leafletPoly.setLatLngs(latLngs);
 | 
			
		||||
    }
 | 
			
		||||
  setPolylineLatLngs(latLngs) {
 | 
			
		||||
    this.leafletPoly.setLatLngs(latLngs);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -136,7 +136,7 @@ export class TripAnimationComponent implements OnInit, AfterViewInit {
 | 
			
		||||
    this.calcLabel();
 | 
			
		||||
    this.calcTooltip();
 | 
			
		||||
    if (this.mapWidget) {
 | 
			
		||||
      this.mapWidget.map.updatePolylines(this.interpolatedTimeData.map(ds => _.values(ds)));
 | 
			
		||||
      this.mapWidget.map.updatePolylines(this.interpolatedTimeData.map(ds => _.values(ds)), this.activeTrip);
 | 
			
		||||
      if (this.settings.showPolygon) {
 | 
			
		||||
        this.mapWidget.map.updatePolygons(this.interpolatedTimeData);
 | 
			
		||||
      }
 | 
			
		||||
@ -211,7 +211,7 @@ export class TripAnimationComponent implements OnInit, AfterViewInit {
 | 
			
		||||
      } else {
 | 
			
		||||
        result[normalizeTime] = {
 | 
			
		||||
          ...originData[i],
 | 
			
		||||
          rotationAngle: findAngle(originData[i - 1], originData[i], latKeyName, lngKeyName) + this.settings.rotationAngle
 | 
			
		||||
          rotationAngle: this.settings.rotationAngle + findAngle(originData[i - 1], originData[i], latKeyName, lngKeyName)
 | 
			
		||||
        };
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user