From 09152834a358acf246a19aa943fb8b681f238538 Mon Sep 17 00:00:00 2001 From: j8seangel Date: Fri, 19 Apr 2024 07:45:11 +0200 Subject: [PATCH] cleanup vessels layer --- .../src/layers/vessel/VesselLayer.ts | 25 +++-- .../src/vessels/lib/parse-tracks.ts | 94 ------------------- 2 files changed, 19 insertions(+), 100 deletions(-) diff --git a/libs/deck-layers/src/layers/vessel/VesselLayer.ts b/libs/deck-layers/src/layers/vessel/VesselLayer.ts index 8e08c439ff..1efe6ea152 100644 --- a/libs/deck-layers/src/layers/vessel/VesselLayer.ts +++ b/libs/deck-layers/src/layers/vessel/VesselLayer.ts @@ -38,6 +38,7 @@ export type VesselLayerProps = BaseLayerProps & VesselEventsLayerProps & _VesselLayerProps +let warnLogged = false export class VesselLayer extends CompositeLayer { dataStatus: VesselDataStatus[] = [] @@ -68,6 +69,19 @@ export class VesselLayer extends CompositeLayer { this.setState({ error }) } + _getTracksUrl({ start, end, trackUrl }: { start: string; end: string; trackUrl: string }) { + const trackUrlObject = new URL(trackUrl) + trackUrlObject.searchParams.append('start-date', start) + trackUrlObject.searchParams.append('end-date', end) + const format = trackUrlObject.searchParams.get('format') || 'DECKGL' + if (format !== 'DECKGL' && !warnLogged) { + console.warn(`only DECKGL format is supported, the current format (${format}) was replaced`) + warnLogged = true + } + trackUrlObject.searchParams.set('format', 'DECKGL') + return trackUrlObject.toString() + } + _getVesselTrackLayers() { const { trackUrl, visible, startTime, endTime, color, highlightStartTime, highlightEndTime } = this.props @@ -76,17 +90,16 @@ export class VesselLayer extends CompositeLayer { return [] } const chunks = getVesselResourceChunks(startTime, endTime) - return chunks.map(({ start, end }) => { + return chunks.flatMap(({ start, end }) => { + if (!start || !end) { + return [] + } const chunkId = `${TRACK_LAYER_TYPE}-${start}-${end}` - const trackUrlObject = new URL(trackUrl as string) - trackUrlObject.searchParams.append('start-date', start as string) - trackUrlObject.searchParams.append('end-date', end as string) - trackUrlObject.searchParams.set('format', 'DECKGL') return new VesselTrackLayer( this.getSubLayerProps({ id: chunkId, visible, - data: trackUrlObject.toString(), + data: this._getTracksUrl({ start, end, trackUrl }), type: TRACK_LAYER_TYPE, loaders: [VesselTrackLoader], _pathType: 'open', diff --git a/libs/deck-loaders/src/vessels/lib/parse-tracks.ts b/libs/deck-loaders/src/vessels/lib/parse-tracks.ts index ff1744a45c..f7ce3e7b76 100644 --- a/libs/deck-loaders/src/vessels/lib/parse-tracks.ts +++ b/libs/deck-loaders/src/vessels/lib/parse-tracks.ts @@ -1,102 +1,8 @@ -import { TrackField } from '@globalfishingwatch/api-types' import { VesselTrackData } from './types' import { DeckTrack } from './vessel-track-proto' export const DEFAULT_NULL_VALUE = -Math.pow(2, 31) -const transformerByField: Partial number>> = { - latitude: (value: number) => value / Math.pow(10, 6), - longitude: (value: number) => value / Math.pow(10, 6), - timestamp: (value: number) => value * Math.pow(10, 3), -} - -type Point = Record -export const trackValueArrayToSegments = (valueArray: number[], fields_: TrackField[]) => { - if (!fields_.length) { - throw new Error() - } - - const fields = [...fields_] - if (fields.includes(TrackField.lonlat)) { - const llIndex = fields.indexOf('lonlat' as TrackField) - fields.splice(llIndex, 1, TrackField.longitude, TrackField.latitude) - } - const numFields = fields.length - - let numSegments: number - const segmentIndices = [] as number[] - const segments = [] as Point[][] - - let nullValue = DEFAULT_NULL_VALUE - let currentSegment = [] as Point[] - let currentPoint = {} as Point - let pointsFieldIndex = 0 - let currentPointFieldIndex = 0 - let currentSegmentIndex = 0 - let currentSegPointIndex = 0 - if (valueArray && valueArray?.length) { - valueArray.forEach((value, index) => { - if (index === 0) { - nullValue = value - } else if (index === 1) { - numSegments = value - } else if (index < 2 + numSegments) { - segmentIndices.push(value) - } else { - // a segment starts - if (segmentIndices.includes(pointsFieldIndex)) { - // close previous segment, only if needed (it's not the first segment) - if (currentSegmentIndex !== 0) { - currentSegment.push(currentPoint) - segments.push(currentSegment) - } - currentSegPointIndex = 0 - currentSegmentIndex++ - // create new segment - currentSegment = [] - currentPoint = {} - } - - // get what is the current field for current point - currentPointFieldIndex = pointsFieldIndex % numFields - - // a point starts - if (currentPointFieldIndex === 0) { - // close previous point, only if needed (it's not the first point of this seg) - if (currentSegPointIndex !== 0) { - currentSegment.push(currentPoint) - } - currentSegPointIndex++ - // create new point - currentPoint = {} - } - - const field = fields[currentPointFieldIndex] - const transformer = transformerByField[field] - - if (value === nullValue || transformer === undefined) { - currentPoint[field] = null - } else { - currentPoint[field] = transformer(value) - } - - pointsFieldIndex++ - } - }) - } - - // close last open point and open segment - if (Object.keys(currentPoint).length) { - currentSegment.push(currentPoint) - } - - if (currentSegment.length) { - segments.push(currentSegment) - } - - return segments -} - export const parseTrack = (arrayBuffer: ArrayBuffer): VesselTrackData => { const track = DeckTrack.decode(new Uint8Array(arrayBuffer)) as any return {