import { Feature } from 'ol'; import { Geometry, LineString, Point } from 'ol/geom'; import VectorSource from 'ol/source/Vector'; import { DataFrame, Field } from '@grafana/data'; import { getGeometryField, LocationFieldMatchers } from './location'; export interface FrameVectorSourceOptions {} export class FrameVectorSource extends VectorSource { constructor(private location: LocationFieldMatchers) { super({}); } update(frame: DataFrame) { this.clear(true); const info = getGeometryField(frame, this.location); if (!info.field) { this.changed(); return; } for (let i = 0; i < frame.length; i++) { this.addFeatureInternal( new Feature({ frame, rowIndex: i, geometry: info.field.values.get(i) as T, }) ); } // only call this at the end this.changed(); } updateLineString(frame: DataFrame) { this.clear(true); const info = getGeometryField(frame, this.location); if (!info.field) { this.changed(); return; } //eslint-disable-next-line const field = info.field as Field; const geometry = new LineString(field.values.toArray().map((p) => p.getCoordinates())) as Geometry; this.addFeatureInternal( new Feature({ frame, rowIndex: 0, geometry: geometry as T, }) ); // only call this at the end this.changed(); } }