@turf/mask 7.1.0-alpha.7 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,36 +4,42 @@
4
4
 
5
5
  ## mask
6
6
 
7
- Takes any type of [polygon][1] and an optional mask and returns a [polygon][1] exterior ring with holes.
7
+ Takes polygons or multipolygons and an optional mask, and returns an exterior
8
+ ring polygon with holes.
8
9
 
9
10
  ### Parameters
10
11
 
11
- * `polygon` **([FeatureCollection][2] | [Feature][3]<([Polygon][4] | [MultiPolygon][5])>)** GeoJSON Polygon used as interior rings or holes.
12
- * `mask` **[Feature][3]<[Polygon][4]>?** GeoJSON Polygon used as the exterior ring (if undefined, the world extent is used)
12
+ * `polygon` **([Polygon][1] | [MultiPolygon][2] | [Feature][3]<([Polygon][1] | [MultiPolygon][2])> | [FeatureCollection][4]<([Polygon][1] | [MultiPolygon][2])>)** GeoJSON polygon used as interior rings or holes
13
+ * `mask` **([Polygon][1] | [Feature][3]<[Polygon][1]>)?** GeoJSON polygon used as the exterior ring (if undefined, the world extent is used)
14
+ * `options` **[Object][5]** Optional parameters (optional, default `{}`)
15
+
16
+ * `options.mutate` **[boolean][6]** allows the `mask` GeoJSON input to be mutated (performance improvement if true) (optional, default `false`)
13
17
 
14
18
  ### Examples
15
19
 
16
20
  ```javascript
17
- var polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);
18
- var mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);
21
+ const polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);
22
+ const mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);
19
23
 
20
- var masked = turf.mask(polygon, mask);
24
+ const masked = turf.mask(polygon, mask);
21
25
 
22
26
  //addToMap
23
- var addToMap = [masked]
27
+ const addToMap = [masked]
24
28
  ```
25
29
 
26
- Returns **[Feature][3]<[Polygon][4]>** Masked Polygon (exterior ring with holes).
30
+ Returns **[Feature][3]<[Polygon][1]>** Masked Polygon (exterior ring with holes)
27
31
 
28
32
  [1]: https://tools.ietf.org/html/rfc7946#section-3.1.6
29
33
 
30
- [2]: https://tools.ietf.org/html/rfc7946#section-3.3
34
+ [2]: https://tools.ietf.org/html/rfc7946#section-3.1.7
31
35
 
32
36
  [3]: https://tools.ietf.org/html/rfc7946#section-3.2
33
37
 
34
- [4]: https://tools.ietf.org/html/rfc7946#section-3.1.6
38
+ [4]: https://tools.ietf.org/html/rfc7946#section-3.3
39
+
40
+ [5]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
35
41
 
36
- [5]: https://tools.ietf.org/html/rfc7946#section-3.1.7
42
+ [6]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean
37
43
 
38
44
  <!-- This file is automatically generated. Please don't edit it directly. If you find an error, edit the source file of the module in question (likely index.js or index.ts), and re-run "yarn docs" from the root of the turf project. -->
39
45
 
@@ -1,22 +1,34 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// index.js
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// index.ts
2
2
  var _helpers = require('@turf/helpers');
3
3
  var _polygonclipping = require('polygon-clipping'); var _polygonclipping2 = _interopRequireDefault(_polygonclipping);
