index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // index.ts
  2. import { area } from "@turf/area";
  3. import { bbox as turfBBox } from "@turf/bbox";
  4. import { bboxPolygon } from "@turf/bbox-polygon";
  5. import { getCoord } from "@turf/invariant";
  6. import { squareGrid } from "@turf/square-grid";
  7. function quadratAnalysis(pointFeatureSet, options) {
  8. options = options || {};
  9. const studyBbox = options.studyBbox || turfBBox(pointFeatureSet);
  10. const confidenceLevel = options.confidenceLevel || 20;
  11. const points = pointFeatureSet.features;
  12. const numOfPoints = points.length;
  13. const sizeOfArea = area(bboxPolygon(studyBbox));
  14. const lengthOfSide = Math.sqrt(sizeOfArea / numOfPoints * 2);
  15. const grid = squareGrid(studyBbox, lengthOfSide, {
  16. units: "meters"
  17. });
  18. const quadrats = grid.features;
  19. const quadratIdDict = {};
  20. for (let i = 0; i < quadrats.length; i++) {
  21. quadratIdDict[i] = {
  22. box: turfBBox(quadrats[i]),
  23. cnt: 0
  24. };
  25. }
  26. let sumOfPoint = 0;
  27. for (const pt of points) {
  28. for (const key of Object.keys(quadratIdDict)) {
  29. const box = quadratIdDict[key].box;
  30. if (inBBox(getCoord(pt), box)) {
  31. quadratIdDict[key].cnt += 1;
  32. sumOfPoint += 1;
  33. break;
  34. }
  35. }
  36. }
  37. let maxCnt = 0;
  38. for (const key of Object.keys(quadratIdDict)) {
  39. const cnt = quadratIdDict[key].cnt;
  40. if (cnt > maxCnt) {
  41. maxCnt = cnt;
  42. }
  43. }
  44. const expectedDistribution = [];
  45. const numOfQuadrat = Object.keys(quadratIdDict).length;
  46. const lambda = sumOfPoint / numOfQuadrat;
  47. let cumulativeProbility = 0;
  48. for (let x = 0; x < maxCnt + 1; x++) {
  49. cumulativeProbility += Math.exp(-lambda) * Math.pow(lambda, x) / factorial(x);
  50. expectedDistribution.push(cumulativeProbility);
  51. }
  52. const observedDistribution = [];
  53. let cumulativeObservedQuads = 0;
  54. for (let x = 0; x < maxCnt + 1; x++) {
  55. for (const key of Object.keys(quadratIdDict)) {
  56. if (quadratIdDict[key].cnt === x) {
  57. cumulativeObservedQuads += 1;
  58. }
  59. }
  60. const p = cumulativeObservedQuads / numOfQuadrat;
  61. observedDistribution.push(p);
  62. }
  63. let maxDifference = 0;
  64. for (let x = 0; x < maxCnt + 1; x++) {
  65. const difference = Math.abs(
  66. expectedDistribution[x] - observedDistribution[x]
  67. );
  68. if (difference > maxDifference) {
  69. maxDifference = difference;
  70. }
  71. }
  72. const k = K_TABLE[confidenceLevel];
  73. const criticalValue = k / Math.sqrt(numOfQuadrat);
  74. const result = {
  75. criticalValue,
  76. isRandom: true,
  77. maxAbsoluteDifference: maxDifference,
  78. observedDistribution
  79. };
  80. if (maxDifference > criticalValue) {
  81. result.isRandom = false;
  82. }
  83. return result;
  84. }
  85. var K_TABLE = {
  86. 20: 1.07275,
  87. 15: 1.13795,
  88. 10: 1.22385,
  89. 5: 1.3581,
  90. 2: 1.51743,
  91. 1: 1.62762
  92. };
  93. function inBBox(pt, bbox) {
  94. return bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1];
  95. }
  96. function factorial(num) {
  97. const f = [];
  98. function inner(n) {
  99. if (n === 0 || n === 1) {
  100. return 1;
  101. }
  102. if (f[n] > 0) {
  103. return f[n];
  104. }
  105. return f[n] = inner(n - 1) * n;
  106. }
  107. return inner(num);
  108. }
  109. var turf_quadrat_analysis_default = quadratAnalysis;
  110. export {
  111. turf_quadrat_analysis_default as default,
  112. quadratAnalysis
  113. };
  114. //# sourceMappingURL=index.js.map