123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- var distance_1 = __importDefault(require("@turf/distance"));
- var intersect_1 = __importDefault(require("@turf/intersect"));
- var helpers_1 = require("@turf/helpers");
- /**
- * Takes a bounding box and a cell depth and returns a set of triangular {@link Polygon|polygons} in a grid.
- *
- * @name triangleGrid
- * @param {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
- * @param {number} cellSide dimension of each cell
- * @param {Object} [options={}] Optional parameters
- * @param {string} [options.units='kilometers'] used in calculating cellSide, can be degrees, radians, miles, or kilometers
- * @param {Feature<Polygon>} [options.mask] if passed a Polygon or MultiPolygon, the grid Points will be created only inside it
- * @param {Object} [options.properties={}] passed to each point of the grid
- * @returns {FeatureCollection<Polygon>} grid of polygons
- * @example
- * var bbox = [-95, 30 ,-85, 40];
- * var cellSide = 50;
- * var options = {units: 'miles'};
- *
- * var triangleGrid = turf.triangleGrid(bbox, cellSide, options);
- *
- * //addToMap
- * var addToMap = [triangleGrid];
- */
- function triangleGrid(bbox, cellSide, options) {
- if (options === void 0) { options = {}; }
- // Containers
- var results = [];
- // Input Validation is being handled by Typescript
- // if (cellSide === null || cellSide === undefined) throw new Error('cellSide is required');
- // if (!isNumber(cellSide)) throw new Error('cellSide is invalid');
- // if (!bbox) throw new Error('bbox is required');
- // if (!Array.isArray(bbox)) throw new Error('bbox must be array');
- // if (bbox.length !== 4) throw new Error('bbox must contain 4 numbers');
- // if (mask && ['Polygon', 'MultiPolygon'].indexOf(getType(mask)) === -1) throw new Error('options.mask must be a (Multi)Polygon');
- // Main
- var xFraction = cellSide / distance_1.default([bbox[0], bbox[1]], [bbox[2], bbox[1]], options);
- var cellWidth = xFraction * (bbox[2] - bbox[0]);
- var yFraction = cellSide / distance_1.default([bbox[0], bbox[1]], [bbox[0], bbox[3]], options);
- var cellHeight = yFraction * (bbox[3] - bbox[1]);
- var xi = 0;
- var currentX = bbox[0];
- while (currentX <= bbox[2]) {
- var yi = 0;
- var currentY = bbox[1];
- while (currentY <= bbox[3]) {
- var cellTriangle1 = null;
- var cellTriangle2 = null;
- if (xi % 2 === 0 && yi % 2 === 0) {
- cellTriangle1 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY],
- ],
- ], options.properties);
- cellTriangle2 = helpers_1.polygon([
- [
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY + cellHeight],
- ],
- ], options.properties);
- }
- else if (xi % 2 === 0 && yi % 2 === 1) {
- cellTriangle1 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY],
- ],
- ], options.properties);
- cellTriangle2 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX, currentY],
- ],
- ], options.properties);
- }
- else if (yi % 2 === 0 && xi % 2 === 1) {
- cellTriangle1 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX, currentY],
- ],
- ], options.properties);
- cellTriangle2 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY],
- ],
- ], options.properties);
- }
- else if (yi % 2 === 1 && xi % 2 === 1) {
- cellTriangle1 = helpers_1.polygon([
- [
- [currentX, currentY],
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY],
- ],
- ], options.properties);
- cellTriangle2 = helpers_1.polygon([
- [
- [currentX, currentY + cellHeight],
- [currentX + cellWidth, currentY + cellHeight],
- [currentX + cellWidth, currentY],
- [currentX, currentY + cellHeight],
- ],
- ], options.properties);
- }
- if (options.mask) {
- if (intersect_1.default(options.mask, cellTriangle1))
- results.push(cellTriangle1);
- if (intersect_1.default(options.mask, cellTriangle2))
- results.push(cellTriangle2);
- }
- else {
- results.push(cellTriangle1);
- results.push(cellTriangle2);
- }
- currentY += cellHeight;
- yi++;
- }
- xi++;
- currentX += cellWidth;
- }
- return helpers_1.featureCollection(results);
- }
- exports.default = triangleGrid;
|