{"version":3,"file":"kriging-contour.js","sources":["../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/bisect.js","../node_modules/d3-array/src/bisector.js","../node_modules/d3-array/src/ticks.js","../node_modules/d3-array/src/threshold/sturges.js","../node_modules/d3-contour/src/array.js","../node_modules/d3-contour/src/ascending.js","../node_modules/d3-contour/src/constant.js","../node_modules/d3-contour/src/contains.js","../node_modules/d3-contour/src/noop.js","../node_modules/d3-contour/src/contours.js","../node_modules/d3-array/src/extent.js","../node_modules/d3-array/src/range.js","../node_modules/d3-contour/src/area.js","../src/kriging.js","../src/index.js"],"sourcesContent":["export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","export default function(a, b) {\n return a - b;\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(ring, hole) {\n var i = -1, n = hole.length, c;\n while (++i < n) if (c = ringContains(ring, hole[i])) return c;\n return 0;\n}\n\nfunction ringContains(ring, point) {\n var x = point[0], y = point[1], contains = -1;\n for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\n if (segmentContains(pi, pj, point)) return 0;\n if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;\n }\n return contains;\n}\n\nfunction segmentContains(a, b, c) {\n var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\n\nfunction collinear(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nfunction within(p, q, r) {\n return p <= q && q <= r || r <= q && q <= p;\n}\n","export default function() {}\n","import {extent, thresholdSturges, tickStep, range} from \"d3-array\";\nimport {slice} from \"./array\";\nimport ascending from \"./ascending\";\nimport area from \"./area\";\nimport constant from \"./constant\";\nimport contains from \"./contains\";\nimport noop from \"./noop\";\n\nvar cases = [\n [],\n [[[1.0, 1.5], [0.5, 1.0]]],\n [[[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [0.5, 1.0]]],\n [[[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],\n [[[1.0, 0.5], [1.0, 1.5]]],\n [[[1.0, 0.5], [0.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 0.5]]],\n [[[1.0, 1.5], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],\n [[[1.5, 1.0], [1.0, 0.5]]],\n [[[0.5, 1.0], [1.5, 1.0]]],\n [[[1.0, 1.5], [1.5, 1.0]]],\n [[[0.5, 1.0], [1.0, 1.5]]],\n []\n];\n\nexport default function() {\n var dx = 1,\n dy = 1,\n threshold = thresholdSturges,\n smooth = smoothLinear;\n\n function contours(values) {\n var tz = threshold(values);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n var domain = extent(values), start = domain[0], stop = domain[1];\n tz = tickStep(start, stop, tz);\n tz = range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);\n } else {\n tz = tz.slice().sort(ascending);\n }\n\n return tz.map(function(value) {\n return contour(values, value);\n });\n }\n\n // Accumulate, smooth contour rings, assign holes to exterior rings.\n // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n function contour(values, value) {\n var polygons = [],\n holes = [];\n\n isorings(values, value, function(ring) {\n smooth(ring, values, value);\n if (area(ring) > 0) polygons.push([ring]);\n else holes.push(ring);\n });\n\n holes.forEach(function(hole) {\n for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n if (contains((polygon = polygons[i])[0], hole) !== -1) {\n polygon.push(hole);\n return;\n }\n }\n });\n\n return {\n type: \"MultiPolygon\",\n value: value,\n coordinates: polygons\n };\n }\n\n // Marching squares with isolines stitched into rings.\n // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n function isorings(values, value, callback) {\n var fragmentByStart = new Array,\n fragmentByEnd = new Array,\n x, y, t0, t1, t2, t3;\n\n // Special case for the first row (y = -1, t2 = t3 = 0).\n x = y = -1;\n t1 = values[0] >= value;\n cases[t1 << 1].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[x + 1] >= value;\n cases[t0 | t1 << 1].forEach(stitch);\n }\n cases[t1 << 0].forEach(stitch);\n\n // General case for the intermediate rows.\n while (++y < dy - 1) {\n x = -1;\n t1 = values[y * dx + dx] >= value;\n t2 = values[y * dx] >= value;\n cases[t1 << 1 | t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t1 | t2 << 3].forEach(stitch);\n }\n\n // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n x = -1;\n t2 = values[y * dx] >= value;\n cases[t2 << 2].forEach(stitch);\n while (++x < dx - 1) {\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\n cases[t2 << 2 | t3 << 3].forEach(stitch);\n }\n cases[t2 << 3].forEach(stitch);\n\n function stitch(line) {\n var start = [line[0][0] + x, line[0][1] + y],\n end = [line[1][0] + x, line[1][1] + y],\n startIndex = index(start),\n endIndex = index(end),\n f, g;\n if (f = fragmentByEnd[startIndex]) {\n if (g = fragmentByStart[endIndex]) {\n delete fragmentByEnd[f.end];\n delete fragmentByStart[g.start];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};\n }\n } else {\n delete fragmentByEnd[f.end];\n f.ring.push(end);\n fragmentByEnd[f.end = endIndex] = f;\n }\n } else if (f = fragmentByStart[endIndex]) {\n if (g = fragmentByEnd[startIndex]) {\n delete fragmentByStart[f.start];\n delete fragmentByEnd[g.end];\n if (f === g) {\n f.ring.push(end);\n callback(f.ring);\n } else {\n fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};\n }\n } else {\n delete fragmentByStart[f.start];\n f.ring.unshift(start);\n fragmentByStart[f.start = startIndex] = f;\n }\n } else {\n fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};\n }\n }\n }\n\n function index(point) {\n return point[0] * 2 + point[1] * (dx + 1) * 4;\n }\n\n function smoothLinear(ring, values, value) {\n ring.forEach(function(point) {\n var x = point[0],\n y = point[1],\n xt = x | 0,\n yt = y | 0,\n v0,\n v1 = values[yt * dx + xt];\n if (x > 0 && x < dx && xt === x) {\n v0 = values[yt * dx + xt - 1];\n point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n }\n if (y > 0 && y < dy && yt === y) {\n v0 = values[(yt - 1) * dx + xt];\n point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n }\n });\n }\n\n contours.contour = contour;\n\n contours.size = function(_) {\n if (!arguments.length) return [dx, dy];\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\n if (!(_0 > 0) || !(_1 > 0)) throw new Error(\"invalid size\");\n return dx = _0, dy = _1, contours;\n };\n\n contours.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold;\n };\n\n contours.smooth = function(_) {\n return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear;\n };\n\n return contours;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null) {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n }\n\n return [min, max];\n}\n","export default function(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","export default function(ring) {\n var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n return area;\n}\n","import {contours as d3_contours} from 'd3-contour';\r\n\r\n//数组最大值\r\nArray.prototype.max = function () {\r\n\treturn Math.max.apply(null, this);\r\n};\r\n//数组最小值\r\nArray.prototype.min = function () {\r\n\treturn Math.min.apply(null, this);\r\n};\r\n//数组平均值\r\nArray.prototype.mean = function () {\r\n\tvar i,\r\n\tsum;\r\n\tfor (i = 0, sum = 0; i < this.length; i++)\r\n\t\tsum += this[i];\r\n\treturn sum / this.length;\r\n};\r\n\r\n//将数组第一项取出为v,生成长度为n的数组,每个数组item为v\r\nArray.prototype.rep = function (n) {\r\n\tvar arrayn = new Array(n);\r\n\tvar v = this[0];\r\n\tfor (var i = 0; i < n; i++) {\r\n\t\tarrayn[i] = v;\r\n\t}\r\n\treturn arrayn;\r\n};\r\n\r\nArray.prototype.pip = function (x, y) {\r\n\tvar i,\r\n\tj,\r\n\tc = false;\r\n\tfor (i = 0, j = this.length - 1; i < this.length; j = i++) {\r\n\t\tif (((this[i][1] > y) != (this[j][1] > y)) &&\r\n\t\t\t(x < (this[j][0] - this[i][0]) * (y - this[i][1]) / (this[j][1] - this[i][1]) + this[i][0])) {\r\n\t\t\tc = !c;\r\n\t\t}\r\n\t}\r\n\treturn c;\r\n}\r\n\r\n// Matrix algebra\r\nfunction kriging_matrix_diag(c, n) {\r\n\tvar i,\r\n\tZ = [0].rep(n * n);\r\n\tfor (i = 0; i < n; i++)\r\n\t\tZ[i * n + i] = c;\r\n\treturn Z;\r\n};\r\nfunction kriging_matrix_transpose(X, n, m) {\r\n\tvar i,\r\n\tj,\r\n\tZ = Array(m * n);\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = 0; j < m; j++)\r\n\t\t\tZ[j * n + i] = X[i * m + j];\r\n\treturn Z;\r\n};\r\nfunction kriging_matrix_scale(X, c, n, m) {\r\n\tvar i,\r\n\tj;\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = 0; j < m; j++)\r\n\t\t\tX[i * m + j] *= c;\r\n};\r\nfunction kriging_matrix_add(X, Y, n, m) {\r\n\tvar i,\r\n\tj,\r\n\tZ = Array(n * m);\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = 0; j < m; j++)\r\n\t\t\tZ[i * m + j] = X[i * m + j] + Y[i * m + j];\r\n\treturn Z;\r\n};\r\n// Naive matrix multiplication\r\nfunction kriging_matrix_multiply(X, Y, n, m, p) {\r\n\tvar i,\r\n\tj,\r\n\tk,\r\n\tZ = Array(n * p);\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tfor (j = 0; j < p; j++) {\r\n\t\t\tZ[i * p + j] = 0;\r\n\t\t\tfor (k = 0; k < m; k++)\r\n\t\t\t\tZ[i * p + j] += X[i * m + k] * Y[k * p + j];\r\n\t\t}\r\n\t}\r\n\treturn Z;\r\n};\r\n// Cholesky decomposition\r\nfunction kriging_matrix_chol(X, n) {\r\n\tvar i,\r\n\tj,\r\n\tk,\r\n\tsum,\r\n\tp = Array(n);\r\n\tfor (i = 0; i < n; i++)\r\n\t\tp[i] = X[i * n + i];\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tfor (j = 0; j < i; j++)\r\n\t\t\tp[i] -= X[i * n + j] * X[i * n + j];\r\n\t\tif (p[i] <= 0)\r\n\t\t\treturn false;\r\n\t\tp[i] = Math.sqrt(p[i]);\r\n\t\tfor (j = i + 1; j < n; j++) {\r\n\t\t\tfor (k = 0; k < i; k++)\r\n\t\t\t\tX[j * n + i] -= X[j * n + k] * X[i * n + k];\r\n\t\t\tX[j * n + i] /= p[i];\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < n; i++)\r\n\t\tX[i * n + i] = p[i];\r\n\treturn true;\r\n};\r\n// Inversion of cholesky decomposition\r\nfunction kriging_matrix_chol2inv(X, n) {\r\n\tvar i,\r\n\tj,\r\n\tk,\r\n\tsum;\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tX[i * n + i] = 1 / X[i * n + i];\r\n\t\tfor (j = i + 1; j < n; j++) {\r\n\t\t\tsum = 0;\r\n\t\t\tfor (k = i; k < j; k++)\r\n\t\t\t\tsum -= X[j * n + k] * X[k * n + i];\r\n\t\t\tX[j * n + i] = sum / X[j * n + j];\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = i + 1; j < n; j++)\r\n\t\t\tX[i * n + j] = 0;\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tX[i * n + i] *= X[i * n + i];\r\n\t\tfor (k = i + 1; k < n; k++)\r\n\t\t\tX[i * n + i] += X[k * n + i] * X[k * n + i];\r\n\t\tfor (j = i + 1; j < n; j++)\r\n\t\t\tfor (k = j; k < n; k++)\r\n\t\t\t\tX[i * n + j] += X[k * n + i] * X[k * n + j];\r\n\t}\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = 0; j < i; j++)\r\n\t\t\tX[i * n + j] = X[j * n + i];\r\n\r\n};\r\n// Inversion via gauss-jordan elimination\r\nfunction kriging_matrix_solve(X, n) {\r\n\tvar m = n;\r\n\tvar b = Array(n * n);\r\n\tvar indxc = Array(n);\r\n\tvar indxr = Array(n);\r\n\tvar ipiv = Array(n);\r\n\tvar i,\r\n\ticol,\r\n\tirow,\r\n\tj,\r\n\tk,\r\n\tl,\r\n\tll;\r\n\tvar big,\r\n\tdum,\r\n\tpivinv,\r\n\ttemp;\r\n\r\n\tfor (i = 0; i < n; i++)\r\n\t\tfor (j = 0; j < n; j++) {\r\n\t\t\tif (i == j)\r\n\t\t\t\tb[i * n + j] = 1;\r\n\t\t\telse\r\n\t\t\t\tb[i * n + j] = 0;\r\n\t\t}\r\n\tfor (j = 0; j < n; j++)\r\n\t\tipiv[j] = 0;\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tbig = 0;\r\n\t\tfor (j = 0; j < n; j++) {\r\n\t\t\tif (ipiv[j] != 1) {\r\n\t\t\t\tfor (k = 0; k < n; k++) {\r\n\t\t\t\t\tif (ipiv[k] == 0) {\r\n\t\t\t\t\t\tif (Math.abs(X[j * n + k]) >= big) {\r\n\t\t\t\t\t\t\tbig = Math.abs(X[j * n + k]);\r\n\t\t\t\t\t\t\tirow = j;\r\n\t\t\t\t\t\t\ticol = k;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t++(ipiv[icol]);\r\n\r\n\t\tif (irow != icol) {\r\n\t\t\tfor (l = 0; l < n; l++) {\r\n\t\t\t\ttemp = X[irow * n + l];\r\n\t\t\t\tX[irow * n + l] = X[icol * n + l];\r\n\t\t\t\tX[icol * n + l] = temp;\r\n\t\t\t}\r\n\t\t\tfor (l = 0; l < m; l++) {\r\n\t\t\t\ttemp = b[irow * n + l];\r\n\t\t\t\tb[irow * n + l] = b[icol * n + l];\r\n\t\t\t\tb[icol * n + l] = temp;\r\n\t\t\t}\r\n\t\t}\r\n\t\tindxr[i] = irow;\r\n\t\tindxc[i] = icol;\r\n\r\n\t\tif (X[icol * n + icol] == 0)\r\n\t\t\treturn false; // Singular\r\n\r\n\t\tpivinv = 1 / X[icol * n + icol];\r\n\t\tX[icol * n + icol] = 1;\r\n\t\tfor (l = 0; l < n; l++)\r\n\t\t\tX[icol * n + l] *= pivinv;\r\n\t\tfor (l = 0; l < m; l++)\r\n\t\t\tb[icol * n + l] *= pivinv;\r\n\r\n\t\tfor (ll = 0; ll < n; ll++) {\r\n\t\t\tif (ll != icol) {\r\n\t\t\t\tdum = X[ll * n + icol];\r\n\t\t\t\tX[ll * n + icol] = 0;\r\n\t\t\t\tfor (l = 0; l < n; l++)\r\n\t\t\t\t\tX[ll * n + l] -= X[icol * n + l] * dum;\r\n\t\t\t\tfor (l = 0; l < m; l++)\r\n\t\t\t\t\tb[ll * n + l] -= b[icol * n + l] * dum;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (l = (n - 1); l >= 0; l--)\r\n\t\tif (indxr[l] != indxc[l]) {\r\n\t\t\tfor (k = 0; k < n; k++) {\r\n\t\t\t\ttemp = X[k * n + indxr[l]];\r\n\t\t\t\tX[k * n + indxr[l]] = X[k * n + indxc[l]];\r\n\t\t\t\tX[k * n + indxc[l]] = temp;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n// Variogram models\r\nfunction kriging_variogram_gaussian(h, nugget, range, sill, A) {\r\n\treturn nugget + ((sill - nugget) / range) *\r\n\t(1.0 - Math.exp( - (1.0 / A) * Math.pow(h / range, 2)));\r\n};\r\nfunction kriging_variogram_exponential(h, nugget, range, sill, A) {\r\n\treturn nugget + ((sill - nugget) / range) *\r\n\t(1.0 - Math.exp( - (1.0 / A) * (h / range)));\r\n};\r\nfunction kriging_variogram_spherical(h, nugget, range, sill, A) {\r\n\tif (h > range)\r\n\t\treturn nugget + (sill - nugget) / range;\r\n\treturn nugget + ((sill - nugget) / range) *\r\n\t(1.5 * (h / range) - 0.5 * Math.pow(h / range, 3));\r\n};\r\n\r\nvar kriging = {\r\n\r\n};\r\n\r\n\r\n\r\n\r\n// Train using gaussian processes with bayesian priors\r\nkriging.train = function (t, x, y, model, sigma2, alpha) {\r\n\tvar variogram = {\r\n\t\tt : t,\r\n\t\tx : x,\r\n\t\ty : y,\r\n\t\tnugget : 0.0,\r\n\t\trange : 0.0,\r\n\t\tsill : 0.0,\r\n\t\tA : 1 / 3,\r\n\t\tn : 0\r\n\t};\r\n\tswitch (model) {\r\n\tcase \"gaussian\":\r\n\t\tvariogram.model = kriging_variogram_gaussian;\r\n\t\tbreak;\r\n\tcase \"exponential\":\r\n\t\tvariogram.model = kriging_variogram_exponential;\r\n\t\tbreak;\r\n\tcase \"spherical\":\r\n\t\tvariogram.model = kriging_variogram_spherical;\r\n\t\tbreak;\r\n\t};\r\n\r\n\t// Lag distance/semivariance\r\n\tvar i,\r\n\tj,\r\n\tk,\r\n\tl,\r\n\tn = t.length;\r\n\tvar distance = Array((n * n - n) / 2);\r\n\tfor (i = 0, k = 0; i < n; i++)\r\n\t\tfor (j = 0; j < i; j++, k++) {\r\n\t\t\tdistance[k] = Array(2);\r\n\t\t\tdistance[k][0] = Math.pow(\r\n\t\t\t\t\tMath.pow(x[i] - x[j], 2) +\r\n\t\t\t\t\tMath.pow(y[i] - y[j], 2), 0.5);\r\n\t\t\tdistance[k][1] = Math.abs(t[i] - t[j]);\r\n\t\t}\r\n\tdistance.sort(function (a, b) {\r\n\t\treturn a[0] - b[0];\r\n\t});\r\n\tvariogram.range = distance[(n * n - n) / 2 - 1][0];\r\n\r\n\t// Bin lag distance\r\n\tvar lags = ((n * n - n) / 2) > 30 ? 30 : (n * n - n) / 2;\r\n\tvar tolerance = variogram.range / lags;\r\n\tvar lag = [0].rep(lags);\r\n\tvar semi = [0].rep(lags);\r\n\tif (lags < 30) {\r\n\t\tfor (l = 0; l < lags; l++) {\r\n\t\t\tlag[l] = distance[l][0];\r\n\t\t\tsemi[l] = distance[l][1];\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0, j = 0, k = 0, l = 0; i < lags && j < ((n * n - n) / 2); i++, k = 0) {\r\n\t\t\twhile (distance[j][0] <= ((i + 1) * tolerance)) {\r\n\t\t\t\tlag[l] += distance[j][0];\r\n\t\t\t\tsemi[l] += distance[j][1];\r\n\t\t\t\tj++;\r\n\t\t\t\tk++;\r\n\t\t\t\tif (j >= ((n * n - n) / 2))\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (k > 0) {\r\n\t\t\t\tlag[l] /= k;\r\n\t\t\t\tsemi[l] /= k;\r\n\t\t\t\tl++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (l < 2)\r\n\t\t\treturn variogram; // Error: Not enough points\r\n\t}\r\n\r\n\t// Feature transformation\r\n\tn = l;\r\n\tvariogram.range = lag[n - 1] - lag[0];\r\n\tvar X = [1].rep(2 * n);\r\n\tvar Y = Array(n);\r\n\tvar A = variogram.A;\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tswitch (model) {\r\n\t\tcase \"gaussian\":\r\n\t\t\tX[i * 2 + 1] = 1.0 - Math.exp( - (1.0 / A) * Math.pow(lag[i] / variogram.range, 2));\r\n\t\t\tbreak;\r\n\t\tcase \"exponential\":\r\n\t\t\tX[i * 2 + 1] = 1.0 - Math.exp( - (1.0 / A) * lag[i] / variogram.range);\r\n\t\t\tbreak;\r\n\t\tcase \"spherical\":\r\n\t\t\tX[i * 2 + 1] = 1.5 * (lag[i] / variogram.range) -\r\n\t\t\t\t0.5 * Math.pow(lag[i] / variogram.range, 3);\r\n\t\t\tbreak;\r\n\t\t};\r\n\t\tY[i] = semi[i];\r\n\t}\r\n\r\n\t// Least squares\r\n\tvar Xt = kriging_matrix_transpose(X, n, 2);\r\n\tvar Z = kriging_matrix_multiply(Xt, X, 2, n, 2);\r\n\tZ = kriging_matrix_add(Z, kriging_matrix_diag(1 / alpha, 2), 2, 2);\r\n\tvar cloneZ = Z.slice(0);\r\n\tif (kriging_matrix_chol(Z, 2))\r\n\t\tkriging_matrix_chol2inv(Z, 2);\r\n\telse {\r\n\t\tkriging_matrix_solve(cloneZ, 2);\r\n\t\tZ = cloneZ;\r\n\t}\r\n\tvar W = kriging_matrix_multiply(kriging_matrix_multiply(Z, Xt, 2, 2, n), Y, 2, n, 1);\r\n\r\n\t// Variogram parameters\r\n\tvariogram.nugget = W[0];\r\n\tvariogram.sill = W[1] * variogram.range + variogram.nugget;\r\n\tvariogram.n = x.length;\r\n\r\n\t// Gram matrix with prior\r\n\tn = x.length;\r\n\tvar K = Array(n * n);\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tfor (j = 0; j < i; j++) {\r\n\t\t\tK[i * n + j] = variogram.model(Math.pow(Math.pow(x[i] - x[j], 2) +\r\n\t\t\t\t\t\tMath.pow(y[i] - y[j], 2), 0.5),\r\n\t\t\t\t\tvariogram.nugget,\r\n\t\t\t\t\tvariogram.range,\r\n\t\t\t\t\tvariogram.sill,\r\n\t\t\t\t\tvariogram.A);\r\n\t\t\tK[j * n + i] = K[i * n + j];\r\n\t\t}\r\n\t\tK[i * n + i] = variogram.model(0, variogram.nugget,\r\n\t\t\t\tvariogram.range,\r\n\t\t\t\tvariogram.sill,\r\n\t\t\t\tvariogram.A);\r\n\t}\r\n\r\n\t// Inverse penalized Gram matrix projected to target vector\r\n\tvar C = kriging_matrix_add(K, kriging_matrix_diag(sigma2, n), n, n);\r\n\tvar cloneC = C.slice(0);\r\n\tif (kriging_matrix_chol(C, n))\r\n\t\tkriging_matrix_chol2inv(C, n);\r\n\telse {\r\n\t\tkriging_matrix_solve(cloneC, n);\r\n\t\tC = cloneC;\r\n\t}\r\n\r\n\t// Copy unprojected inverted matrix as K\r\n\tvar K = C.slice(0);\r\n\tvar M = kriging_matrix_multiply(C, t, n, n, 1);\r\n\tvariogram.K = K;\r\n\tvariogram.M = M;\r\n\r\n\treturn variogram;\r\n};\r\n\r\n// Model prediction\r\nkriging.predict = function (x, y, variogram) {\r\n\tvar i,\r\n\tk = Array(variogram.n);\r\n\tfor (i = 0; i < variogram.n; i++)\r\n\t\tk[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2) +\r\n\t\t\t\t\tMath.pow(y - variogram.y[i], 2), 0.5),\r\n\t\t\t\tvariogram.nugget, variogram.range,\r\n\t\t\t\tvariogram.sill, variogram.A);\r\n\treturn kriging_matrix_multiply(k, variogram.M, 1, variogram.n, 1)[0];\r\n};\r\nkriging.variance = function (x, y, variogram) {\r\n\tvar i,\r\n\tk = Array(variogram.n);\r\n\tfor (i = 0; i < variogram.n; i++)\r\n\t\tk[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2) +\r\n\t\t\t\t\tMath.pow(y - variogram.y[i], 2), 0.5),\r\n\t\t\t\tvariogram.nugget, variogram.range,\r\n\t\t\t\tvariogram.sill, variogram.A);\r\n\treturn variogram.model(0, variogram.nugget, variogram.range,\r\n\t\tvariogram.sill, variogram.A) +\r\n\tkriging_matrix_multiply(kriging_matrix_multiply(k, variogram.K,\r\n\t\t\t1, variogram.n, variogram.n),\r\n\t\tk, 1, variogram.n, 1)[0];\r\n};\r\n\r\n// 生成克里金grid\r\nkriging.getGridInfo = function (bbox,variogram,width) {\r\n\tvar grid = [];\r\n\t//x方向\r\n\tvar xlim=[bbox[0],bbox[2]];\r\n\tvar ylim=[bbox[1],bbox[3]];\r\n\tvar zlim=[variogram.t.min(), variogram.t.max()];\r\n\t\r\n\t//xy方向地理跨度\r\n\tvar geoX_width=xlim[1]-xlim[0];\r\n\tvar geoY_width=ylim[1]-ylim[0];\r\n\r\n\t//如果x_width设置,初始基于200计算。\r\n\tlet x_width,y_width;\r\n\tif(!width)\r\n\t\tx_width=200;\r\n\telse\r\n\t\tx_width=Math.ceil(width);\r\n\t//让图像的xy比例与地理的xy比例保持一致\r\n\ty_width=Math.ceil(x_width/(geoX_width/geoY_width));\r\n\r\n\t//地理跨度/图像跨度=当前地图图上分辨率\r\n\tvar x_resolution=geoX_width*1.0/x_width;\r\n\tvar y_resolution=geoY_width*1.0/y_width;\r\n\t\r\n\tvar xtarget,ytarget;\r\n\r\n\tfor (let j = 0; j < y_width; j++) {\r\n\t\tfor (let k =0; k {\r\n\t\t\t\tlet geom = {\r\n\t\t\t\t\t\"type\" : \"Polygon\",\r\n\t\t\t\t\t\"coordinates\" : []\r\n\t\t\t\t};\r\n\t\t\t\t//坐标转换,图形为空去除\r\n\t\t\t\tgeom.coordinates=polygon_pixel2geos(polygon,gridInfo);\r\n\t\t\t\tif(geom.coordinates.length>0){\r\n\t\t\t\t\tdataset.features.push({\r\n\t\t\t\t\t\t\"type\" : \"Feature\",\r\n\t\t\t\t\t\t\"properties\" : {\r\n\t\t\t\t\t\t\t\"value\" : contour.value\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"geometry\" :geom\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\telse if(contour.type==='Polygon'){\r\n\t\t\tlet geom = {\r\n\t\t\t\t\"type\" : \"Polygon\",\r\n\t\t\t\t\"coordinates\" : []\r\n\t\t\t};\r\n\t\t\t//坐标转换,图形为空去除\r\n\t\t\tgeom.coordinates=polygon_pixel2geos(contour.coordinates,gridInfo);\r\n\t\t\tif(geom.coordinates.length>0){\r\n\t\t\t\tdataset.features.push({\r\n\t\t\t\t\t\"type\" : \"Feature\",\r\n\t\t\t\t\t\"properties\" : {\r\n\t\t\t\t\t\t\"value\" : contour.value\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"geometry\" :geom\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn dataset;\r\n};\r\n//像素坐标转地理坐标\r\nfunction polygon_pixel2geos(polygon,gridInfo){\r\n\t//polygon分内环和外环\r\n\tconst _polygon = polygon.map((ring) => {\r\n\t\tconst _ring = ring.map(function (coor) {\r\n\t\t\t//像素坐标转地理坐标 ,像素坐标y方向从上到下递增,纬度是y从上到下递减\r\n\t\t\tconst lon = gridInfo.xlim[0] + coor[0]*gridInfo.x_resolution;\r\n\t\t\tlet lat;\r\n\t\t\t//格网自上向下走\r\n\t\t\tif(gridInfo.y_resolution<0)\r\n\t\t\t\tlat=gridInfo.ylim[1] + coor[1]*gridInfo.y_resolution;\r\n\t\t\t//格网自下向上走\r\n\t\t\telse\r\n\t\t\t\tlat=gridInfo.ylim[0] + coor[1]*gridInfo.y_resolution;\r\n\t\r\n\t\t\treturn [lon,lat];\r\n\t\t});\r\n\t\treturn _ring;\r\n\t});\t\r\n\treturn _polygon;\r\n}\r\n//克里金生成canvas图像\r\n kriging.drawCanvasContour = function(gridInfo,canvas,xlim,ylim,colors) {\r\n\t//清空画布\r\n\tvar ctx = canvas.getContext(\"2d\");\r\n\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\t//开始边界\r\n\tvar range = [xlim[1]-xlim[0], ylim[1]-ylim[0], gridInfo.zlim[1]-gridInfo.zlim[0]];\r\n\tvar n = gridInfo.n;\r\n\tvar m = gridInfo.m;\r\n\t//根据分辨率,计算每个色块的宽高\r\n\tvar wx = Math.ceil(gridInfo.x_resolution*canvas.width/(xlim[1]-xlim[0]));\r\n\tvar wy = Math.ceil(gridInfo.y_resolution*canvas.height/(ylim[1]-ylim[0]));\r\n\r\n\tfor(let i=0;i1.0) \r\n\t\t\t\tz = 1.0;\r\n\t\t\tctx.fillStyle = colors[Math.floor((colors.length-1)*z)];\r\n\t\t\tctx.fillRect(Math.round(x-wx/2), Math.round(y-wy/2), wx, wy);\r\n\t }\r\n\t};\r\n\r\nexport {kriging};\r\n","import {kriging} from './kriging';\r\n\r\nfunction _getKrigingGridInfo(featureCollection,weight,krigingParams){\r\n //先获取featureCollection的bbox\r\n let values=[],lons=[],lats=[];\r\n let extent=[100000000,100000000,-100000000,-100000000];\r\n featureCollection.features.forEach(feature => {\r\n //提取插值权重字段,准备克里金插值使用\r\n values.push(feature.properties[weight]);\r\n lons.push(feature.geometry.coordinates[0]);\r\n lats.push(feature.geometry.coordinates[1]);\r\n if(extent[0]>feature.geometry.coordinates[0])\r\n extent[0]=feature.geometry.coordinates[0];\r\n if(extent[1]>feature.geometry.coordinates[1])\r\n extent[1]=feature.geometry.coordinates[1];\r\n if(extent[2]