123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _ParseGeoPoint = _interopRequireDefault(require("./ParseGeoPoint"));
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- default: obj
- };
- }
- /**
- * @flow
- */
- /**
- * Creates a new Polygon with any of the following forms:<br>
- * <pre>
- * new Polygon([[0,0],[0,1],[1,1],[1,0]])
- * new Polygon([GeoPoint, GeoPoint, GeoPoint])
- * </pre>
- *
- * <p>Represents a coordinates that may be associated
- * with a key in a ParseObject or used as a reference point for geo queries.
- * This allows proximity-based queries on the key.</p>
- *
- * <p>Example:<pre>
- * var polygon = new Parse.Polygon([[0,0],[0,1],[1,1],[1,0]]);
- * var object = new Parse.Object("PlaceObject");
- * object.set("area", polygon);
- * object.save();</pre></p>
- *
- * @alias Parse.Polygon
- */
- class ParsePolygon {
- /*:: _coordinates: Array<Array<number>>;*/
- /**
- * @param {(number[][] | Parse.GeoPoint[])} coordinates An Array of coordinate pairs
- */
- constructor(coordinates /*: Array<Array<number>> | Array<ParseGeoPoint>*/) {
- this._coordinates = ParsePolygon._validate(coordinates);
- }
- /**
- * Coordinates value for this Polygon.
- * Throws an exception if not valid type.
- *
- * @property {(number[][] | Parse.GeoPoint[])} coordinates list of coordinates
- * @returns {number[][]}
- */
- get coordinates() /*: Array<Array<number>>*/{
- return this._coordinates;
- }
- set coordinates(coords /*: Array<Array<number>> | Array<ParseGeoPoint>*/) {
- this._coordinates = ParsePolygon._validate(coords);
- }
- /**
- * Returns a JSON representation of the Polygon, suitable for Parse.
- *
- * @returns {object}
- */
- toJSON() /*: { __type: string, coordinates: Array<Array<number>> }*/{
- ParsePolygon._validate(this._coordinates);
- return {
- __type: 'Polygon',
- coordinates: this._coordinates
- };
- }
- /**
- * Checks if two polygons are equal
- *
- * @param {(Parse.Polygon | object)} other
- * @returns {boolean}
- */
- equals(other /*: mixed*/) /*: boolean*/{
- if (!(other instanceof ParsePolygon) || this.coordinates.length !== other.coordinates.length) {
- return false;
- }
- let isEqual = true;
- for (let i = 1; i < this._coordinates.length; i += 1) {
- if (this._coordinates[i][0] != other.coordinates[i][0] || this._coordinates[i][1] != other.coordinates[i][1]) {
- isEqual = false;
- break;
- }
- }
- return isEqual;
- }
- /**
- *
- * @param {Parse.GeoPoint} point
- * @returns {boolean} Returns if the point is contained in the polygon
- */
- containsPoint(point /*: ParseGeoPoint*/) /*: boolean*/{
- let minX = this._coordinates[0][0];
- let maxX = this._coordinates[0][0];
- let minY = this._coordinates[0][1];
- let maxY = this._coordinates[0][1];
- for (let i = 1; i < this._coordinates.length; i += 1) {
- const p = this._coordinates[i];
- minX = Math.min(p[0], minX);
- maxX = Math.max(p[0], maxX);
- minY = Math.min(p[1], minY);
- maxY = Math.max(p[1], maxY);
- }
- const outside = point.latitude < minX || point.latitude > maxX || point.longitude < minY || point.longitude > maxY;
- if (outside) {
- return false;
- }
- let inside = false;
- for (let i = 0, j = this._coordinates.length - 1; i < this._coordinates.length; j = i++) {
- const startX = this._coordinates[i][0];
- const startY = this._coordinates[i][1];
- const endX = this._coordinates[j][0];
- const endY = this._coordinates[j][1];
- const intersect = startY > point.longitude != endY > point.longitude && point.latitude < (endX - startX) * (point.longitude - startY) / (endY - startY) + startX;
- if (intersect) {
- inside = !inside;
- }
- }
- return inside;
- }
- /**
- * Validates that the list of coordinates can form a valid polygon
- *
- * @param {Array} coords the list of coordinates to validate as a polygon
- * @throws {TypeError}
- * @returns {number[][]} Array of coordinates if validated.
- */
- static _validate(coords /*: Array<Array<number>> | Array<ParseGeoPoint>*/) /*: Array<Array<number>>*/{
- if (!Array.isArray(coords)) {
- throw new TypeError('Coordinates must be an Array');
- }
- if (coords.length < 3) {
- throw new TypeError('Polygon must have at least 3 GeoPoints or Points');
- }
- const points = [];
- for (let i = 0; i < coords.length; i += 1) {
- const coord = coords[i];
- let geoPoint;
- if (coord instanceof _ParseGeoPoint.default) {
- geoPoint = coord;
- } else if (Array.isArray(coord) && coord.length === 2) {
- geoPoint = new _ParseGeoPoint.default(coord[0], coord[1]);
- } else {
- throw new TypeError('Coordinates must be an Array of GeoPoints or Points');
- }
- points.push([geoPoint.latitude, geoPoint.longitude]);
- }
- return points;
- }
- }
- var _default = ParsePolygon;
- exports.default = _default;
|