UNPKG

3.6 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
8
9exports.maskByPolygon = maskByPolygon;
10
11var _ndarray = require('ndarray');
12
13var _ndarray2 = _interopRequireDefault(_ndarray);
14
15var _transform = require('./transform.js');
16
17var _validate = require('../validate.js');
18
19var _polygon = require('../domain/polygon.js');
20
21function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23/**
24 * Returns a copy of the given Coverage object where the
25 * range values which belong to domain areas outside the
26 * given polygon are returned as null (no data).
27 *
28 * @param {Coverage} cov A Coverage object.
29 * @param {Object} polygon A GeoJSON Polygon or MultiPolygon object.
30 * @param {array} [axes=['x','y']] The grid axes corresponding to the polygon coordinates.
31 * @returns {Promise<Coverage>}
32 */
33function maskByPolygon(cov, polygon) {
34 var axes = arguments.length <= 2 || arguments[2] === undefined ? ['x', 'y'] : arguments[2];
35
36 (0, _validate.checkCoverage)(cov);
37
38 if (polygon.type === 'Polygon') {
39 polygon = {
40 type: 'MultiPolygon',
41 coordinates: [polygon.coordinates]
42 };
43 }
44 // prepare polygon coordinates for point-in-big-polygon algorithm
45 var polygons = polygon.coordinates; // .map(poly => poly.map(loop => loop.slice(0, loop.length - 1)))
46 polygons.forEach(function (p) {
47 return (0, _polygon.ensureClockwisePolygon)(p);
48 });
49
50 var pip = (0, _polygon.getPointInPolygonsFn)(polygons);
51
52 var _axes = _slicedToArray(axes, 2);
53
54 var X = _axes[0];
55 var Y = _axes[1];
56
57
58 return cov.loadDomain().then(function (domain) {
59 var x = domain.axes.get(X).values;
60 var y = domain.axes.get(Y).values;
61 var pnpolyCache = (0, _ndarray2.default)(new Uint8Array(x.length * y.length), [x.length, y.length]);
62
63 for (var i = 0; i < x.length; i++) {
64 for (var j = 0; j < y.length; j++) {
65 var inside = pip([x[i], y[j]]) >= 0;
66 pnpolyCache.set(i, j, inside);
67 }
68 }
69
70 var fn = function fn(obj, range) {
71 if (pnpolyCache.get(obj[X] || 0, obj[Y] || 0)) {
72 return range.get(obj);
73 } else {
74 return null;
75 }
76 };
77
78 var newcov = cov;
79 var _iteratorNormalCompletion = true;
80 var _didIteratorError = false;
81 var _iteratorError = undefined;
82
83 try {
84 for (var _iterator = cov.parameters.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
85 var key = _step.value;
86
87 newcov = (0, _transform.mapRange)(newcov, key, fn);
88 }
89 } catch (err) {
90 _didIteratorError = true;
91 _iteratorError = err;
92 } finally {
93 try {
94 if (!_iteratorNormalCompletion && _iterator.return) {
95 _iterator.return();
96 }
97 } finally {
98 if (_didIteratorError) {
99 throw _iteratorError;
100 }
101 }
102 }
103
104 return newcov;
105 });
106}
\No newline at end of file