index.cjs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// index.ts
  2. var _meta = require('@turf/meta');
  3. var _helpers = require('@turf/helpers');
  4. // lib/geojson-polygon-self-intersections.js
  5. var _rbush = require('rbush'); var _rbush2 = _interopRequireDefault(_rbush);
  6. function geojsonPolygonSelfIntersections(feature, filterFn, useSpatialIndex) {
  7. if (feature.geometry.type !== "Polygon")
  8. throw new Error("The input feature must be a Polygon");
  9. if (useSpatialIndex === void 0) useSpatialIndex = 1;
  10. var coord = feature.geometry.coordinates;
  11. var output = [];
  12. var seen = {};
  13. if (useSpatialIndex) {
  14. var allEdgesAsRbushTreeItems = [];
  15. for (var ring0 = 0; ring0 < coord.length; ring0++) {
  16. for (var edge0 = 0; edge0 < coord[ring0].length - 1; edge0++) {
  17. allEdgesAsRbushTreeItems.push(rbushTreeItem(ring0, edge0));
  18. }
  19. }
  20. var tree = new (0, _rbush2.default)();
  21. tree.load(allEdgesAsRbushTreeItems);
  22. }
  23. for (var ringA = 0; ringA < coord.length; ringA++) {
  24. for (var edgeA = 0; edgeA < coord[ringA].length - 1; edgeA++) {
  25. if (useSpatialIndex) {
  26. var bboxOverlaps = tree.search(rbushTreeItem(ringA, edgeA));
  27. bboxOverlaps.forEach(function(bboxIsect) {
  28. var ring12 = bboxIsect.ring;
  29. var edge12 = bboxIsect.edge;
  30. ifIsectAddToOutput(ringA, edgeA, ring12, edge12);
  31. });
  32. } else {
  33. for (var ring1 = 0; ring1 < coord.length; ring1++) {
  34. for (var edge1 = 0; edge1 < coord[ring1].length - 1; edge1++) {
  35. ifIsectAddToOutput(ringA, edgeA, ring1, edge1);
  36. }
  37. }
  38. }
  39. }
  40. }
  41. if (!filterFn)
  42. output = {
  43. type: "Feature",
  44. geometry: { type: "MultiPoint", coordinates: output }
  45. };
  46. return output;
  47. function ifIsectAddToOutput(ring02, edge02, ring12, edge12) {
  48. var start0 = coord[ring02][edge02];
  49. var end0 = coord[ring02][edge02 + 1];
  50. var start1 = coord[ring12][edge12];
  51. var end1 = coord[ring12][edge12 + 1];
  52. var isect = intersect(start0, end0, start1, end1);
  53. if (isect === null) return;
  54. var frac0;
  55. var frac1;
  56. if (end0[0] !== start0[0]) {
  57. frac0 = (isect[0] - start0[0]) / (end0[0] - start0[0]);
  58. } else {
  59. frac0 = (isect[1] - start0[1]) / (end0[1] - start0[1]);
  60. }
  61. if (end1[0] !== start1[0]) {
  62. frac1 = (isect[0] - start1[0]) / (end1[0] - start1[0]);
  63. } else {
  64. frac1 = (isect[1] - start1[1]) / (end1[1] - start1[1]);
  65. }
  66. if (frac0 >= 1 || frac0 <= 0 || frac1 >= 1 || frac1 <= 0) return;
  67. var key = isect;
  68. var unique = !seen[key];
  69. if (unique) {
  70. seen[key] = true;
  71. }
  72. if (filterFn) {
  73. output.push(
  74. filterFn(
  75. isect,
  76. ring02,
  77. edge02,
  78. start0,
  79. end0,
  80. frac0,
  81. ring12,
  82. edge12,
  83. start1,
  84. end1,
  85. frac1,
  86. unique
  87. )
  88. );
  89. } else {
  90. output.push(isect);
  91. }
  92. }
  93. function rbushTreeItem(ring, edge) {
  94. var start = coord[ring][edge];
  95. var end = coord[ring][edge + 1];
  96. var minX;
  97. var maxX;
  98. var minY;
  99. var maxY;
  100. if (start[0] < end[0]) {
  101. minX = start[0];
  102. maxX = end[0];
  103. } else {
  104. minX = end[0];
  105. maxX = start[0];
  106. }
  107. if (start[1] < end[1]) {
  108. minY = start[1];
  109. maxY = end[1];
  110. } else {
  111. minY = end[1];
  112. maxY = start[1];
  113. }
  114. return {
  115. minX,
  116. minY,
  117. maxX,
  118. maxY,
  119. ring,
  120. edge
  121. };
  122. }
  123. }
  124. function intersect(start0, end0, start1, end1) {
  125. if (equalArrays(start0, start1) || equalArrays(start0, end1) || equalArrays(end0, start1) || equalArrays(end1, start1))
  126. return null;
  127. var x0 = start0[0], y0 = start0[1], x1 = end0[0], y1 = end0[1], x2 = start1[0], y2 = start1[1], x3 = end1[0], y3 = end1[1];
  128. var denom = (x0 - x1) * (y2 - y3) - (y0 - y1) * (x2 - x3);
  129. if (denom === 0) return null;
  130. var x4 = ((x0 * y1 - y0 * x1) * (x2 - x3) - (x0 - x1) * (x2 * y3 - y2 * x3)) / denom;
  131. var y4 = ((x0 * y1 - y0 * x1) * (y2 - y3) - (y0 - y1) * (x2 * y3 - y2 * x3)) / denom;
  132. return [x4, y4];
  133. }
  134. function equalArrays(array1, array2) {
  135. if (!array1 || !array2) return false;
  136. if (array1.length !== array2.length) return false;
  137. for (var i = 0, l = array1.length; i < l; i++) {
  138. if (array1[i] instanceof Array && array2[i] instanceof Array) {
  139. if (!equalArrays(array1[i], array2[i])) return false;
  140. } else if (array1[i] !== array2[i]) {
  141. return false;
  142. }
  143. }
  144. return true;
  145. }
  146. // lib/simplepolygon.js
  147. var _area = require('@turf/area');
  148. var _booleanpointinpolygon = require('@turf/boolean-point-in-polygon');
  149. function simplepolygon(feature) {
  150. if (feature.type != "Feature")
  151. throw new Error("The input must a geojson object of type Feature");
  152. if (feature.geometry === void 0 || feature.geometry == null)
  153. throw new Error(
  154. "The input must a geojson object with a non-empty geometry"
  155. );
  156. if (feature.geometry.type != "Polygon")
  157. throw new Error("The input must be a geojson Polygon");
  158. var numRings = feature.geometry.coordinates.length;
  159. var vertices = [];
  160. for (var i = 0; i < numRings; i++) {
  161. var ring = feature.geometry.coordinates[i];
  162. if (!equalArrays2(ring[0], ring[ring.length - 1])) {
  163. ring.push(ring[0]);
  164. }
  165. for (var j = 0; j < ring.length - 1; j++) {
  166. vertices.push(ring[j]);
  167. }
  168. }
  169. if (!isUnique(vertices))
  170. throw new Error(
  171. "The input polygon may not have duplicate vertices (except for the first and last vertex of each ring)"
  172. );
  173. var numvertices = vertices.length;
  174. var selfIsectsData = geojsonPolygonSelfIntersections(
  175. feature,
  176. function filterFn(isect, ring0, edge0, start0, end0, frac0, ring1, edge1, start1, end1, frac1, unique) {
  177. return [
  178. isect,
  179. ring0,
  180. edge0,
  181. start0,
  182. end0,
  183. frac0,
  184. ring1,
  185. edge1,
  186. start1,
  187. end1,
  188. frac1,
  189. unique
  190. ];
  191. }
  192. );
  193. var numSelfIsect = selfIsectsData.length;
  194. if (numSelfIsect == 0) {
  195. var outputFeatureArray = [];
  196. for (var i = 0; i < numRings; i++) {
  197. outputFeatureArray.push(
  198. _helpers.polygon.call(void 0, [feature.geometry.coordinates[i]], {
  199. parent: -1,
  200. winding: windingOfRing(feature.geometry.coordinates[i])
  201. })
  202. );
  203. }
  204. var output = _helpers.featureCollection.call(void 0, outputFeatureArray);
  205. determineParents();
  206. setNetWinding();
  207. return output;
  208. }
  209. var pseudoVtxListByRingAndEdge = [];
  210. var isectList = [];
  211. for (var i = 0; i < numRings; i++) {
  212. pseudoVtxListByRingAndEdge.push([]);
  213. for (var j = 0; j < feature.geometry.coordinates[i].length - 1; j++) {
  214. pseudoVtxListByRingAndEdge[i].push([
  215. new PseudoVtx(
  216. feature.geometry.coordinates[i][modulo(j + 1, feature.geometry.coordinates[i].length - 1)],
  217. 1,
  218. [i, j],
  219. [i, modulo(j + 1, feature.geometry.coordinates[i].length - 1)],
  220. void 0
  221. )
  222. ]);
  223. isectList.push(
  224. new Isect(
  225. feature.geometry.coordinates[i][j],
  226. [i, modulo(j - 1, feature.geometry.coordinates[i].length - 1)],
  227. [i, j],
  228. void 0,
  229. void 0,
  230. false,
  231. true
  232. )
  233. );
  234. }
  235. }
  236. for (var i = 0; i < numSelfIsect; i++) {
  237. pseudoVtxListByRingAndEdge[selfIsectsData[i][1]][selfIsectsData[i][2]].push(
  238. new PseudoVtx(
  239. selfIsectsData[i][0],
  240. selfIsectsData[i][5],
  241. [selfIsectsData[i][1], selfIsectsData[i][2]],
  242. [selfIsectsData[i][6], selfIsectsData[i][7]],
  243. void 0
  244. )
  245. );
  246. if (selfIsectsData[i][11])
  247. isectList.push(
  248. new Isect(
  249. selfIsectsData[i][0],
  250. [selfIsectsData[i][1], selfIsectsData[i][2]],
  251. [selfIsectsData[i][6], selfIsectsData[i][7]],
  252. void 0,
  253. void 0,
  254. true,
  255. true
  256. )
  257. );
  258. }
  259. var numIsect = isectList.length;
  260. for (var i = 0; i < pseudoVtxListByRingAndEdge.length; i++) {
  261. for (var j = 0; j < pseudoVtxListByRingAndEdge[i].length; j++) {
  262. pseudoVtxListByRingAndEdge[i][j].sort(function(a, b) {
  263. return a.param < b.param ? -1 : 1;
  264. });
  265. }
  266. }
  267. var allIsectsAsIsectRbushTreeItem = [];
  268. for (var i = 0; i < numIsect; i++) {
  269. allIsectsAsIsectRbushTreeItem.push({
  270. minX: isectList[i].coord[0],
  271. minY: isectList[i].coord[1],
  272. maxX: isectList[i].coord[0],
  273. maxY: isectList[i].coord[1],
  274. index: i
  275. });
  276. }
  277. var isectRbushTree = new (0, _rbush2.default)();
  278. isectRbushTree.load(allIsectsAsIsectRbushTreeItem);
  279. for (var i = 0; i < pseudoVtxListByRingAndEdge.length; i++) {
  280. for (var j = 0; j < pseudoVtxListByRingAndEdge[i].length; j++) {
  281. for (var k = 0; k < pseudoVtxListByRingAndEdge[i][j].length; k++) {
  282. var coordToFind;
  283. if (k == pseudoVtxListByRingAndEdge[i][j].length - 1) {
  284. coordToFind = pseudoVtxListByRingAndEdge[i][modulo(j + 1, feature.geometry.coordinates[i].length - 1)][0].coord;
  285. } else {
  286. coordToFind = pseudoVtxListByRingAndEdge[i][j][k + 1].coord;
  287. }
  288. var IsectRbushTreeItemFound = isectRbushTree.search({
  289. minX: coordToFind[0],
  290. minY: coordToFind[1],
  291. maxX: coordToFind[0],
  292. maxY: coordToFind[1]
  293. })[0];
  294. pseudoVtxListByRingAndEdge[i][j][k].nxtIsectAlongEdgeIn = IsectRbushTreeItemFound.index;
  295. }
  296. }
  297. }
  298. for (var i = 0; i < pseudoVtxListByRingAndEdge.length; i++) {
  299. for (var j = 0; j < pseudoVtxListByRingAndEdge[i].length; j++) {
  300. for (var k = 0; k < pseudoVtxListByRingAndEdge[i][j].length; k++) {
  301. var coordToFind = pseudoVtxListByRingAndEdge[i][j][k].coord;
  302. var IsectRbushTreeItemFound = isectRbushTree.search({
  303. minX: coordToFind[0],
  304. minY: coordToFind[1],
  305. maxX: coordToFind[0],
  306. maxY: coordToFind[1]
  307. })[0];
  308. var l = IsectRbushTreeItemFound.index;
  309. if (l < numvertices) {
  310. isectList[l].nxtIsectAlongRingAndEdge2 = pseudoVtxListByRingAndEdge[i][j][k].nxtIsectAlongEdgeIn;
  311. } else {
  312. if (equalArrays2(
  313. isectList[l].ringAndEdge1,
  314. pseudoVtxListByRingAndEdge[i][j][k].ringAndEdgeIn
  315. )) {
  316. isectList[l].nxtIsectAlongRingAndEdge1 = pseudoVtxListByRingAndEdge[i][j][k].nxtIsectAlongEdgeIn;
  317. } else {
  318. isectList[l].nxtIsectAlongRingAndEdge2 = pseudoVtxListByRingAndEdge[i][j][k].nxtIsectAlongEdgeIn;
  319. }
  320. }
  321. }
  322. }
  323. }
  324. var queue = [];
  325. var i = 0;
  326. for (var j = 0; j < numRings; j++) {
  327. var leftIsect = i;
  328. for (var k = 0; k < feature.geometry.coordinates[j].length - 1; k++) {
  329. if (isectList[i].coord[0] < isectList[leftIsect].coord[0]) {
  330. leftIsect = i;
  331. }
  332. i++;
  333. }
  334. var isectAfterLeftIsect = isectList[leftIsect].nxtIsectAlongRingAndEdge2;
  335. for (var k = 0; k < isectList.length; k++) {
  336. if (isectList[k].nxtIsectAlongRingAndEdge1 == leftIsect || isectList[k].nxtIsectAlongRingAndEdge2 == leftIsect) {
  337. var isectBeforeLeftIsect = k;
  338. break;
  339. }
  340. }
  341. var windingAtIsect = isConvex(
  342. [
  343. isectList[isectBeforeLeftIsect].coord,
  344. isectList[leftIsect].coord,
  345. isectList[isectAfterLeftIsect].coord
  346. ],
  347. true
  348. ) ? 1 : -1;
  349. queue.push({ isect: leftIsect, parent: -1, winding: windingAtIsect });
  350. }
  351. queue.sort(function(a, b) {
  352. return isectList[a.isect].coord > isectList[b.isect].coord ? -1 : 1;
  353. });
  354. var outputFeatureArray = [];
  355. while (queue.length > 0) {
  356. var popped = queue.pop();
  357. var startIsect = popped.isect;
  358. var currentOutputRingParent = popped.parent;
  359. var currentOutputRingWinding = popped.winding;
  360. var currentOutputRing = outputFeatureArray.length;
  361. var currentOutputRingCoords = [isectList[startIsect].coord];
  362. var currentIsect = startIsect;
  363. if (isectList[startIsect].ringAndEdge1Walkable) {
  364. var walkingRingAndEdge = isectList[startIsect].ringAndEdge1;
  365. var nxtIsect = isectList[startIsect].nxtIsectAlongRingAndEdge1;
  366. } else {
  367. var walkingRingAndEdge = isectList[startIsect].ringAndEdge2;
  368. var nxtIsect = isectList[startIsect].nxtIsectAlongRingAndEdge2;
  369. }
  370. while (!equalArrays2(isectList[startIsect].coord, isectList[nxtIsect].coord)) {
  371. currentOutputRingCoords.push(isectList[nxtIsect].coord);
  372. var nxtIsectInQueue = void 0;
  373. for (var i = 0; i < queue.length; i++) {
  374. if (queue[i].isect == nxtIsect) {
  375. nxtIsectInQueue = i;
  376. break;
  377. }
  378. }
  379. if (nxtIsectInQueue != void 0) {
  380. queue.splice(nxtIsectInQueue, 1);
  381. }
  382. if (equalArrays2(walkingRingAndEdge, isectList[nxtIsect].ringAndEdge1)) {
  383. walkingRingAndEdge = isectList[nxtIsect].ringAndEdge2;
  384. isectList[nxtIsect].ringAndEdge2Walkable = false;
  385. if (isectList[nxtIsect].ringAndEdge1Walkable) {
  386. var pushing = { isect: nxtIsect };
  387. if (isConvex(
  388. [
  389. isectList[currentIsect].coord,
  390. isectList[nxtIsect].coord,
  391. isectList[isectList[nxtIsect].nxtIsectAlongRingAndEdge2].coord
  392. ],
  393. currentOutputRingWinding == 1
  394. )) {
  395. pushing.parent = currentOutputRingParent;
  396. pushing.winding = -currentOutputRingWinding;
  397. } else {
  398. pushing.parent = currentOutputRing;
  399. pushing.winding = currentOutputRingWinding;
  400. }
  401. queue.push(pushing);
  402. }
  403. currentIsect = nxtIsect;
  404. nxtIsect = isectList[nxtIsect].nxtIsectAlongRingAndEdge2;
  405. } else {
  406. walkingRingAndEdge = isectList[nxtIsect].ringAndEdge1;
  407. isectList[nxtIsect].ringAndEdge1Walkable = false;
  408. if (isectList[nxtIsect].ringAndEdge2Walkable) {
  409. var pushing = { isect: nxtIsect };
  410. if (isConvex(
  411. [
  412. isectList[currentIsect].coord,
  413. isectList[nxtIsect].coord,
  414. isectList[isectList[nxtIsect].nxtIsectAlongRingAndEdge1].coord
  415. ],
  416. currentOutputRingWinding == 1
  417. )) {
  418. pushing.parent = currentOutputRingParent;
  419. pushing.winding = -currentOutputRingWinding;
  420. } else {
  421. pushing.parent = currentOutputRing;
  422. pushing.winding = currentOutputRingWinding;
  423. }
  424. queue.push(pushing);
  425. }
  426. currentIsect = nxtIsect;
  427. nxtIsect = isectList[nxtIsect].nxtIsectAlongRingAndEdge1;
  428. }
  429. }
  430. currentOutputRingCoords.push(isectList[nxtIsect].coord);
  431. outputFeatureArray.push(
  432. _helpers.polygon.call(void 0, [currentOutputRingCoords], {
  433. index: currentOutputRing,
  434. parent: currentOutputRingParent,
  435. winding: currentOutputRingWinding,
  436. netWinding: void 0
  437. })
  438. );
  439. }
  440. var output = _helpers.featureCollection.call(void 0, outputFeatureArray);
  441. determineParents();
  442. setNetWinding();
  443. function determineParents() {
  444. var featuresWithoutParent = [];
  445. for (var i2 = 0; i2 < output.features.length; i2++) {
  446. if (output.features[i2].properties.parent == -1)
  447. featuresWithoutParent.push(i2);
  448. }
  449. if (featuresWithoutParent.length > 1) {
  450. for (var i2 = 0; i2 < featuresWithoutParent.length; i2++) {
  451. var parent = -1;
  452. var parentArea = Infinity;
  453. for (var j2 = 0; j2 < output.features.length; j2++) {
  454. if (featuresWithoutParent[i2] == j2) continue;
  455. if (_booleanpointinpolygon.booleanPointInPolygon.call(void 0,
  456. output.features[featuresWithoutParent[i2]].geometry.coordinates[0][0],
  457. output.features[j2],
  458. { ignoreBoundary: true }
  459. )) {
  460. if (_area.area.call(void 0, output.features[j2]) < parentArea) {
  461. parent = j2;
  462. }
  463. }
  464. }
  465. output.features[featuresWithoutParent[i2]].properties.parent = parent;
  466. }
  467. }
  468. }
  469. function setNetWinding() {
  470. for (var i2 = 0; i2 < output.features.length; i2++) {
  471. if (output.features[i2].properties.parent == -1) {
  472. var netWinding = output.features[i2].properties.winding;
  473. output.features[i2].properties.netWinding = netWinding;
  474. setNetWindingOfChildren(i2, netWinding);
  475. }
  476. }
  477. }
  478. function setNetWindingOfChildren(parent, ParentNetWinding) {
  479. for (var i2 = 0; i2 < output.features.length; i2++) {
  480. if (output.features[i2].properties.parent == parent) {
  481. var netWinding = ParentNetWinding + output.features[i2].properties.winding;
  482. output.features[i2].properties.netWinding = netWinding;
  483. setNetWindingOfChildren(i2, netWinding);
  484. }
  485. }
  486. }
  487. return output;
  488. }
  489. var PseudoVtx = function(coord, param, ringAndEdgeIn, ringAndEdgeOut, nxtIsectAlongEdgeIn) {
  490. this.coord = coord;
  491. this.param = param;
  492. this.ringAndEdgeIn = ringAndEdgeIn;
  493. this.ringAndEdgeOut = ringAndEdgeOut;
  494. this.nxtIsectAlongEdgeIn = nxtIsectAlongEdgeIn;
  495. };
  496. var Isect = function(coord, ringAndEdge1, ringAndEdge2, nxtIsectAlongRingAndEdge1, nxtIsectAlongRingAndEdge2, ringAndEdge1Walkable, ringAndEdge2Walkable) {
  497. this.coord = coord;
  498. this.ringAndEdge1 = ringAndEdge1;
  499. this.ringAndEdge2 = ringAndEdge2;
  500. this.nxtIsectAlongRingAndEdge1 = nxtIsectAlongRingAndEdge1;
  501. this.nxtIsectAlongRingAndEdge2 = nxtIsectAlongRingAndEdge2;
  502. this.ringAndEdge1Walkable = ringAndEdge1Walkable;
  503. this.ringAndEdge2Walkable = ringAndEdge2Walkable;
  504. };
  505. function isConvex(pts, righthanded) {
  506. if (typeof righthanded === "undefined") righthanded = true;
  507. if (pts.length != 3)
  508. throw new Error("This function requires an array of three points [x,y]");
  509. var d = (pts[1][0] - pts[0][0]) * (pts[2][1] - pts[0][1]) - (pts[1][1] - pts[0][1]) * (pts[2][0] - pts[0][0]);
  510. return d >= 0 == righthanded;
  511. }
  512. function windingOfRing(ring) {
  513. var leftVtx = 0;
  514. for (var i = 0; i < ring.length - 1; i++) {
  515. if (ring[i][0] < ring[leftVtx][0]) leftVtx = i;
  516. }
  517. if (isConvex(
  518. [
  519. ring[modulo(leftVtx - 1, ring.length - 1)],
  520. ring[leftVtx],
  521. ring[modulo(leftVtx + 1, ring.length - 1)]
  522. ],
  523. true
  524. )) {
  525. var winding = 1;
  526. } else {
  527. var winding = -1;
  528. }
  529. return winding;
  530. }
  531. function equalArrays2(array1, array2) {
  532. if (!array1 || !array2) return false;
  533. if (array1.length != array2.length) return false;
  534. for (var i = 0, l = array1.length; i < l; i++) {
  535. if (array1[i] instanceof Array && array2[i] instanceof Array) {
  536. if (!equalArrays2(array1[i], array2[i])) return false;
  537. } else if (array1[i] != array2[i]) {
  538. return false;
  539. }
  540. }
  541. return true;
  542. }
  543. function modulo(n, m) {
  544. return (n % m + m) % m;
  545. }
  546. function isUnique(array) {
  547. var u = {};
  548. var isUnique2 = 1;
  549. for (var i = 0, l = array.length; i < l; ++i) {
  550. if (Object.prototype.hasOwnProperty.call(u, array[i])) {
  551. isUnique2 = 0;
  552. break;
  553. }
  554. u[array[i]] = 1;
  555. }
  556. return isUnique2;
  557. }
  558. // index.ts
  559. function unkinkPolygon(geojson) {
  560. var features = [];
  561. _meta.flattenEach.call(void 0, geojson, function(feature) {
  562. if (feature.geometry.type !== "Polygon") return;
  563. _meta.featureEach.call(void 0, simplepolygon(feature), function(poly) {
  564. features.push(_helpers.polygon.call(void 0, poly.geometry.coordinates, feature.properties));
  565. });
  566. });
  567. return _helpers.featureCollection.call(void 0, features);
  568. }
  569. var turf_unkink_polygon_default = unkinkPolygon;
  570. exports.default = turf_unkink_polygon_default; exports.unkinkPolygon = unkinkPolygon;
  571. //# sourceMappingURL=index.cjs.map