index.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. var boolean_within_1 = __importDefault(require("@turf/boolean-within"));
  7. var distance_1 = __importDefault(require("@turf/distance"));
  8. var helpers_1 = require("@turf/helpers");
  9. /**
  10. * Creates a {@link Point} grid from a bounding box, {@link FeatureCollection} or {@link Feature}.
  11. *
  12. * @name pointGrid
  13. * @param {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
  14. * @param {number} cellSide the distance between points, in units
  15. * @param {Object} [options={}] Optional parameters
  16. * @param {string} [options.units='kilometers'] used in calculating cellSide, can be degrees, radians, miles, or kilometers
  17. * @param {Feature<Polygon|MultiPolygon>} [options.mask] if passed a Polygon or MultiPolygon, the grid Points will be created only inside it
  18. * @param {Object} [options.properties={}] passed to each point of the grid
  19. * @returns {FeatureCollection<Point>} grid of points
  20. * @example
  21. * var extent = [-70.823364, -33.553984, -70.473175, -33.302986];
  22. * var cellSide = 3;
  23. * var options = {units: 'miles'};
  24. *
  25. * var grid = turf.pointGrid(extent, cellSide, options);
  26. *
  27. * //addToMap
  28. * var addToMap = [grid];
  29. */
  30. function pointGrid(bbox, cellSide, options) {
  31. if (options === void 0) { options = {}; }
  32. // Default parameters
  33. if (options.mask && !options.units)
  34. options.units = "kilometers";
  35. // Containers
  36. var results = [];
  37. // Typescript handles the Type Validation
  38. // if (cellSide === null || cellSide === undefined) throw new Error('cellSide is required');
  39. // if (!isNumber(cellSide)) throw new Error('cellSide is invalid');
  40. // if (!bbox) throw new Error('bbox is required');
  41. // if (!Array.isArray(bbox)) throw new Error('bbox must be array');
  42. // if (bbox.length !== 4) throw new Error('bbox must contain 4 numbers');
  43. // if (mask && ['Polygon', 'MultiPolygon'].indexOf(getType(mask)) === -1) throw new Error('options.mask must be a (Multi)Polygon');
  44. var west = bbox[0];
  45. var south = bbox[1];
  46. var east = bbox[2];
  47. var north = bbox[3];
  48. var xFraction = cellSide / distance_1.default([west, south], [east, south], options);
  49. var cellWidth = xFraction * (east - west);
  50. var yFraction = cellSide / distance_1.default([west, south], [west, north], options);
  51. var cellHeight = yFraction * (north - south);
  52. var bboxWidth = east - west;
  53. var bboxHeight = north - south;
  54. var columns = Math.floor(bboxWidth / cellWidth);
  55. var rows = Math.floor(bboxHeight / cellHeight);
  56. // adjust origin of the grid
  57. var deltaX = (bboxWidth - columns * cellWidth) / 2;
  58. var deltaY = (bboxHeight - rows * cellHeight) / 2;
  59. var currentX = west + deltaX;
  60. while (currentX <= east) {
  61. var currentY = south + deltaY;
  62. while (currentY <= north) {
  63. var cellPt = helpers_1.point([currentX, currentY], options.properties);
  64. if (options.mask) {
  65. if (boolean_within_1.default(cellPt, options.mask))
  66. results.push(cellPt);
  67. }
  68. else {
  69. results.push(cellPt);
  70. }
  71. currentY += cellHeight;
  72. }
  73. currentX += cellWidth;
  74. }
  75. return helpers_1.featureCollection(results);
  76. }
  77. exports.default = pointGrid;