4
- function mask(polygon, mask2) {
5
- var maskPolygon = createMask(mask2);
6
- var polygonOuters = null;
7
- if (polygon.type === "FeatureCollection")
4
+ var _clone = require('@turf/clone');
5
+ function mask(polygon, mask2, options) {
6
+ var _a;
7
+ const mutate = (_a = options == null ? void 0 : options.mutate) != null ? _a : false;
8
+ let maskTemplate = mask2;
9
+ if (mask2 && mutate === false) {
10
+ maskTemplate = _clone.clone.call(void 0, mask2);
11
+ }
12
+ const maskPolygon = createMask(maskTemplate);
13
+ let polygonOuters = null;
14
+ if (polygon.type === "FeatureCollection") {
8
15
  polygonOuters = unionFc(polygon);
9
- else
16
+ } else if (polygon.type === "Feature") {
10
17
  polygonOuters = createGeomFromPolygonClippingOutput(
11
18
  _polygonclipping2.default.union(polygon.geometry.coordinates)
12
19
  );
20
+ } else {
21
+ polygonOuters = createGeomFromPolygonClippingOutput(
22
+ _polygonclipping2.default.union(polygon.coordinates)
23
+ );
24
+ }
13
25
  polygonOuters.geometry.coordinates.forEach(function(contour) {
14
26
  maskPolygon.geometry.coordinates.push(contour[0]);
15
27
  });
16
28
  return maskPolygon;
17
29
  }
18
30
  function unionFc(fc) {
19
- var unioned = fc.features.length === 2 ? _polygonclipping2.default.union(
31
+ const unioned = fc.features.length === 2 ? _polygonclipping2.default.union(
20
32
  fc.features[0].geometry.coordinates,
21
33
  fc.features[1].geometry.coordinates
22
34
  ) : _polygonclipping2.default.union.apply(
@@ -31,7 +43,7 @@ function createGeomFromPolygonClippingOutput(unioned) {
31
43
  return _helpers.multiPolygon.call(void 0, unioned);
32
44
  }
33
45
  function createMask(mask2) {
34
- var world = [
46
+ const world = [
35
47
  [
36
48
  [180, 90],
37
49
  [-180, 90],
@@ -40,7 +52,14 @@ function createMask(mask2) {
40
52
  [180, 90]
41
53
  ]
42
54
  ];
43
- var coordinates = mask2 && mask2.geometry.coordinates || world;
55
+ let coordinates = world;
56
+ if (mask2) {
57
+ if (mask2.type === "Feature") {
58
+ coordinates = mask2.geometry.coordinates;
59
+ } else {
60
+ coordinates = mask2.coordinates;
61
+ }
62
+ }
44
63
  return _helpers.polygon.call(void 0, coordinates);
45
64
  }
46
65
  var turf_mask_default = mask;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index.js"],"names":["mask"],"mappings":";AAAA,SAAS,WAAW,eAAe,oBAAoB;AACvD,OAAO,qBAAqB;AAkB5B,SAAS,KAAK,SAASA,OAAM;AAE3B,MAAI,cAAc,WAAWA,KAAI;AAEjC,MAAI,gBAAgB;AACpB,MAAI,QAAQ,SAAS;AAAqB,oBAAgB,QAAQ,OAAO;AAAA;AAEvE,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,SAAS,WAAW;AAAA,IACpD;AAEF,gBAAc,SAAS,YAAY,QAAQ,SAAU,SAAS;AAC5D,gBAAY,SAAS,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,QAAQ,IAAI;AACnB,MAAI,UACF,GAAG,SAAS,WAAW,IACnB,gBAAgB;AAAA,IACd,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,IACxB,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,EAC1B,IACA,gBAAgB,MAAM;AAAA,IACpB;AAAA,IACA,GAAG,SAAS,IAAI,SAAU,GAAG;AAC3B,aAAO,EAAE,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACN,SAAO,oCAAoC,OAAO;AACpD;AAEA,SAAS,oCAAoC,SAAS;AACpD,SAAO,aAAa,OAAO;AAC7B;AASA,SAAS,WAAWA,OAAM;AACxB,MAAI,QAAQ;AAAA,IACV;AAAA,MACE,CAAC,KAAK,EAAE;AAAA,MACR,CAAC,MAAM,EAAE;AAAA,MACT,CAAC,MAAM,GAAG;AAAA,MACV,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,cAAeA,SAAQA,MAAK,SAAS,eAAgB;AACzD,SAAO,cAAc,WAAW;AAClC;AAGA,IAAO,oBAAQ","sourcesContent":["import { polygon as createPolygon, multiPolygon } from \"@turf/helpers\";\nimport polygonClipping from \"polygon-clipping\";\n\n/**\n * Takes any type of {@link Polygon|polygon} and an optional mask and returns a {@link Polygon|polygon} exterior ring with holes.\n *\n * @name mask\n * @param {FeatureCollection|Feature<Polygon|MultiPolygon>} polygon GeoJSON Polygon used as interior rings or holes.\n * @param {Feature<Polygon>} [mask] GeoJSON Polygon used as the exterior ring (if undefined, the world extent is used)\n * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes).\n * @example\n * var polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);\n * var mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);\n *\n * var masked = turf.mask(polygon, mask);\n *\n * //addToMap\n * var addToMap = [masked]\n */\nfunction mask(polygon, mask) {\n // Define mask\n var maskPolygon = createMask(mask);\n\n var polygonOuters = null;\n if (polygon.type === \"FeatureCollection\") polygonOuters = unionFc(polygon);\n else\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.geometry.coordinates)\n );\n\n polygonOuters.geometry.coordinates.forEach(function (contour) {\n maskPolygon.geometry.coordinates.push(contour[0]);\n });\n\n return maskPolygon;\n}\n\nfunction unionFc(fc) {\n var unioned =\n fc.features.length === 2\n ? polygonClipping.union(\n fc.features[0].geometry.coordinates,\n fc.features[1].geometry.coordinates\n )\n : polygonClipping.union.apply(\n polygonClipping,\n fc.features.map(function (f) {\n return f.geometry.coordinates;\n })\n );\n return createGeomFromPolygonClippingOutput(unioned);\n}\n\nfunction createGeomFromPolygonClippingOutput(unioned) {\n return multiPolygon(unioned);\n}\n\n/**\n * Create Mask Coordinates\n *\n * @private\n * @param {Feature<Polygon>} [mask] default to world if undefined\n * @returns {Feature<Polygon>} mask coordinate\n */\nfunction createMask(mask) {\n var world = [\n [\n [180, 90],\n [-180, 90],\n [-180, -90],\n [180, -90],\n [180, 90],\n ],\n ];\n var coordinates = (mask && mask.geometry.coordinates) || world;\n return createPolygon(coordinates);\n}\n\nexport { mask };\nexport default mask;\n"]}
1
+ {"version":3,"sources":["../../index.ts"],"names":["mask"],"mappings":";AAOA,SAAS,WAAW,eAAe,oBAAoB;AACvD,OAAO,qBAA+B;AACtC,SAAS,aAAa;AAqBtB,SAAS,KACP,SACAA,OACA,SACkB;AAlCpB;AAmCE,QAAM,UAAS,wCAAS,WAAT,YAAmB;AAElC,MAAI,eAAeA;AACnB,MAAIA,SAAQ,WAAW,OAAO;AAE5B,mBAAe,MAAMA,KAAI;AAAA,EAC3B;AAGA,QAAM,cAAc,WAAW,YAAY;AAE3C,MAAI,gBAAgB;AACpB,MAAI,QAAQ,SAAS,qBAAqB;AACxC,oBAAgB,QAAQ,OAAO;AAAA,EACjC,WAAW,QAAQ,SAAS,WAAW;AAGrC,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,SAAS,WAAmB;AAAA,IAC5D;AAAA,EACF,OAAO;AAIL,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,WAAmB;AAAA,IACnD;AAAA,EACF;AAEA,gBAAc,SAAS,YAAY,QAAQ,SAAU,SAAS;AAC5D,gBAAY,SAAS,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,QAAQ,IAA+C;AAO9D,QAAM,UACJ,GAAG,SAAS,WAAW,IACnB,gBAAgB;AAAA,IACd,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,IACxB,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,EAC1B,IACA,gBAAgB,MAAM;AAAA,IACpB;AAAA,IACA,GAAG,SAAS,IAAI,SAAU,GAAG;AAC3B,aAAO,EAAE,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAEN,SAAO,oCAAoC,OAAO;AACpD;AAEA,SAAS,oCAAoC,SAAyB;AACpE,SAAO,aAAa,OAAO;AAC7B;AASA,SAAS,WAAWA,OAA8C;AAChE,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,CAAC,KAAK,EAAE;AAAA,MACR,CAAC,MAAM,EAAE;AAAA,MACT,CAAC,MAAM,GAAG;AAAA,MACV,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,cAAc;AAClB,MAAIA,OAAM;AACR,QAAIA,MAAK,SAAS,WAAW;AAE3B,oBAAcA,MAAK,SAAS;AAAA,IAC9B,OAAO;AAEL,oBAAcA,MAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,cAAc,WAAW;AAClC;AAGA,IAAO,oBAAQ","sourcesContent":["import {\n Feature,\n FeatureCollection,\n Polygon,\n Position,\n MultiPolygon,\n} from \"geojson\";\nimport { polygon as createPolygon, multiPolygon } from \"@turf/helpers\";\nimport polygonClipping, { Geom } from \"polygon-clipping\";\nimport { clone } from \"@turf/clone\";\n\n/**\n * Takes polygons or multipolygons and an optional mask, and returns an exterior\n * ring polygon with holes.\n *\n * @name mask\n * @param {Polygon|MultiPolygon|Feature<Polygon|MultiPolygon>|FeatureCollection<Polygon|MultiPolygon>} polygon GeoJSON polygon used as interior rings or holes\n * @param {Polygon|Feature<Polygon>} [mask] GeoJSON polygon used as the exterior ring (if undefined, the world extent is used)\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.mutate=false] allows the `mask` GeoJSON input to be mutated (performance improvement if true)\n * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes)\n * @example\n * const polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);\n * const mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);\n *\n * const masked = turf.mask(polygon, mask);\n *\n * //addToMap\n * const addToMap = [masked]\n */\nfunction mask<T extends Polygon | MultiPolygon>(\n polygon: T | Feature<T> | FeatureCollection<T>,\n mask?: Polygon | Feature<Polygon>,\n options?: { mutate?: boolean }\n): Feature<Polygon> {\n const mutate = options?.mutate ?? false; // by default, do not mutate\n\n let maskTemplate = mask;\n if (mask && mutate === false) {\n // Clone mask if requested to avoid side effects\n maskTemplate = clone(mask);\n }\n\n // Define initial mask\n const maskPolygon = createMask(maskTemplate);\n\n let polygonOuters = null;\n if (polygon.type === \"FeatureCollection\") {\n polygonOuters = unionFc(polygon);\n } else if (polygon.type === \"Feature\") {\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.geometry.coordinates as Geom)\n );\n } else {\n // Geometry\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.coordinates as Geom)\n );\n }\n\n polygonOuters.geometry.coordinates.forEach(function (contour) {\n maskPolygon.geometry.coordinates.push(contour[0]);\n });\n\n return maskPolygon;\n}\n\nfunction unionFc(fc: FeatureCollection<Polygon | MultiPolygon>) {\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n\n // Stick with apply() below as spread operator degrades performance. Have\n // to disable prefer-spread lint rule though.\n /* eslint-disable prefer-spread */\n const unioned =\n fc.features.length === 2\n ? polygonClipping.union(\n fc.features[0].geometry.coordinates as Geom,\n fc.features[1].geometry.coordinates as Geom\n )\n : polygonClipping.union.apply(\n polygonClipping,\n fc.features.map(function (f) {\n return f.geometry.coordinates;\n }) as [Geom, ...Geom[]]\n );\n /* eslint-enable */\n return createGeomFromPolygonClippingOutput(unioned);\n}\n\nfunction createGeomFromPolygonClippingOutput(unioned: Position[][][]) {\n return multiPolygon(unioned);\n}\n\n/**\n * Create Mask Coordinates\n *\n * @private\n * @param {Feature<Polygon>} [mask] default to world if undefined\n * @returns {Feature<Polygon>} mask as a polygon\n */\nfunction createMask(mask: Feature<Polygon> | Polygon | undefined) {\n const world = [\n [\n [180, 90],\n [-180, 90],\n [-180, -90],\n [180, -90],\n [180, 90],\n ],\n ];\n let coordinates = world;\n if (mask) {\n if (mask.type === \"Feature\") {\n // polygon feature\n coordinates = mask.geometry.coordinates;\n } else {\n // polygon geometry\n coordinates = mask.coordinates;\n }\n }\n return createPolygon(coordinates);\n}\n\nexport { mask };\nexport default mask;\n"]}
@@ -1,11 +1,26 @@
1
1
  import { Polygon, MultiPolygon, Feature, FeatureCollection } from 'geojson';
2
2
 
3
3
  /**
4
- * http://turfjs.org/docs/#mask
4
+ * Takes polygons or multipolygons and an optional mask, and returns an exterior
5
+ * ring polygon with holes.
6
+ *
7
+ * @name mask
8
+ * @param {Polygon|MultiPolygon|Feature<Polygon|MultiPolygon>|FeatureCollection<Polygon|MultiPolygon>} polygon GeoJSON polygon used as interior rings or holes
9
+ * @param {Polygon|Feature<Polygon>} [mask] GeoJSON polygon used as the exterior ring (if undefined, the world extent is used)
10
+ * @param {Object} [options={}] Optional parameters
11
+ * @param {boolean} [options.mutate=false] allows the `mask` GeoJSON input to be mutated (performance improvement if true)
12
+ * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes)
13
+ * @example
14
+ * const polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);
15
+ * const mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);
16
+ *
17
+ * const masked = turf.mask(polygon, mask);
18
+ *
19
+ * //addToMap
20
+ * const addToMap = [masked]
5
21
  */
6
- declare function mask<T extends Polygon | MultiPolygon>(
7
- poly: Feature<T> | FeatureCollection<T> | T,
8
- mask?: Feature<Polygon> | Polygon
9
- ): Feature<Polygon>;
22
+ declare function mask<T extends Polygon | MultiPolygon>(polygon: T | Feature<T> | FeatureCollection<T>, mask?: Polygon | Feature<Polygon>, options?: {
23
+ mutate?: boolean;
24
+ }): Feature<Polygon>;
10
25
 
11
26
  export { mask as default, mask };
@@ -1,11 +1,26 @@
1
1
  import { Polygon, MultiPolygon, Feature, FeatureCollection } from 'geojson';
2
2
 
3
3
  /**
4
- * http://turfjs.org/docs/#mask
4
+ * Takes polygons or multipolygons and an optional mask, and returns an exterior
5
+ * ring polygon with holes.
6
+ *
7
+ * @name mask
8
+ * @param {Polygon|MultiPolygon|Feature<Polygon|MultiPolygon>|FeatureCollection<Polygon|MultiPolygon>} polygon GeoJSON polygon used as interior rings or holes
9
+ * @param {Polygon|Feature<Polygon>} [mask] GeoJSON polygon used as the exterior ring (if undefined, the world extent is used)
10
+ * @param {Object} [options={}] Optional parameters
11
+ * @param {boolean} [options.mutate=false] allows the `mask` GeoJSON input to be mutated (performance improvement if true)
12
+ * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes)
13
+ * @example
14
+ * const polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);
15
+ * const mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);
16
+ *
17
+ * const masked = turf.mask(polygon, mask);
18
+ *
19
+ * //addToMap
20
+ * const addToMap = [masked]
5
21
  */
6
- declare function mask<T extends Polygon | MultiPolygon>(
7
- poly: Feature<T> | FeatureCollection<T> | T,
8
- mask?: Feature<Polygon> | Polygon
9
- ): Feature<Polygon>;
22
+ declare function mask<T extends Polygon | MultiPolygon>(polygon: T | Feature<T> | FeatureCollection<T>, mask?: Polygon | Feature<Polygon>, options?: {
23
+ mutate?: boolean;
24
+ }): Feature<Polygon>;
10
25
 
11
26
  export { mask as default, mask };
package/dist/esm/index.js CHANGED
@@ -1,22 +1,34 @@
1
- // index.js
1
+ // index.ts
2
2
  import { polygon as createPolygon, multiPolygon } from "@turf/helpers";
3
3
  import polygonClipping from "polygon-clipping";
4
- function mask(polygon, mask2) {
5
- var maskPolygon = createMask(mask2);
6
- var polygonOuters = null;
7
- if (polygon.type === "FeatureCollection")
4
+ import { clone } from "@turf/clone";
5
+ function mask(polygon, mask2, options) {
6
+ var _a;
7
+ const mutate = (_a = options == null ? void 0 : options.mutate) != null ? _a : false;
8
+ let maskTemplate = mask2;
9
+ if (mask2 && mutate === false) {
10
+ maskTemplate = clone(mask2);
11
+ }
12
+ const maskPolygon = createMask(maskTemplate);
13
+ let polygonOuters = null;
14
+ if (polygon.type === "FeatureCollection") {
8
15
  polygonOuters = unionFc(polygon);
9
- else
16
+ } else if (polygon.type === "Feature") {
10
17
  polygonOuters = createGeomFromPolygonClippingOutput(
11
18
  polygonClipping.union(polygon.geometry.coordinates)
12
19
  );
20
+ } else {
21
+ polygonOuters = createGeomFromPolygonClippingOutput(
22
+ polygonClipping.union(polygon.coordinates)
23
+ );
24
+ }
13
25
  polygonOuters.geometry.coordinates.forEach(function(contour) {
14
26
  maskPolygon.geometry.coordinates.push(contour[0]);
15
27
  });
16
28
  return maskPolygon;
17
29
  }
18
30
  function unionFc(fc) {
19
- var unioned = fc.features.length === 2 ? polygonClipping.union(
31
+ const unioned = fc.features.length === 2 ? polygonClipping.union(
20
32
  fc.features[0].geometry.coordinates,
21
33
  fc.features[1].geometry.coordinates
22
34
  ) : polygonClipping.union.apply(
@@ -31,7 +43,7 @@ function createGeomFromPolygonClippingOutput(unioned) {
31
43
  return multiPolygon(unioned);
32
44
  }
33
45
  function createMask(mask2) {
34
- var world = [
46
+ const world = [
35
47
  [
36
48
  [180, 90],
37
49
  [-180, 90],
@@ -40,7 +52,14 @@ function createMask(mask2) {
40
52
  [180, 90]
41
53
  ]
42
54
  ];
43
- var coordinates = mask2 && mask2.geometry.coordinates || world;
55
+ let coordinates = world;
56
+ if (mask2) {
57
+ if (mask2.type === "Feature") {
58
+ coordinates = mask2.geometry.coordinates;
59
+ } else {
60
+ coordinates = mask2.coordinates;
61
+ }
62
+ }
44
63
  return createPolygon(coordinates);
45
64
  }
46
65
  var turf_mask_default = mask;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index.js"],"sourcesContent":["import { polygon as createPolygon, multiPolygon } from \"@turf/helpers\";\nimport polygonClipping from \"polygon-clipping\";\n\n/**\n * Takes any type of {@link Polygon|polygon} and an optional mask and returns a {@link Polygon|polygon} exterior ring with holes.\n *\n * @name mask\n * @param {FeatureCollection|Feature<Polygon|MultiPolygon>} polygon GeoJSON Polygon used as interior rings or holes.\n * @param {Feature<Polygon>} [mask] GeoJSON Polygon used as the exterior ring (if undefined, the world extent is used)\n * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes).\n * @example\n * var polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);\n * var mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);\n *\n * var masked = turf.mask(polygon, mask);\n *\n * //addToMap\n * var addToMap = [masked]\n */\nfunction mask(polygon, mask) {\n // Define mask\n var maskPolygon = createMask(mask);\n\n var polygonOuters = null;\n if (polygon.type === \"FeatureCollection\") polygonOuters = unionFc(polygon);\n else\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.geometry.coordinates)\n );\n\n polygonOuters.geometry.coordinates.forEach(function (contour) {\n maskPolygon.geometry.coordinates.push(contour[0]);\n });\n\n return maskPolygon;\n}\n\nfunction unionFc(fc) {\n var unioned =\n fc.features.length === 2\n ? polygonClipping.union(\n fc.features[0].geometry.coordinates,\n fc.features[1].geometry.coordinates\n )\n : polygonClipping.union.apply(\n polygonClipping,\n fc.features.map(function (f) {\n return f.geometry.coordinates;\n })\n );\n return createGeomFromPolygonClippingOutput(unioned);\n}\n\nfunction createGeomFromPolygonClippingOutput(unioned) {\n return multiPolygon(unioned);\n}\n\n/**\n * Create Mask Coordinates\n *\n * @private\n * @param {Feature<Polygon>} [mask] default to world if undefined\n * @returns {Feature<Polygon>} mask coordinate\n */\nfunction createMask(mask) {\n var world = [\n [\n [180, 90],\n [-180, 90],\n [-180, -90],\n [180, -90],\n [180, 90],\n ],\n ];\n var coordinates = (mask && mask.geometry.coordinates) || world;\n return createPolygon(coordinates);\n}\n\nexport { mask };\nexport default mask;\n"],"mappings":";AAAA,SAAS,WAAW,eAAe,oBAAoB;AACvD,OAAO,qBAAqB;AAkB5B,SAAS,KAAK,SAASA,OAAM;AAE3B,MAAI,cAAc,WAAWA,KAAI;AAEjC,MAAI,gBAAgB;AACpB,MAAI,QAAQ,SAAS;AAAqB,oBAAgB,QAAQ,OAAO;AAAA;AAEvE,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,SAAS,WAAW;AAAA,IACpD;AAEF,gBAAc,SAAS,YAAY,QAAQ,SAAU,SAAS;AAC5D,gBAAY,SAAS,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,QAAQ,IAAI;AACnB,MAAI,UACF,GAAG,SAAS,WAAW,IACnB,gBAAgB;AAAA,IACd,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,IACxB,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,EAC1B,IACA,gBAAgB,MAAM;AAAA,IACpB;AAAA,IACA,GAAG,SAAS,IAAI,SAAU,GAAG;AAC3B,aAAO,EAAE,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACN,SAAO,oCAAoC,OAAO;AACpD;AAEA,SAAS,oCAAoC,SAAS;AACpD,SAAO,aAAa,OAAO;AAC7B;AASA,SAAS,WAAWA,OAAM;AACxB,MAAI,QAAQ;AAAA,IACV;AAAA,MACE,CAAC,KAAK,EAAE;AAAA,MACR,CAAC,MAAM,EAAE;AAAA,MACT,CAAC,MAAM,GAAG;AAAA,MACV,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,cAAeA,SAAQA,MAAK,SAAS,eAAgB;AACzD,SAAO,cAAc,WAAW;AAClC;AAGA,IAAO,oBAAQ;","names":["mask"]}
1
+ {"version":3,"sources":["../../index.ts"],"sourcesContent":["import {\n Feature,\n FeatureCollection,\n Polygon,\n Position,\n MultiPolygon,\n} from \"geojson\";\nimport { polygon as createPolygon, multiPolygon } from \"@turf/helpers\";\nimport polygonClipping, { Geom } from \"polygon-clipping\";\nimport { clone } from \"@turf/clone\";\n\n/**\n * Takes polygons or multipolygons and an optional mask, and returns an exterior\n * ring polygon with holes.\n *\n * @name mask\n * @param {Polygon|MultiPolygon|Feature<Polygon|MultiPolygon>|FeatureCollection<Polygon|MultiPolygon>} polygon GeoJSON polygon used as interior rings or holes\n * @param {Polygon|Feature<Polygon>} [mask] GeoJSON polygon used as the exterior ring (if undefined, the world extent is used)\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.mutate=false] allows the `mask` GeoJSON input to be mutated (performance improvement if true)\n * @returns {Feature<Polygon>} Masked Polygon (exterior ring with holes)\n * @example\n * const polygon = turf.polygon([[[112, -21], [116, -36], [146, -39], [153, -24], [133, -10], [112, -21]]]);\n * const mask = turf.polygon([[[90, -55], [170, -55], [170, 10], [90, 10], [90, -55]]]);\n *\n * const masked = turf.mask(polygon, mask);\n *\n * //addToMap\n * const addToMap = [masked]\n */\nfunction mask<T extends Polygon | MultiPolygon>(\n polygon: T | Feature<T> | FeatureCollection<T>,\n mask?: Polygon | Feature<Polygon>,\n options?: { mutate?: boolean }\n): Feature<Polygon> {\n const mutate = options?.mutate ?? false; // by default, do not mutate\n\n let maskTemplate = mask;\n if (mask && mutate === false) {\n // Clone mask if requested to avoid side effects\n maskTemplate = clone(mask);\n }\n\n // Define initial mask\n const maskPolygon = createMask(maskTemplate);\n\n let polygonOuters = null;\n if (polygon.type === \"FeatureCollection\") {\n polygonOuters = unionFc(polygon);\n } else if (polygon.type === \"Feature\") {\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.geometry.coordinates as Geom)\n );\n } else {\n // Geometry\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n polygonOuters = createGeomFromPolygonClippingOutput(\n polygonClipping.union(polygon.coordinates as Geom)\n );\n }\n\n polygonOuters.geometry.coordinates.forEach(function (contour) {\n maskPolygon.geometry.coordinates.push(contour[0]);\n });\n\n return maskPolygon;\n}\n\nfunction unionFc(fc: FeatureCollection<Polygon | MultiPolygon>) {\n // Need to cast below as Position[][] isn't quite as strict as Geom, even\n // though they should be equivalent.\n\n // Stick with apply() below as spread operator degrades performance. Have\n // to disable prefer-spread lint rule though.\n /* eslint-disable prefer-spread */\n const unioned =\n fc.features.length === 2\n ? polygonClipping.union(\n fc.features[0].geometry.coordinates as Geom,\n fc.features[1].geometry.coordinates as Geom\n )\n : polygonClipping.union.apply(\n polygonClipping,\n fc.features.map(function (f) {\n return f.geometry.coordinates;\n }) as [Geom, ...Geom[]]\n );\n /* eslint-enable */\n return createGeomFromPolygonClippingOutput(unioned);\n}\n\nfunction createGeomFromPolygonClippingOutput(unioned: Position[][][]) {\n return multiPolygon(unioned);\n}\n\n/**\n * Create Mask Coordinates\n *\n * @private\n * @param {Feature<Polygon>} [mask] default to world if undefined\n * @returns {Feature<Polygon>} mask as a polygon\n */\nfunction createMask(mask: Feature<Polygon> | Polygon | undefined) {\n const world = [\n [\n [180, 90],\n [-180, 90],\n [-180, -90],\n [180, -90],\n [180, 90],\n ],\n ];\n let coordinates = world;\n if (mask) {\n if (mask.type === \"Feature\") {\n // polygon feature\n coordinates = mask.geometry.coordinates;\n } else {\n // polygon geometry\n coordinates = mask.coordinates;\n }\n }\n return createPolygon(coordinates);\n}\n\nexport { mask };\nexport default mask;\n"],"mappings":";AAOA,SAAS,WAAW,eAAe,oBAAoB;AACvD,OAAO,qBAA+B;AACtC,SAAS,aAAa;AAqBtB,SAAS,KACP,SACAA,OACA,SACkB;AAlCpB;AAmCE,QAAM,UAAS,wCAAS,WAAT,YAAmB;AAElC,MAAI,eAAeA;AACnB,MAAIA,SAAQ,WAAW,OAAO;AAE5B,mBAAe,MAAMA,KAAI;AAAA,EAC3B;AAGA,QAAM,cAAc,WAAW,YAAY;AAE3C,MAAI,gBAAgB;AACpB,MAAI,QAAQ,SAAS,qBAAqB;AACxC,oBAAgB,QAAQ,OAAO;AAAA,EACjC,WAAW,QAAQ,SAAS,WAAW;AAGrC,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,SAAS,WAAmB;AAAA,IAC5D;AAAA,EACF,OAAO;AAIL,oBAAgB;AAAA,MACd,gBAAgB,MAAM,QAAQ,WAAmB;AAAA,IACnD;AAAA,EACF;AAEA,gBAAc,SAAS,YAAY,QAAQ,SAAU,SAAS;AAC5D,gBAAY,SAAS,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,QAAQ,IAA+C;AAO9D,QAAM,UACJ,GAAG,SAAS,WAAW,IACnB,gBAAgB;AAAA,IACd,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,IACxB,GAAG,SAAS,CAAC,EAAE,SAAS;AAAA,EAC1B,IACA,gBAAgB,MAAM;AAAA,IACpB;AAAA,IACA,GAAG,SAAS,IAAI,SAAU,GAAG;AAC3B,aAAO,EAAE,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAEN,SAAO,oCAAoC,OAAO;AACpD;AAEA,SAAS,oCAAoC,SAAyB;AACpE,SAAO,aAAa,OAAO;AAC7B;AASA,SAAS,WAAWA,OAA8C;AAChE,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,CAAC,KAAK,EAAE;AAAA,MACR,CAAC,MAAM,EAAE;AAAA,MACT,CAAC,MAAM,GAAG;AAAA,MACV,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,cAAc;AAClB,MAAIA,OAAM;AACR,QAAIA,MAAK,SAAS,WAAW;AAE3B,oBAAcA,MAAK,SAAS;AAAA,IAC9B,OAAO;AAEL,oBAAcA,MAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,cAAc,WAAW;AAClC;AAGA,IAAO,oBAAQ;","names":["mask"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turf/mask",
3
- "version": "7.1.0-alpha.7+0ce6ecca0",
3
+ "version": "7.1.0",
4
4
  "description": "turf mask module",
5
5
  "author": "Turf Authors",
6
6
  "license": "MIT",
@@ -60,11 +60,15 @@
60
60
  "tape": "^5.7.2",
61
61
  "tsup": "^8.0.1",
62
62
  "tsx": "^4.6.2",
63
+ "typescript": "^5.2.2",
63
64
  "write-json-file": "^5.0.0"
64
65
  },
65
66
  "dependencies": {
66
- "@turf/helpers": "^7.1.0-alpha.7+0ce6ecca0",
67
- "polygon-clipping": "^0.15.3"
67
+ "@turf/clone": "^7.1.0",
68
+ "@turf/helpers": "^7.1.0",
69
+ "@types/geojson": "^7946.0.10",
70
+ "polygon-clipping": "^0.15.3",
71
+ "tslib": "^2.6.2"
68
72
  },
69
- "gitHead": "0ce6ecca05829690270fec6d6bed2003495fe0ea"
73
+ "gitHead": "68915eeebc9278bb40dec3f1034499698a0561ef"
70
74
  }