updateFlylinesData()

in packages/layers/flyline/src/FlyLineLayer.ts [174:231]


	updateFlylinesData(data) {
		if (!this.flyline) {
			return
		}

		// Clear repeating callback => clear all tracks
		this.grids.forEach((item) => (item.grid.onEnd = () => {}))
		this.flyline.clear()

		const grids: FlyInfo[] = []
		for (let i = 0, l = data.length; i < l; i++) {
			const d = data[i]
			const { xyzStart, xyzEnd, duration, minHeight, maxHeight, delay, repeat } = d

			// @浅寻 Patch format: `lngStart` `latStart` `lngEnd` `latEnd`
			const { lngStart, latStart, altStart, lngEnd, latEnd, altEnd } = d
			let { lnglatStart, lnglatEnd } = d

			if (
				lngStart !== undefined &&
				latStart !== undefined &&
				lngEnd !== undefined &&
				latEnd !== undefined
			) {
				lnglatStart = [lngStart, latStart, altStart]
				lnglatEnd = [lngEnd, latEnd, altEnd]
			}

			let posStart, posEnd
			if (lnglatStart && lnglatEnd) {
				posStart = this.geoWrapProjection.project(lnglatStart[0], lnglatStart[1], lnglatStart[2])
				posEnd = this.geoWrapProjection.project(lnglatEnd[0], lnglatEnd[1], lnglatEnd[2])
			} else if (xyzStart && xyzEnd) {
				posStart = xyzStart
				posEnd = xyzEnd
			}

			const segment = this.getProp('lineSegments') as number
			const padding = segment * (this.getProp('flyPercent') as number)
			const grid = new Grid({
				pointStart: new Vector3().fromArray(posStart),
				pointEnd: new Vector3().fromArray(posEnd),
				segment: segment,
				padding: padding,
				maxHeight: maxHeight ?? this.getProp('maxHeight'),
				minHeight: minHeight ?? this.getProp('minHeight'),
				type: this.geoWrapProjection.isPlaneProjection ? 'onPlane' : 'onSphere',
			})
			grids.push({
				grid: grid,
				duration: duration || (this.getProp('duration') as number),
				delay: delay || (this.getProp('delay') as number) * i,
				repeat: repeat === undefined ? this.getProp('repeat') : repeat,
			})
		}

		this._fly(grids)
	}