@openhps/core
Version:
Open Hybrid Positioning System - Core component
55 lines (49 loc) • 2.03 kB
text/typescript
import { AbsolutePosition, DataObject, RelativeDistance } from '../../data';
import { DataFrame } from '../../data/DataFrame';
import { ObjectProcessingNodeOptions } from '../ObjectProcessingNode';
import { RelativePositionProcessing } from './RelativePositionProcessing';
/**
* Cell identification processing node
* @rdf {@link http://purl.org/poso/CellIdentification}
* @category Processing node
*/
export class CellIdentificationNode<InOut extends DataFrame> extends RelativePositionProcessing<
InOut,
RelativeDistance
> {
protected options: CellIdentificationOptions;
constructor(options?: CellIdentificationOptions) {
super(RelativeDistance, options);
this.options.maxDistance = this.options.maxDistance || 2;
}
public processRelativePositions<P extends AbsolutePosition>(
dataObject: DataObject,
relativePositions: Map<RelativeDistance, DataObject>,
dataFrame: DataFrame,
): Promise<DataObject> {
return new Promise((resolve) => {
let spheres: Array<[P, number]> = [];
relativePositions.forEach((object, relativePosition) => {
if (object.getPosition()) {
spheres.push([object.getPosition() as P, relativePosition.distance]);
}
});
// Order points and distances by distances
spheres = spheres.sort((a, b) => a[1] - b[1]);
if (spheres.length > 0 && spheres[0][1] <= this.options.maxDistance) {
const position = spheres[0][0].clone() as P;
position.timestamp = dataFrame.createdTimestamp;
position.accuracy.value = spheres[0][1];
dataObject.setPosition(position);
return resolve(dataObject);
}
resolve(dataObject);
});
}
}
export interface CellIdentificationOptions extends ObjectProcessingNodeOptions {
/**
* Maximum distance before ignoring the cell-id
*/
maxDistance?: number;
}