node-red-contrib-tak-registration
Version:
A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK
63 lines (57 loc) • 2.23 kB
JavaScript
import GeometryFactory from '../geom/GeometryFactory'
import PrecisionModel from '../geom/PrecisionModel'
import WKTParser from './WKTParser'
/**
* Converts a geometry in Well-Known Text format to a {@link Geometry}.
* <p>
* <code>WKTReader</code> supports extracting <code>Geometry</code> objects
* from either {@link Reader}s or {@link String}s. This allows it to function
* as a parser to read <code>Geometry</code> objects from text blocks embedded
* in other data formats (e.g. XML).
*/
/**
* A <code>WKTReader</code> is parameterized by a <code>GeometryFactory</code>,
* to allow it to create <code>Geometry</code> objects of the appropriate
* implementation. In particular, the <code>GeometryFactory</code> determines
* the <code>PrecisionModel</code> and <code>SRID</code> that is used.
* @param {GeometryFactory} geometryFactory
* @constructor
*/
export default class WKTReader {
constructor (geometryFactory) {
this.geometryFactory = geometryFactory || new GeometryFactory()
this.precisionModel = this.geometryFactory.getPrecisionModel()
this.parser = new WKTParser(this.geometryFactory)
}
/**
* Reads a Well-Known Text representation of a {@link Geometry}
*
* @param {string}
* wkt a <Geometry Tagged Text> string (see the OpenGIS Simple Features
* Specification).
* @return {Geometry} a <code>Geometry</code> read from
* <code>string.</code>
* @memberof WKTReader
*/
read (wkt) {
var geometry = this.parser.read(wkt)
// TODO: port and use GeometryPrecisionReducer, this is a hack
if (this.precisionModel.getType() === PrecisionModel.FIXED) {
this.reducePrecision(geometry)
}
return geometry
}
reducePrecision (geometry) {
if (geometry.coordinate) {
this.precisionModel.makePrecise(geometry.coordinate)
} else if (geometry._points) {
for (let i = 0, len = geometry._points._coordinates.length; i < len; i++) {
this.precisionModel.makePrecise(geometry._points._coordinates[i])
}
} else if (geometry._geometries) {
for (let i = 0, len = geometry._geometries.length; i < len; i++) {
this.reducePrecision(geometry._geometries[i])
}
}
}
}