123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- module.exports = Point;
- var util = require('util');
- var Geometry = require('./geometry');
- var Types = require('./types');
- var BinaryWriter = require('./binarywriter');
- var ZigZag = require('./zigzag.js');
- function Point(x, y, z, m, srid) {
- Geometry.call(this);
- this.x = x;
- this.y = y;
- this.z = z;
- this.m = m;
- this.srid = srid;
- this.hasZ = typeof this.z !== 'undefined';
- this.hasM = typeof this.m !== 'undefined';
- }
- util.inherits(Point, Geometry);
- Point.Z = function (x, y, z, srid) {
- var point = new Point(x, y, z, undefined, srid);
- point.hasZ = true;
- return point;
- };
- Point.M = function (x, y, m, srid) {
- var point = new Point(x, y, undefined, m, srid);
- point.hasM = true;
- return point;
- };
- Point.ZM = function (x, y, z, m, srid) {
- var point = new Point(x, y, z, m, srid);
- point.hasZ = true;
- point.hasM = true;
- return point;
- };
- Point._parseWkt = function (value, options) {
- var point = new Point();
- point.srid = options.srid;
- point.hasZ = options.hasZ;
- point.hasM = options.hasM;
- if (value.isMatch(['EMPTY']))
- return point;
- value.expectGroupStart();
- var coordinate = value.matchCoordinate(options);
- point.x = coordinate.x;
- point.y = coordinate.y;
- point.z = coordinate.z;
- point.m = coordinate.m;
- value.expectGroupEnd();
- return point;
- };
- Point._parseWkb = function (value, options) {
- var point = Point._readWkbPoint(value, options);
- point.srid = options.srid;
- return point;
- };
- Point._readWkbPoint = function (value, options) {
- return new Point(value.readDouble(), value.readDouble(),
- options.hasZ ? value.readDouble() : undefined,
- options.hasM ? value.readDouble() : undefined);
- };
- Point._parseTwkb = function (value, options) {
- var point = new Point();
- point.hasZ = options.hasZ;
- point.hasM = options.hasM;
- if (options.isEmpty)
- return point;
- point.x = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
- point.y = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
- point.z = options.hasZ ? ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor : undefined;
- point.m = options.hasM ? ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor : undefined;
- return point;
- };
- Point._readTwkbPoint = function (value, options, previousPoint) {
- previousPoint.x += ZigZag.decode(value.readVarInt()) / options.precisionFactor;
- previousPoint.y += ZigZag.decode(value.readVarInt()) / options.precisionFactor;
- if (options.hasZ)
- previousPoint.z += ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor;
- if (options.hasM)
- previousPoint.m += ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor;
- return new Point(previousPoint.x, previousPoint.y, previousPoint.z, previousPoint.m);
- };
- Point._parseGeoJSON = function (value) {
- return Point._readGeoJSONPoint(value.coordinates);
- };
- Point._readGeoJSONPoint = function (coordinates) {
- if (coordinates.length === 0)
- return new Point();
- if (coordinates.length > 2)
- return new Point(coordinates[0], coordinates[1], coordinates[2]);
- return new Point(coordinates[0], coordinates[1]);
- };
- Point.prototype.toWkt = function () {
- if (typeof this.x === 'undefined' && typeof this.y === 'undefined' &&
- typeof this.z === 'undefined' && typeof this.m === 'undefined')
- return this._getWktType(Types.wkt.Point, true);
- return this._getWktType(Types.wkt.Point, false) + '(' + this._getWktCoordinate(this) + ')';
- };
- Point.prototype.toWkb = function (parentOptions) {
- var wkb = new BinaryWriter(this._getWkbSize());
- wkb.writeInt8(1);
- this._writeWkbType(wkb, Types.wkb.Point, parentOptions);
- if (typeof this.x === 'undefined' && typeof this.y === 'undefined') {
- wkb.writeDoubleLE(NaN);
- wkb.writeDoubleLE(NaN);
- if (this.hasZ)
- wkb.writeDoubleLE(NaN);
- if (this.hasM)
- wkb.writeDoubleLE(NaN);
- }
- else {
- this._writeWkbPoint(wkb);
- }
- return wkb.buffer;
- };
- Point.prototype._writeWkbPoint = function (wkb) {
- wkb.writeDoubleLE(this.x);
- wkb.writeDoubleLE(this.y);
- if (this.hasZ)
- wkb.writeDoubleLE(this.z);
- if (this.hasM)
- wkb.writeDoubleLE(this.m);
- };
- Point.prototype.toTwkb = function () {
- var twkb = new BinaryWriter(0, true);
- var precision = Geometry.getTwkbPrecision(5, 0, 0);
- var isEmpty = typeof this.x === 'undefined' && typeof this.y === 'undefined';
- this._writeTwkbHeader(twkb, Types.wkb.Point, precision, isEmpty);
- if (!isEmpty)
- this._writeTwkbPoint(twkb, precision, new Point(0, 0, 0, 0));
- return twkb.buffer;
- };
- Point.prototype._writeTwkbPoint = function (twkb, precision, previousPoint) {
- var x = this.x * precision.xyFactor;
- var y = this.y * precision.xyFactor;
- var z = this.z * precision.zFactor;
- var m = this.m * precision.mFactor;
- twkb.writeVarInt(ZigZag.encode(x - previousPoint.x));
- twkb.writeVarInt(ZigZag.encode(y - previousPoint.y));
- if (this.hasZ)
- twkb.writeVarInt(ZigZag.encode(z - previousPoint.z));
- if (this.hasM)
- twkb.writeVarInt(ZigZag.encode(m - previousPoint.m));
- previousPoint.x = x;
- previousPoint.y = y;
- previousPoint.z = z;
- previousPoint.m = m;
- };
- Point.prototype._getWkbSize = function () {
- var size = 1 + 4 + 8 + 8;
- if (this.hasZ)
- size += 8;
- if (this.hasM)
- size += 8;
- return size;
- };
- Point.prototype.toGeoJSON = function (options) {
- var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
- geoJSON.type = Types.geoJSON.Point;
- if (typeof this.x === 'undefined' && typeof this.y === 'undefined')
- geoJSON.coordinates = [];
- else if (typeof this.z !== 'undefined')
- geoJSON.coordinates = [this.x, this.y, this.z];
- else
- geoJSON.coordinates = [this.x, this.y];
- return geoJSON;
- };
|