deeptwins-engine-3d 0.1.6 → 0.1.7
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/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -29,8 +29,9 @@ import ArcGisLayer from "./tileLayer/ArcGisLayer";
|
|
|
29
29
|
import RasterLayer from "./tileLayer/RasterLayer";
|
|
30
30
|
import WmsLayer from "./tileLayer/WmsLayer";
|
|
31
31
|
import WmtsLayer from "./tileLayer/WmtsLayer";
|
|
32
|
-
import { ClampToGround, ShapeSection } from "./tool/common";
|
|
33
32
|
import TimerInterval from "./tool/TimerInterval";
|
|
33
|
+
import { ClampToGround, ShapeSection } from "./tool/common";
|
|
34
|
+
import Kriging from "./tool/kriging";
|
|
34
35
|
import { loadCss } from "./tool/utils";
|
|
35
36
|
import VideoProject from "./videoFusion/VideoProject";
|
|
36
37
|
import VideoTexture from "./videoFusion/VideoTexture";
|
|
@@ -47,7 +48,7 @@ loadCss(Cesium.buildModuleUrl('Widgets/widgets.css'));
|
|
|
47
48
|
export var DeepTwinsEngine3D = /*#__PURE__*/_createClass(function DeepTwinsEngine3D() {
|
|
48
49
|
_classCallCheck(this, DeepTwinsEngine3D);
|
|
49
50
|
});
|
|
50
|
-
_defineProperty(DeepTwinsEngine3D, "Version", "0.1.
|
|
51
|
+
_defineProperty(DeepTwinsEngine3D, "Version", "0.1.7");
|
|
51
52
|
_defineProperty(DeepTwinsEngine3D, "Map", Map);
|
|
52
53
|
_defineProperty(DeepTwinsEngine3D, "GroundSkyBox", GroundSkyBox);
|
|
53
54
|
_defineProperty(DeepTwinsEngine3D, "RasterLayer", RasterLayer);
|
|
@@ -104,4 +105,5 @@ _defineProperty(DeepTwinsEngine3D, "NearFarScalar", Cesium.NearFarScalar);
|
|
|
104
105
|
_defineProperty(DeepTwinsEngine3D, "DistanceDisplayCondition", Cesium.DistanceDisplayCondition);
|
|
105
106
|
_defineProperty(DeepTwinsEngine3D, "BoundingRectangle", Cesium.BoundingRectangle);
|
|
106
107
|
_defineProperty(DeepTwinsEngine3D, "SplitDirection", Cesium.SplitDirection);
|
|
108
|
+
_defineProperty(DeepTwinsEngine3D, "Kriging", Kriging);
|
|
107
109
|
export default DeepTwinsEngine3D;
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
// 扩展Array类的类型定义
|
|
2
|
+
|
|
3
|
+
// 扩展Array类
|
|
4
|
+
Array.prototype.max = function () {
|
|
5
|
+
return Math.max.apply(null, this);
|
|
6
|
+
};
|
|
7
|
+
Array.prototype.min = function () {
|
|
8
|
+
return Math.min.apply(null, this);
|
|
9
|
+
};
|
|
10
|
+
Array.prototype.mean = function () {
|
|
11
|
+
var i, sum;
|
|
12
|
+
for (i = 0, sum = 0; i < this.length; i++) sum += this[i];
|
|
13
|
+
return sum / this.length;
|
|
14
|
+
};
|
|
15
|
+
Array.prototype.pip = function (x, y) {
|
|
16
|
+
var i,
|
|
17
|
+
j,
|
|
18
|
+
c = false;
|
|
19
|
+
for (i = 0, j = this.length - 1; i < this.length; j = i++) {
|
|
20
|
+
if (this[i][1] > y != this[j][1] > y && x < (this[j][0] - this[i][0]) * (y - this[i][1]) / (this[j][1] - this[i][1]) + this[i][0]) {
|
|
21
|
+
c = !c;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return c;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// 类型定义
|
|
28
|
+
|
|
29
|
+
var Kriging = function () {
|
|
30
|
+
var kriging = {};
|
|
31
|
+
var createArrayWithValues = function createArrayWithValues(value, n) {
|
|
32
|
+
var array = [];
|
|
33
|
+
for (var i = 0; i < n; i++) {
|
|
34
|
+
array.push(value);
|
|
35
|
+
}
|
|
36
|
+
return array;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// 矩阵代数
|
|
40
|
+
var kriging_matrix_diag = function kriging_matrix_diag(c, n) {
|
|
41
|
+
var Z = createArrayWithValues(0, n * n);
|
|
42
|
+
for (var i = 0; i < n; i++) Z[i * n + i] = c;
|
|
43
|
+
return Z;
|
|
44
|
+
};
|
|
45
|
+
var kriging_matrix_transpose = function kriging_matrix_transpose(X, n, m) {
|
|
46
|
+
var i, j;
|
|
47
|
+
var Z = Array(m * n);
|
|
48
|
+
for (i = 0; i < n; i++) for (j = 0; j < m; j++) Z[j * n + i] = X[i * m + j];
|
|
49
|
+
return Z;
|
|
50
|
+
};
|
|
51
|
+
var kriging_matrix_scale = function kriging_matrix_scale(X, c, n, m) {
|
|
52
|
+
var i, j;
|
|
53
|
+
for (i = 0; i < n; i++) for (j = 0; j < m; j++) X[i * m + j] *= c;
|
|
54
|
+
};
|
|
55
|
+
var kriging_matrix_add = function kriging_matrix_add(X, Y, n, m) {
|
|
56
|
+
var i, j;
|
|
57
|
+
var Z = Array(n * m);
|
|
58
|
+
for (i = 0; i < n; i++) for (j = 0; j < m; j++) Z[i * m + j] = X[i * m + j] + Y[i * m + j];
|
|
59
|
+
return Z;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 朴素矩阵乘法
|
|
63
|
+
var kriging_matrix_multiply = function kriging_matrix_multiply(X, Y, n, m, p) {
|
|
64
|
+
var i, j, k;
|
|
65
|
+
var Z = Array(n * p);
|
|
66
|
+
for (i = 0; i < n; i++) {
|
|
67
|
+
for (j = 0; j < p; j++) {
|
|
68
|
+
Z[i * p + j] = 0;
|
|
69
|
+
for (k = 0; k < m; k++) Z[i * p + j] += X[i * m + k] * Y[k * p + j];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return Z;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Cholesky分解
|
|
76
|
+
var kriging_matrix_chol = function kriging_matrix_chol(X, n) {
|
|
77
|
+
var i, j, k;
|
|
78
|
+
var p = Array(n);
|
|
79
|
+
for (i = 0; i < n; i++) p[i] = X[i * n + i];
|
|
80
|
+
for (i = 0; i < n; i++) {
|
|
81
|
+
for (j = 0; j < i; j++) p[i] -= X[i * n + j] * X[i * n + j];
|
|
82
|
+
if (p[i] <= 0) return false;
|
|
83
|
+
p[i] = Math.sqrt(p[i]);
|
|
84
|
+
for (j = i + 1; j < n; j++) {
|
|
85
|
+
for (k = 0; k < i; k++) X[j * n + i] -= X[j * n + k] * X[i * n + k];
|
|
86
|
+
X[j * n + i] /= p[i];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (i = 0; i < n; i++) X[i * n + i] = p[i];
|
|
90
|
+
return true;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Cholesky分解的逆
|
|
94
|
+
var kriging_matrix_chol2inv = function kriging_matrix_chol2inv(X, n) {
|
|
95
|
+
var i, j, k, sum;
|
|
96
|
+
for (i = 0; i < n; i++) {
|
|
97
|
+
X[i * n + i] = 1 / X[i * n + i];
|
|
98
|
+
for (j = i + 1; j < n; j++) {
|
|
99
|
+
sum = 0;
|
|
100
|
+
for (k = i; k < j; k++) sum -= X[j * n + k] * X[k * n + i];
|
|
101
|
+
X[j * n + i] = sum / X[j * n + j];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (i = 0; i < n; i++) for (j = i + 1; j < n; j++) X[i * n + j] = 0;
|
|
105
|
+
for (i = 0; i < n; i++) {
|
|
106
|
+
X[i * n + i] *= X[i * n + i];
|
|
107
|
+
for (k = i + 1; k < n; k++) X[i * n + i] += X[k * n + i] * X[k * n + i];
|
|
108
|
+
for (j = i + 1; j < n; j++) for (k = j; k < n; k++) X[i * n + j] += X[k * n + i] * X[k * n + j];
|
|
109
|
+
}
|
|
110
|
+
for (i = 0; i < n; i++) for (j = 0; j < i; j++) X[i * n + j] = X[j * n + i];
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// 通过高斯-约当消元法求逆
|
|
114
|
+
var kriging_matrix_solve = function kriging_matrix_solve(X, n) {
|
|
115
|
+
var m = n;
|
|
116
|
+
var b = Array(n * n);
|
|
117
|
+
var indxc = Array(n);
|
|
118
|
+
var indxr = Array(n);
|
|
119
|
+
var ipiv = Array(n);
|
|
120
|
+
var i, icol, irow, j, k, l, ll;
|
|
121
|
+
var big, dum, pivinv, temp;
|
|
122
|
+
for (i = 0; i < n; i++) for (j = 0; j < n; j++) {
|
|
123
|
+
if (i == j) b[i * n + j] = 1;else b[i * n + j] = 0;
|
|
124
|
+
}
|
|
125
|
+
for (j = 0; j < n; j++) ipiv[j] = 0;
|
|
126
|
+
for (i = 0; i < n; i++) {
|
|
127
|
+
big = 0;
|
|
128
|
+
for (j = 0; j < n; j++) {
|
|
129
|
+
if (ipiv[j] != 1) {
|
|
130
|
+
for (k = 0; k < n; k++) {
|
|
131
|
+
if (ipiv[k] == 0) {
|
|
132
|
+
if (Math.abs(X[j * n + k]) >= big) {
|
|
133
|
+
big = Math.abs(X[j * n + k]);
|
|
134
|
+
irow = j;
|
|
135
|
+
icol = k;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
++ipiv[icol];
|
|
142
|
+
if (irow != icol) {
|
|
143
|
+
for (l = 0; l < n; l++) {
|
|
144
|
+
temp = X[irow * n + l];
|
|
145
|
+
X[irow * n + l] = X[icol * n + l];
|
|
146
|
+
X[icol * n + l] = temp;
|
|
147
|
+
}
|
|
148
|
+
for (l = 0; l < m; l++) {
|
|
149
|
+
temp = b[irow * n + l];
|
|
150
|
+
b[irow * n + l] = b[icol * n + l];
|
|
151
|
+
b[icol * n + l] = temp;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
indxr[i] = irow;
|
|
155
|
+
indxc[i] = icol;
|
|
156
|
+
if (X[icol * n + icol] == 0) return false; // 奇异矩阵
|
|
157
|
+
|
|
158
|
+
pivinv = 1 / X[icol * n + icol];
|
|
159
|
+
X[icol * n + icol] = 1;
|
|
160
|
+
for (l = 0; l < n; l++) X[icol * n + l] *= pivinv;
|
|
161
|
+
for (l = 0; l < m; l++) b[icol * n + l] *= pivinv;
|
|
162
|
+
for (ll = 0; ll < n; ll++) {
|
|
163
|
+
if (ll != icol) {
|
|
164
|
+
dum = X[ll * n + icol];
|
|
165
|
+
X[ll * n + icol] = 0;
|
|
166
|
+
for (l = 0; l < n; l++) X[ll * n + l] -= X[icol * n + l] * dum;
|
|
167
|
+
for (l = 0; l < m; l++) b[ll * n + l] -= b[icol * n + l] * dum;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (l = n - 1; l >= 0; l--) if (indxr[l] != indxc[l]) {
|
|
172
|
+
for (k = 0; k < n; k++) {
|
|
173
|
+
temp = X[k * n + indxr[l]];
|
|
174
|
+
X[k * n + indxr[l]] = X[k * n + indxc[l]];
|
|
175
|
+
X[k * n + indxc[l]] = temp;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// 变差函数模型
|
|
182
|
+
var kriging_variogram_gaussian = function kriging_variogram_gaussian(h, nugget, range, sill, A) {
|
|
183
|
+
return nugget + (sill - nugget) / range * (1.0 - Math.exp(-(1.0 / A) * Math.pow(h / range, 2)));
|
|
184
|
+
};
|
|
185
|
+
var kriging_variogram_exponential = function kriging_variogram_exponential(h, nugget, range, sill, A) {
|
|
186
|
+
return nugget + (sill - nugget) / range * (1.0 - Math.exp(-(1.0 / A) * (h / range)));
|
|
187
|
+
};
|
|
188
|
+
var kriging_variogram_spherical = function kriging_variogram_spherical(h, nugget, range, sill) {
|
|
189
|
+
if (h > range) return nugget + (sill - nugget) / range;
|
|
190
|
+
return nugget + (sill - nugget) / range * (1.5 * (h / range) - 0.5 * Math.pow(h / range, 3));
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// 使用贝叶斯先验的高斯过程训练
|
|
194
|
+
kriging.train = function (t, x, y, model, sigma2, alpha) {
|
|
195
|
+
var variogram = {
|
|
196
|
+
t: t,
|
|
197
|
+
x: x,
|
|
198
|
+
y: y,
|
|
199
|
+
nugget: 0.0,
|
|
200
|
+
range: 0.0,
|
|
201
|
+
sill: 0.0,
|
|
202
|
+
A: 1 / 3,
|
|
203
|
+
n: 0
|
|
204
|
+
};
|
|
205
|
+
switch (model) {
|
|
206
|
+
case 'gaussian':
|
|
207
|
+
variogram.model = kriging_variogram_gaussian;
|
|
208
|
+
break;
|
|
209
|
+
case 'exponential':
|
|
210
|
+
variogram.model = kriging_variogram_exponential;
|
|
211
|
+
break;
|
|
212
|
+
case 'spherical':
|
|
213
|
+
variogram.model = kriging_variogram_spherical;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// 滞后距离/半方差
|
|
218
|
+
var i,
|
|
219
|
+
j,
|
|
220
|
+
k,
|
|
221
|
+
l,
|
|
222
|
+
n = t.length;
|
|
223
|
+
var distance = Array((n * n - n) / 2);
|
|
224
|
+
for (i = 0, k = 0; i < n; i++) for (j = 0; j < i; j++, k++) {
|
|
225
|
+
distance[k] = [0, 0];
|
|
226
|
+
distance[k][0] = Math.pow(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2), 0.5);
|
|
227
|
+
distance[k][1] = Math.abs(t[i] - t[j]);
|
|
228
|
+
}
|
|
229
|
+
distance.sort(function (a, b) {
|
|
230
|
+
return a[0] - b[0];
|
|
231
|
+
});
|
|
232
|
+
variogram.range = distance[(n * n - n) / 2 - 1][0];
|
|
233
|
+
|
|
234
|
+
// 分箱滞后距离
|
|
235
|
+
var lags = (n * n - n) / 2 > 30 ? 30 : (n * n - n) / 2;
|
|
236
|
+
var tolerance = variogram.range / lags;
|
|
237
|
+
var lag = createArrayWithValues(0, lags);
|
|
238
|
+
var semi = createArrayWithValues(0, lags);
|
|
239
|
+
if (lags < 30) {
|
|
240
|
+
for (l = 0; l < lags; l++) {
|
|
241
|
+
lag[l] = distance[l][0];
|
|
242
|
+
semi[l] = distance[l][1];
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
for (i = 0, j = 0, k = 0, l = 0; i < lags && j < (n * n - n) / 2; i++, k = 0) {
|
|
246
|
+
while (distance[j][0] <= (i + 1) * tolerance) {
|
|
247
|
+
lag[l] += distance[j][0];
|
|
248
|
+
semi[l] += distance[j][1];
|
|
249
|
+
j++;
|
|
250
|
+
k++;
|
|
251
|
+
if (j >= (n * n - n) / 2) break;
|
|
252
|
+
}
|
|
253
|
+
if (k > 0) {
|
|
254
|
+
lag[l] /= k;
|
|
255
|
+
semi[l] /= k;
|
|
256
|
+
l++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (l < 2) return variogram; // 错误:点数不够
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// 特征变换
|
|
263
|
+
n = l;
|
|
264
|
+
variogram.range = lag[n - 1] - lag[0];
|
|
265
|
+
var X = createArrayWithValues(1, 2 * n);
|
|
266
|
+
var Y = Array(n);
|
|
267
|
+
var A = variogram.A;
|
|
268
|
+
for (i = 0; i < n; i++) {
|
|
269
|
+
switch (model) {
|
|
270
|
+
case 'gaussian':
|
|
271
|
+
X[i * 2 + 1] = 1.0 - Math.exp(-(1.0 / A) * Math.pow(lag[i] / variogram.range, 2));
|
|
272
|
+
break;
|
|
273
|
+
case 'exponential':
|
|
274
|
+
X[i * 2 + 1] = 1.0 - Math.exp(-(1.0 / A) * lag[i] / variogram.range);
|
|
275
|
+
break;
|
|
276
|
+
case 'spherical':
|
|
277
|
+
X[i * 2 + 1] = 1.5 * (lag[i] / variogram.range) - 0.5 * Math.pow(lag[i] / variogram.range, 3);
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
Y[i] = semi[i];
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// 最小二乘法
|
|
284
|
+
var Xt = kriging_matrix_transpose(X, n, 2);
|
|
285
|
+
var Z = kriging_matrix_multiply(Xt, X, 2, n, 2);
|
|
286
|
+
Z = kriging_matrix_add(Z, kriging_matrix_diag(1 / alpha, 2), 2, 2);
|
|
287
|
+
var cloneZ = Z.slice(0);
|
|
288
|
+
if (kriging_matrix_chol(Z, 2)) kriging_matrix_chol2inv(Z, 2);else {
|
|
289
|
+
kriging_matrix_solve(cloneZ, 2);
|
|
290
|
+
Z = cloneZ;
|
|
291
|
+
}
|
|
292
|
+
var W = kriging_matrix_multiply(kriging_matrix_multiply(Z, Xt, 2, 2, n), Y, 2, n, 1);
|
|
293
|
+
|
|
294
|
+
// 变差函数参数
|
|
295
|
+
variogram.nugget = W[0];
|
|
296
|
+
variogram.sill = W[1] * variogram.range + variogram.nugget;
|
|
297
|
+
variogram.n = x.length;
|
|
298
|
+
|
|
299
|
+
// 带先验的Gram矩阵
|
|
300
|
+
n = x.length;
|
|
301
|
+
var K = Array(n * n);
|
|
302
|
+
for (i = 0; i < n; i++) {
|
|
303
|
+
for (j = 0; j < i; j++) {
|
|
304
|
+
K[i * n + j] = variogram.model(Math.pow(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
|
|
305
|
+
K[j * n + i] = K[i * n + j];
|
|
306
|
+
}
|
|
307
|
+
K[i * n + i] = variogram.model(0, variogram.nugget, variogram.range, variogram.sill, variogram.A);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// 投影到目标向量的惩罚Gram矩阵的逆
|
|
311
|
+
var C = kriging_matrix_add(K, kriging_matrix_diag(sigma2, n), n, n);
|
|
312
|
+
var cloneC = C.slice(0);
|
|
313
|
+
if (kriging_matrix_chol(C, n)) kriging_matrix_chol2inv(C, n);else {
|
|
314
|
+
kriging_matrix_solve(cloneC, n);
|
|
315
|
+
C = cloneC;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// 复制未投影的逆矩阵作为K
|
|
319
|
+
var K_final = C.slice(0);
|
|
320
|
+
var M = kriging_matrix_multiply(C, t, n, n, 1);
|
|
321
|
+
variogram.K = K_final;
|
|
322
|
+
variogram.M = M;
|
|
323
|
+
return variogram;
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
// 模型预测
|
|
327
|
+
kriging.predict = function (x, y, variogram) {
|
|
328
|
+
var i;
|
|
329
|
+
var k = Array(variogram.n);
|
|
330
|
+
for (i = 0; i < variogram.n; i++) k[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2) + Math.pow(y - variogram.y[i], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
|
|
331
|
+
return kriging_matrix_multiply(k, variogram.M, 1, variogram.n, 1)[0];
|
|
332
|
+
};
|
|
333
|
+
kriging.variance = function (x, y, variogram) {
|
|
334
|
+
var i;
|
|
335
|
+
var k = Array(variogram.n);
|
|
336
|
+
for (i = 0; i < variogram.n; i++) k[i] = variogram.model(Math.pow(Math.pow(x - variogram.x[i], 2) + Math.pow(y - variogram.y[i], 2), 0.5), variogram.nugget, variogram.range, variogram.sill, variogram.A);
|
|
337
|
+
return variogram.model(0, variogram.nugget, variogram.range, variogram.sill, variogram.A) + kriging_matrix_multiply(kriging_matrix_multiply(k, variogram.K, 1, variogram.n, variogram.n), k, 1, variogram.n, 1)[0];
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// 网格矩阵或等高线路径
|
|
341
|
+
kriging.grid = function (polygons, variogram, width) {
|
|
342
|
+
var i, j, k;
|
|
343
|
+
var n = polygons.length;
|
|
344
|
+
if (n == 0) return {};
|
|
345
|
+
|
|
346
|
+
// 多边形空间的边界
|
|
347
|
+
var xlim = [polygons[0][0][0], polygons[0][0][0]];
|
|
348
|
+
var ylim = [polygons[0][0][1], polygons[0][0][1]];
|
|
349
|
+
for (i = 0; i < n; i++ // 多边形
|
|
350
|
+
) for (j = 0; j < polygons[i].length; j++) {
|
|
351
|
+
// 顶点
|
|
352
|
+
if (polygons[i][j][0] < xlim[0]) xlim[0] = polygons[i][j][0];
|
|
353
|
+
if (polygons[i][j][0] > xlim[1]) xlim[1] = polygons[i][j][0];
|
|
354
|
+
if (polygons[i][j][1] < ylim[0]) ylim[0] = polygons[i][j][1];
|
|
355
|
+
if (polygons[i][j][1] > ylim[1]) ylim[1] = polygons[i][j][1];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// 为O(n^2)空间分配
|
|
359
|
+
var xtarget, ytarget;
|
|
360
|
+
var a = Array(2),
|
|
361
|
+
b = Array(2);
|
|
362
|
+
var lxlim = Array(2); // 局部尺寸
|
|
363
|
+
var lylim = Array(2); // 局部尺寸
|
|
364
|
+
var x = Math.ceil((xlim[1] - xlim[0]) / width);
|
|
365
|
+
var y = Math.ceil((ylim[1] - ylim[0]) / width);
|
|
366
|
+
var A = Array(x + 1);
|
|
367
|
+
for (i = 0; i <= x; i++) A[i] = Array(y + 1);
|
|
368
|
+
for (i = 0; i < n; i++) {
|
|
369
|
+
// polygons[i]的范围
|
|
370
|
+
lxlim[0] = polygons[i][0][0];
|
|
371
|
+
lxlim[1] = lxlim[0];
|
|
372
|
+
lylim[0] = polygons[i][0][1];
|
|
373
|
+
lylim[1] = lylim[0];
|
|
374
|
+
for (j = 1; j < polygons[i].length; j++) {
|
|
375
|
+
// 顶点
|
|
376
|
+
if (polygons[i][j][0] < lxlim[0]) lxlim[0] = polygons[i][j][0];
|
|
377
|
+
if (polygons[i][j][0] > lxlim[1]) lxlim[1] = polygons[i][j][0];
|
|
378
|
+
if (polygons[i][j][1] < lylim[0]) lylim[0] = polygons[i][j][1];
|
|
379
|
+
if (polygons[i][j][1] > lylim[1]) lylim[1] = polygons[i][j][1];
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// 遍历多边形子空间
|
|
383
|
+
a[0] = Math.floor((lxlim[0] - (lxlim[0] - xlim[0]) % width - xlim[0]) / width);
|
|
384
|
+
a[1] = Math.ceil((lxlim[1] - (lxlim[1] - xlim[1]) % width - xlim[0]) / width);
|
|
385
|
+
b[0] = Math.floor((lylim[0] - (lylim[0] - ylim[0]) % width - ylim[0]) / width);
|
|
386
|
+
b[1] = Math.ceil((lylim[1] - (lylim[1] - ylim[1]) % width - ylim[0]) / width);
|
|
387
|
+
for (j = a[0]; j <= a[1]; j++) for (k = b[0]; k <= b[1]; k++) {
|
|
388
|
+
xtarget = xlim[0] + j * width;
|
|
389
|
+
ytarget = ylim[0] + k * width;
|
|
390
|
+
if (polygons[i].pip(xtarget, ytarget)) A[j][k] = kriging.predict(xtarget, ytarget, variogram);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
A.xlim = xlim;
|
|
394
|
+
A.ylim = ylim;
|
|
395
|
+
A.zlim = [variogram.t.min(), variogram.t.max()];
|
|
396
|
+
A.width = width;
|
|
397
|
+
return A;
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// 在DOM上绘图
|
|
401
|
+
kriging.plot = function (canvas, grid, xlim, ylim, colors) {
|
|
402
|
+
// 清屏
|
|
403
|
+
var ctx = canvas.getContext('2d');
|
|
404
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
405
|
+
|
|
406
|
+
// 起始边界
|
|
407
|
+
var range = [xlim[1] - xlim[0], ylim[1] - ylim[0], grid.zlim[1] - grid.zlim[0]];
|
|
408
|
+
var i, j, x, y, z;
|
|
409
|
+
var n = grid.length;
|
|
410
|
+
var m = grid[0].length;
|
|
411
|
+
var wx = Math.ceil(grid.width * canvas.width / (xlim[1] - xlim[0]));
|
|
412
|
+
var wy = Math.ceil(grid.width * canvas.height / (ylim[1] - ylim[0]));
|
|
413
|
+
for (i = 0; i < n; i++) for (j = 0; j < m; j++) {
|
|
414
|
+
if (grid[i][j] == undefined) continue;
|
|
415
|
+
x = canvas.width * (i * grid.width + grid.xlim[0] - xlim[0]) / range[0];
|
|
416
|
+
y = canvas.height * (1 - (j * grid.width + grid.ylim[0] - ylim[0]) / range[1]);
|
|
417
|
+
z = (grid[i][j] - grid.zlim[0]) / range[2];
|
|
418
|
+
if (z < 0.0) z = 0.0;
|
|
419
|
+
if (z > 1.0) z = 1.0;
|
|
420
|
+
ctx.fillStyle = kriging.getColor(colors, grid[i][j]);
|
|
421
|
+
ctx.fillRect(Math.round(x - wx / 2), Math.round(y - wy / 2), wx, wy);
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
//自定义色彩
|
|
425
|
+
kriging.getColor = function (colors, z) {
|
|
426
|
+
var l = colors.length;
|
|
427
|
+
for (var i = 0; i < l; i++) {
|
|
428
|
+
if (z >= colors[i].min && z < colors[i].max) return colors[i].color;
|
|
429
|
+
}
|
|
430
|
+
if (z < 0) {
|
|
431
|
+
return colors[0].color;
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
return kriging;
|
|
435
|
+
}();
|
|
436
|
+
export default Kriging;
|