You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.0 KiB
JavaScript
134 lines
4.0 KiB
JavaScript
/*
|
|
* Copyright DataStax, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
'use strict';
|
|
const util = require('util');
|
|
const utils = require('../utils');
|
|
const Geometry = require('./geometry');
|
|
|
|
/**
|
|
* Creates a new {@link Point} instance.
|
|
* @classdesc
|
|
* A Point is a zero-dimensional object that represents a specific (X,Y)
|
|
* location in a two-dimensional XY-Plane. In case of Geographic Coordinate
|
|
* Systems, the X coordinate is the longitude and the Y is the latitude.
|
|
* @param {Number} x The X coordinate.
|
|
* @param {Number} y The Y coordinate.
|
|
* @extends {Geometry}
|
|
* @alias module:geometry~Point
|
|
* @constructor
|
|
*/
|
|
function Point(x, y) {
|
|
if (typeof x !== 'number' || typeof y !== 'number') {
|
|
throw new TypeError('X and Y must be numbers');
|
|
}
|
|
if (isNaN(x) || isNaN(y)) {
|
|
throw new TypeError('X and Y must be numbers');
|
|
}
|
|
/**
|
|
* Returns the X coordinate of this 2D point.
|
|
* @type {Number}
|
|
*/
|
|
this.x = x;
|
|
/**
|
|
* Returns the Y coordinate of this 2D point.
|
|
* @type {Number}
|
|
*/
|
|
this.y = y;
|
|
}
|
|
|
|
//noinspection JSCheckFunctionSignatures
|
|
util.inherits(Point, Geometry);
|
|
|
|
/**
|
|
* Creates a {@link Point} instance from
|
|
* a <a href="https://en.wikipedia.org/wiki/Well-known_text">Well-known Text (WKT)</a>
|
|
* representation of a 2D point.
|
|
* @param {Buffer} buffer
|
|
* @returns {Point}
|
|
*/
|
|
Point.fromBuffer = function (buffer) {
|
|
if (!buffer || buffer.length !== 21) {
|
|
throw new TypeError('2D Point buffer should contain 21 bytes');
|
|
}
|
|
const endianness = Geometry.getEndianness(buffer.readInt8(0, true));
|
|
if (Geometry.readInt32(buffer, endianness, 1) !== Geometry.types.Point2D) {
|
|
throw new TypeError('Binary representation was not a point');
|
|
}
|
|
return new Point(Geometry.readDouble(buffer, endianness, 5), Geometry.readDouble(buffer, endianness, 13));
|
|
};
|
|
|
|
/**
|
|
* Creates a {@link Point} instance from
|
|
* a <a href="https://en.wikipedia.org/wiki/Well-known_text">Well-known Text (WKT)</a>
|
|
* representation of a 2D point.
|
|
* @param {String} textValue
|
|
* @returns {Point}
|
|
*/
|
|
Point.fromString = function (textValue) {
|
|
const wktRegex = /^POINT\s?\(([-0-9.]+) ([-0-9.]+)\)$/g;
|
|
const matches = wktRegex.exec(textValue);
|
|
if (!matches || matches.length !== 3) {
|
|
throw new TypeError('2D Point WTK should contain 2 coordinates');
|
|
}
|
|
return new Point(parseFloat(matches[1]), parseFloat(matches[2]));
|
|
};
|
|
|
|
/**
|
|
* Returns a <a href="https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary">Well-known Binary</a> (WKB)
|
|
* representation of this instance.
|
|
* @returns {Buffer}
|
|
*/
|
|
Point.prototype.toBuffer = function () {
|
|
const buffer = utils.allocBufferUnsafe(21);
|
|
this.writeEndianness(buffer, 0);
|
|
this.writeInt32(Geometry.types.Point2D, buffer, 1);
|
|
this.writeDouble(this.x, buffer, 5);
|
|
this.writeDouble(this.y, buffer, 13);
|
|
return buffer;
|
|
};
|
|
|
|
/**
|
|
* Returns true if the values of the point are the same, otherwise it returns false.
|
|
* @param {Point} other
|
|
* @returns {Boolean}
|
|
*/
|
|
Point.prototype.equals = function (other) {
|
|
if (!(other instanceof Point)) {
|
|
return false;
|
|
}
|
|
return (this.x === other.x && this.y === other.y);
|
|
};
|
|
|
|
/**
|
|
* Returns Well-known text (WKT) representation of the geometry object.
|
|
* @returns {String}
|
|
*/
|
|
Point.prototype.toString = function () {
|
|
return util.format('POINT (%d %d)', this.x, this.y);
|
|
};
|
|
|
|
Point.prototype.useBESerialization = function () {
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Returns a JSON representation of this geo-spatial type.
|
|
*/
|
|
Point.prototype.toJSON = function () {
|
|
return { type: 'Point', coordinates: [ this.x, this.y ]};
|
|
};
|
|
|
|
module.exports = Point; |