@antv/l7-layers 2.23.2 → 2.23.3-beta.1

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.
Files changed (73) hide show
  1. package/es/{citybuliding → citybuilding}/models/build.js +4 -2
  2. package/es/core/BaseLayer.js +3 -3
  3. package/es/core/LayerPickService.js +3 -1
  4. package/es/core/shape/Path.d.ts +2 -1
  5. package/es/core/shape/Path.js +10 -4
  6. package/es/core/triangulation.js +51 -1
  7. package/es/earth/index.js +2 -3
  8. package/es/geometry/index.js +2 -3
  9. package/es/heatmap/index.js +6 -6
  10. package/es/heatmap/models/heatmap.js +2 -3
  11. package/es/index.d.ts +1 -1
  12. package/es/index.js +1 -1
  13. package/es/line/index.js +2 -3
  14. package/es/plugins/DataMappingPlugin.js +30 -10
  15. package/es/plugins/FeatureScalePlugin.js +21 -20
  16. package/es/plugins/ShaderUniformPlugin.js +62 -29
  17. package/es/plugins/index.d.ts +1 -1
  18. package/es/polygon/index.js +2 -3
  19. package/es/polygon/models/extrude.js +22 -7
  20. package/es/polygon/models/ocean.js +17 -6
  21. package/es/polygon/models/water.js +17 -6
  22. package/es/tile/core/BaseLayer.d.ts +4 -1
  23. package/es/tile/core/BaseLayer.js +19 -11
  24. package/es/tile/service/TileLayerService.d.ts +26 -1
  25. package/es/tile/service/TileLayerService.js +88 -16
  26. package/es/tile/service/TilePickService.js +15 -9
  27. package/es/tile/tile/Tile.d.ts +1 -1
  28. package/es/tile/tile/index.d.ts +1 -1
  29. package/es/tile/tile/util.d.ts +1 -1
  30. package/es/utils/scale.d.ts +87 -0
  31. package/es/utils/scale.js +588 -0
  32. package/lib/{citybuliding → citybuilding}/models/build.js +4 -2
  33. package/lib/core/BaseLayer.js +3 -3
  34. package/lib/core/LayerPickService.js +3 -1
  35. package/lib/core/shape/Path.d.ts +2 -1
  36. package/lib/core/shape/Path.js +10 -4
  37. package/lib/core/triangulation.js +50 -1
  38. package/lib/earth/index.js +2 -3
  39. package/lib/geometry/index.js +2 -3
  40. package/lib/heatmap/index.js +6 -6
  41. package/lib/heatmap/models/heatmap.js +2 -3
  42. package/lib/index.d.ts +1 -1
  43. package/lib/index.js +1 -1
  44. package/lib/line/index.js +2 -3
  45. package/lib/plugins/DataMappingPlugin.js +30 -10
  46. package/lib/plugins/FeatureScalePlugin.js +22 -23
  47. package/lib/plugins/ShaderUniformPlugin.js +62 -29
  48. package/lib/plugins/index.d.ts +1 -1
  49. package/lib/polygon/index.js +2 -3
  50. package/lib/polygon/models/extrude.js +22 -7
  51. package/lib/polygon/models/ocean.js +17 -6
  52. package/lib/polygon/models/water.js +17 -6
  53. package/lib/tile/core/BaseLayer.d.ts +4 -1
  54. package/lib/tile/core/BaseLayer.js +19 -11
  55. package/lib/tile/service/TileLayerService.d.ts +26 -1
  56. package/lib/tile/service/TileLayerService.js +88 -16
  57. package/lib/tile/service/TilePickService.js +15 -9
  58. package/lib/tile/tile/Tile.d.ts +1 -1
  59. package/lib/tile/tile/index.d.ts +1 -1
  60. package/lib/tile/tile/util.d.ts +1 -1
  61. package/lib/utils/scale.d.ts +87 -0
  62. package/lib/utils/scale.js +603 -0
  63. package/package.json +6 -17
  64. /package/es/{citybuliding → citybuilding}/building.d.ts +0 -0
  65. /package/es/{citybuliding → citybuilding}/building.js +0 -0
  66. /package/es/{citybuliding → citybuilding}/models/build.d.ts +0 -0
  67. /package/es/{citybuliding → citybuilding}/shaders/build_frag.glsl +0 -0
  68. /package/es/{citybuliding → citybuilding}/shaders/build_vert.glsl +0 -0
  69. /package/lib/{citybuliding → citybuilding}/building.d.ts +0 -0
  70. /package/lib/{citybuliding → citybuilding}/building.js +0 -0
  71. /package/lib/{citybuliding → citybuilding}/models/build.d.ts +0 -0
  72. /package/lib/{citybuliding → citybuilding}/shaders/build_frag.glsl +0 -0
  73. /package/lib/{citybuliding → citybuilding}/shaders/build_vert.glsl +0 -0
@@ -0,0 +1,588 @@
1
+ /**
2
+ * 比例尺工具
3
+ * 用于替代 d3-scale 的功能
4
+ */
5
+
6
+ // ==================== 工具函数 ====================
7
+
8
+ function bisect(a, x, lo = 0, hi = a.length) {
9
+ while (lo < hi) {
10
+ const mid = lo + hi >>> 1;
11
+ if (a[mid] < x) lo = mid + 1;else hi = mid;
12
+ }
13
+ return lo;
14
+ }
15
+ function tickIncrement(start, stop, count) {
16
+ if (start === stop) return 0;
17
+ const d = stop - start;
18
+ const step = Math.pow(10, Math.floor(Math.log(d / count) / Math.LN10));
19
+ const err = count / d * step;
20
+ if (err <= 0.15) return step * 10;
21
+ if (err <= 0.35) return step * 5;
22
+ if (err <= 0.75) return step * 2;
23
+ return step;
24
+ }
25
+ function tickStep(start, stop, count) {
26
+ if (start === stop) return 1;
27
+ const d = stop - start;
28
+ const step0 = Math.abs(d) / Math.max(1, count);
29
+ let step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10));
30
+ const error = step0 / step1;
31
+ if (error >= 10) step1 *= 10;else if (error >= 5) step1 *= 5;else if (error >= 2) step1 *= 2;
32
+ return d < 0 ? -step1 : step1;
33
+ }
34
+
35
+ // 处理 domain 中的无效值
36
+ function sanitizeDomain(d) {
37
+ const filtered = d.filter(v => v != null && !Number.isNaN(v) && typeof v === 'number');
38
+ if (filtered.length === 0) {
39
+ return [0, 1];
40
+ } else if (filtered.length === 1) {
41
+ return [filtered[0], filtered[0]];
42
+ }
43
+ return filtered;
44
+ }
45
+
46
+ // ==================== Linear Scale ====================
47
+
48
+ export function scaleLinear() {
49
+ let domain = [0, 1];
50
+ let range = [0, 1];
51
+ let _clamp = false;
52
+ function scale(x) {
53
+ const d0 = domain[0];
54
+ const d1 = domain[domain.length - 1];
55
+ const r0 = range[0];
56
+ const r1 = range[range.length - 1];
57
+
58
+ // 处理相等的 domain
59
+ if (d0 === d1) {
60
+ return r0;
61
+ }
62
+ let t = (x - d0) / (d1 - d0);
63
+ if (_clamp) t = Math.max(0, Math.min(1, t));
64
+ return r0 + t * (r1 - r0);
65
+ }
66
+ scale.domain = function (d) {
67
+ if (d === undefined) return domain.slice();
68
+ domain = sanitizeDomain(d);
69
+ return scale;
70
+ };
71
+ scale.range = function (r) {
72
+ if (r === undefined) return range.slice();
73
+ range = r.slice();
74
+ return scale;
75
+ };
76
+ scale.invert = function (y) {
77
+ const d0 = domain[0];
78
+ const d1 = domain[domain.length - 1];
79
+ const r0 = range[0];
80
+ const r1 = range[range.length - 1];
81
+ return d0 + (y - r0) / (r1 - r0) * (d1 - d0);
82
+ };
83
+ scale.ticks = function (count = 10) {
84
+ const d0 = domain[0];
85
+ const d1 = domain[domain.length - 1];
86
+ if (d0 === d1) return [d0];
87
+ const step = tickStep(d0, d1, count);
88
+ const ticks = [];
89
+ let i = Math.floor(d0 / step);
90
+ const maxI = Math.ceil(d1 / step);
91
+ while (i <= maxI) {
92
+ ticks.push(i * step);
93
+ i++;
94
+ }
95
+ return ticks;
96
+ };
97
+ scale.nice = function (count = 10) {
98
+ const d0 = domain[0];
99
+ const d1 = domain[domain.length - 1];
100
+ if (d0 === d1) return scale;
101
+ const step = tickIncrement(d0, d1, count);
102
+ if (step > 0) {
103
+ domain = [Math.floor(d0 / step) * step, Math.ceil(d1 / step) * step];
104
+ }
105
+ return scale;
106
+ };
107
+ scale.clamp = function (c) {
108
+ if (c === undefined) return _clamp;
109
+ _clamp = c;
110
+ return scale;
111
+ };
112
+ return scale;
113
+ }
114
+
115
+ // ==================== Power Scale ====================
116
+
117
+ export function scalePow() {
118
+ let domain = [0, 1];
119
+ let range = [0, 1];
120
+ let _clamp = false;
121
+ let _exponent = 1;
122
+ function scale(x) {
123
+ const d0 = domain[0];
124
+ const d1 = domain[domain.length - 1];
125
+ const r0 = range[0];
126
+ const r1 = range[range.length - 1];
127
+ if (d0 === d1) {
128
+ return r0;
129
+ }
130
+ let t = (x - d0) / (d1 - d0);
131
+ if (_clamp) t = Math.max(0, Math.min(1, t));
132
+ t = Math.pow(t, _exponent);
133
+ return r0 + t * (r1 - r0);
134
+ }
135
+ scale.domain = function (d) {
136
+ if (d === undefined) return domain.slice();
137
+ domain = sanitizeDomain(d);
138
+ return scale;
139
+ };
140
+ scale.range = function (r) {
141
+ if (r === undefined) return range.slice();
142
+ range = r.slice();
143
+ return scale;
144
+ };
145
+ scale.invert = function (y) {
146
+ const d0 = domain[0];
147
+ const d1 = domain[domain.length - 1];
148
+ const r0 = range[0];
149
+ const r1 = range[range.length - 1];
150
+ let t = (y - r0) / (r1 - r0);
151
+ t = Math.pow(t, 1 / _exponent);
152
+ return d0 + t * (d1 - d0);
153
+ };
154
+ scale.ticks = function (count = 10) {
155
+ const d0 = domain[0];
156
+ const d1 = domain[domain.length - 1];
157
+ if (d0 === d1) return [d0];
158
+ const step = tickStep(d0, d1, count);
159
+ const ticks = [];
160
+ let i = Math.floor(d0 / step);
161
+ const maxI = Math.ceil(d1 / step);
162
+ while (i <= maxI) {
163
+ ticks.push(i * step);
164
+ i++;
165
+ }
166
+ return ticks;
167
+ };
168
+ scale.nice = function (count = 10) {
169
+ const d0 = domain[0];
170
+ const d1 = domain[domain.length - 1];
171
+ if (d0 === d1) return scale;
172
+ const step = tickIncrement(d0, d1, count);
173
+ if (step > 0) {
174
+ domain = [Math.floor(d0 / step) * step, Math.ceil(d1 / step) * step];
175
+ }
176
+ return scale;
177
+ };
178
+ scale.clamp = function (c) {
179
+ if (c === undefined) return _clamp;
180
+ _clamp = c;
181
+ return scale;
182
+ };
183
+ scale.exponent = function (k) {
184
+ if (k === undefined) return _exponent;
185
+ _exponent = k;
186
+ return scale;
187
+ };
188
+ return scale;
189
+ }
190
+
191
+ // ==================== Log Scale ====================
192
+
193
+ function log(x, base) {
194
+ return Math.log(x) / Math.log(base);
195
+ }
196
+ function pow(x, base) {
197
+ return Math.pow(base, x);
198
+ }
199
+ export function scaleLog() {
200
+ let domain = [1, 10];
201
+ let range = [0, 1];
202
+ let _clamp = false;
203
+ let _base = 10;
204
+ function scale(x) {
205
+ const d0 = domain[0];
206
+ const d1 = domain[domain.length - 1];
207
+ const r0 = range[0];
208
+ const r1 = range[range.length - 1];
209
+ if (d0 === d1) {
210
+ return r0;
211
+ }
212
+ const absD0 = Math.abs(d0) || 1;
213
+ const absD1 = Math.abs(d1) || 1;
214
+ const absX = Math.abs(x) || 1;
215
+ let t = (log(absX, _base) - log(absD0, _base)) / (log(absD1, _base) - log(absD0, _base));
216
+ if (_clamp) t = Math.max(0, Math.min(1, t));
217
+ return r0 + t * (r1 - r0);
218
+ }
219
+ scale.domain = function (d) {
220
+ if (d === undefined) return domain.slice();
221
+ const sanitized = sanitizeDomain(d);
222
+ // log scale 需要 正数domain
223
+ domain = sanitized.map(v => v <= 0 ? 1 : v);
224
+ return scale;
225
+ };
226
+ scale.range = function (r) {
227
+ if (r === undefined) return range.slice();
228
+ range = r.slice();
229
+ return scale;
230
+ };
231
+ scale.invert = function (y) {
232
+ const d0 = domain[0];
233
+ const d1 = domain[domain.length - 1];
234
+ const r0 = range[0];
235
+ const r1 = range[range.length - 1];
236
+ const t = (y - r0) / (r1 - r0);
237
+ const absD0 = Math.abs(d0) || 1;
238
+ const absD1 = Math.abs(d1) || 1;
239
+ return pow(log(absD0, _base) + t * (log(absD1, _base) - log(absD0, _base)), _base);
240
+ };
241
+ scale.ticks = function (count = 10) {
242
+ const d0 = domain[0];
243
+ const d1 = domain[domain.length - 1];
244
+ if (d0 === d1) return [d0];
245
+ const ticks = [];
246
+ const startPow = Math.floor(log(Math.abs(d0) || 1, _base));
247
+ const endPow = Math.ceil(log(Math.abs(d1) || 1, _base));
248
+ for (let i = startPow; i <= endPow; i++) {
249
+ ticks.push(pow(i, _base));
250
+ }
251
+ return ticks;
252
+ };
253
+ scale.nice = function () {
254
+ return scale;
255
+ };
256
+ scale.clamp = function (c) {
257
+ if (c === undefined) return _clamp;
258
+ _clamp = c;
259
+ return scale;
260
+ };
261
+ scale.base = function (b) {
262
+ if (b === undefined) return _base;
263
+ _base = b;
264
+ return scale;
265
+ };
266
+ return scale;
267
+ }
268
+
269
+ // ==================== Ordinal Scale ====================
270
+
271
+ export function scaleOrdinal(range) {
272
+ let domain = [];
273
+ let _range = range || [];
274
+ let _unknown;
275
+ const index = new Map();
276
+ function scale(x) {
277
+ let i = index.get(x);
278
+ if (i === undefined) {
279
+ if (_unknown !== undefined) return _unknown;
280
+ if (_range.length === 0) return undefined;
281
+ i = domain.push(x) - 1;
282
+ index.set(x, i);
283
+ }
284
+ return _range[i % _range.length];
285
+ }
286
+ scale.domain = function (d) {
287
+ if (d === undefined) return domain.slice();
288
+ domain = [];
289
+ index.clear();
290
+ d.forEach(x => {
291
+ if (!index.has(x)) {
292
+ index.set(x, domain.length);
293
+ domain.push(x);
294
+ }
295
+ });
296
+ return scale;
297
+ };
298
+ scale.range = function (r) {
299
+ if (r === undefined) return _range.slice();
300
+ _range = r.slice();
301
+ return scale;
302
+ };
303
+ scale.unknown = function (value) {
304
+ _unknown = value;
305
+ return scale;
306
+ };
307
+ return scale;
308
+ }
309
+
310
+ // ==================== Quantize Scale ====================
311
+
312
+ export function scaleQuantize() {
313
+ let domain = [0, 1];
314
+ let _range = [0, 1];
315
+ let n = 1;
316
+ function scale(x) {
317
+ const d0 = domain[0];
318
+ const d1 = domain[domain.length - 1];
319
+ if (d0 === d1) {
320
+ return _range[0];
321
+ }
322
+ const t = (x - d0) / (d1 - d0);
323
+ const i = Math.max(0, Math.min(n - 1, Math.floor(t * n)));
324
+ return _range[i];
325
+ }
326
+ scale.domain = function (d) {
327
+ if (d === undefined) return domain.slice();
328
+ domain = sanitizeDomain(d);
329
+ return scale;
330
+ };
331
+ scale.range = function (r) {
332
+ if (r === undefined) return _range.slice();
333
+ _range = r.slice();
334
+ n = Math.max(1, _range.length);
335
+ return scale;
336
+ };
337
+ scale.invertExtent = function (y) {
338
+ const i = _range.indexOf(y);
339
+ if (i < 0) return [NaN, NaN];
340
+ const d0 = domain[0];
341
+ const d1 = domain[domain.length - 1];
342
+ const step = (d1 - d0) / n;
343
+ return [d0 + i * step, d0 + (i + 1) * step];
344
+ };
345
+ return scale;
346
+ }
347
+
348
+ // ==================== Quantile Scale ====================
349
+
350
+ export function scaleQuantile() {
351
+ let _domain = [];
352
+ let _range = [0, 1];
353
+ let thresholds = [];
354
+ function scale(x) {
355
+ if (isNaN(x)) return _range[0];
356
+ const i = bisect(thresholds, x);
357
+ return _range[i];
358
+ }
359
+ scale.domain = function (d) {
360
+ if (d === undefined) return _domain.slice();
361
+ _domain = d.filter(x => x != null && !isNaN(x) && typeof x === 'number').sort((a, b) => a - b);
362
+ rescale();
363
+ return scale;
364
+ };
365
+ scale.range = function (r) {
366
+ if (r === undefined) return _range.slice();
367
+ _range = r.slice();
368
+ rescale();
369
+ return scale;
370
+ };
371
+ scale.invertExtent = function (y) {
372
+ const i = _range.indexOf(y);
373
+ if (i < 0) return [NaN, NaN];
374
+ const n = _range.length;
375
+ return i > 0 ? [thresholds[i - 1], thresholds[i]] : [_domain[0], thresholds[0]];
376
+ };
377
+ scale.quantiles = function () {
378
+ return thresholds.slice();
379
+ };
380
+ function rescale() {
381
+ const n = _range.length;
382
+ const m = _domain.length;
383
+ if (m === 0 || n === 0) {
384
+ thresholds = [];
385
+ return;
386
+ }
387
+ thresholds = [];
388
+ for (let i = 1; i < n; i++) {
389
+ const q = i / n;
390
+ const index = (m - 1) * q;
391
+ const lower = Math.floor(index);
392
+ const upper = Math.ceil(index);
393
+ const weight = index - lower;
394
+ if (upper >= m) {
395
+ thresholds.push(_domain[m - 1]);
396
+ } else {
397
+ thresholds.push(_domain[lower] * (1 - weight) + _domain[upper] * weight);
398
+ }
399
+ }
400
+ }
401
+ return scale;
402
+ }
403
+
404
+ // ==================== Threshold Scale ====================
405
+
406
+ export function scaleThreshold() {
407
+ let _domain = [0.5];
408
+ let _range = [0, 1];
409
+ function scale(x) {
410
+ const i = bisect(_domain, x);
411
+ return _range[i];
412
+ }
413
+ scale.domain = function (d) {
414
+ if (d === undefined) return _domain.slice();
415
+ _domain = d.filter(v => v != null && !isNaN(v) && typeof v === 'number');
416
+ if (_domain.length === 0) {
417
+ _domain = [0.5];
418
+ }
419
+ return scale;
420
+ };
421
+ scale.range = function (r) {
422
+ if (r === undefined) return _range.slice();
423
+ _range = r.slice();
424
+ return scale;
425
+ };
426
+ scale.invertExtent = function (y) {
427
+ const i = _range.indexOf(y);
428
+ return [i > 0 ? _domain[i - 1] : undefined, i < _domain.length ? _domain[i] : undefined];
429
+ };
430
+ return scale;
431
+ }
432
+
433
+ // ==================== Sequential Scale ====================
434
+
435
+ export function scaleSequential() {
436
+ let domain = [0, 1];
437
+ let _interpolator = t => t;
438
+ let _clamp = false;
439
+ function scale(x) {
440
+ const d0 = domain[0];
441
+ const d1 = domain[domain.length - 1];
442
+ if (d0 === d1) {
443
+ return _interpolator(0.5);
444
+ }
445
+ let t = (x - d0) / (d1 - d0);
446
+ if (_clamp) t = Math.max(0, Math.min(1, t));
447
+ return _interpolator(t);
448
+ }
449
+ scale.domain = function (d) {
450
+ if (d === undefined) return domain.slice();
451
+ domain = sanitizeDomain(d);
452
+ return scale;
453
+ };
454
+ scale.interpolator = function (i) {
455
+ if (i === undefined) return _interpolator;
456
+ _interpolator = i;
457
+ return scale;
458
+ };
459
+ scale.clamp = function (c) {
460
+ if (c === undefined) return _clamp;
461
+ _clamp = c;
462
+ return scale;
463
+ };
464
+ return scale;
465
+ }
466
+
467
+ // ==================== Diverging Scale ====================
468
+
469
+ export function scaleDiverging() {
470
+ let domain = [0, 0.5, 1];
471
+ let _interpolator = t => t;
472
+ let _clamp = false;
473
+ function scale(x) {
474
+ const d0 = domain[0];
475
+ const d1 = domain[1];
476
+ const d2 = domain[2];
477
+ let t;
478
+ if (x < d1) {
479
+ if (d0 === d1) {
480
+ return _interpolator(0.5);
481
+ }
482
+ t = (x - d0) / (d1 - d0);
483
+ t = _clamp ? Math.max(0, t) : t;
484
+ return _interpolator(0.5 - t * 0.5);
485
+ } else {
486
+ if (d1 === d2) {
487
+ return _interpolator(0.5);
488
+ }
489
+ t = (x - d1) / (d2 - d1);
490
+ t = _clamp ? Math.min(1, t) : t;
491
+ return _interpolator(0.5 + t * 0.5);
492
+ }
493
+ }
494
+ scale.domain = function (d) {
495
+ if (d === undefined) return domain.slice();
496
+ // diverging scale 需要 3 个值
497
+ const sanitized = d.filter(v => v != null && !isNaN(v) && typeof v === 'number');
498
+ if (sanitized.length >= 3) {
499
+ domain = [sanitized[0], sanitized[1], sanitized[2]];
500
+ } else if (sanitized.length === 2) {
501
+ const mid = (sanitized[0] + sanitized[1]) / 2;
502
+ domain = [sanitized[0], mid, sanitized[1]];
503
+ } else if (sanitized.length === 1) {
504
+ domain = [sanitized[1], sanitized[0], sanitized[0] + 1];
505
+ } else {
506
+ domain = [0, 0.5, 1];
507
+ }
508
+ return scale;
509
+ };
510
+ scale.interpolator = function (i) {
511
+ if (i === undefined) return _interpolator;
512
+ _interpolator = i;
513
+ return scale;
514
+ };
515
+ scale.clamp = function (c) {
516
+ if (c === undefined) return _clamp;
517
+ _clamp = c;
518
+ return scale;
519
+ };
520
+ return scale;
521
+ }
522
+
523
+ // ==================== Time Scale ====================
524
+
525
+ export function scaleTime() {
526
+ let domain = [0, 1];
527
+ let range = [0, 1];
528
+ let _clamp = false;
529
+ function scale(x) {
530
+ const d0 = domain[0];
531
+ const d1 = domain[domain.length - 1];
532
+ const r0 = range[0];
533
+ const r1 = range[range.length - 1];
534
+ if (d0 === d1) {
535
+ return r0;
536
+ }
537
+ let t = (x - d0) / (d1 - d0);
538
+ if (_clamp) t = Math.max(0, Math.min(1, t));
539
+ return r0 + t * (r1 - r0);
540
+ }
541
+ scale.domain = function (d) {
542
+ if (d === undefined) return domain.slice();
543
+ domain = sanitizeDomain(d);
544
+ return scale;
545
+ };
546
+ scale.range = function (r) {
547
+ if (r === undefined) return range.slice();
548
+ range = r.slice();
549
+ return scale;
550
+ };
551
+ scale.invert = function (y) {
552
+ const d0 = domain[0];
553
+ const d1 = domain[domain.length - 1];
554
+ const r0 = range[0];
555
+ const r1 = range[range.length - 1];
556
+ return d0 + (y - r0) / (r1 - r0) * (d1 - d0);
557
+ };
558
+ scale.ticks = function (count = 10) {
559
+ const d0 = domain[0];
560
+ const d1 = domain[domain.length - 1];
561
+ if (d0 === d1) return [d0];
562
+ const step = tickStep(d0, d1, count);
563
+ const ticks = [];
564
+ let i = Math.floor(d0 / step);
565
+ const maxI = Math.ceil(d1 / step);
566
+ while (i <= maxI) {
567
+ ticks.push(i * step);
568
+ i++;
569
+ }
570
+ return ticks;
571
+ };
572
+ scale.nice = function (count = 10) {
573
+ const d0 = domain[0];
574
+ const d1 = domain[domain.length - 1];
575
+ if (d0 === d1) return scale;
576
+ const step = tickIncrement(d0, d1, count);
577
+ if (step > 0) {
578
+ domain = [Math.floor(d0 / step) * step, Math.ceil(d1 / step) * step];
579
+ }
580
+ return scale;
581
+ };
582
+ scale.clamp = function (c) {
583
+ if (c === undefined) return _clamp;
584
+ _clamp = c;
585
+ return scale;
586
+ };
587
+ return scale;
588
+ }
@@ -62,8 +62,10 @@ class CityBuildModel extends _BaseModel.default {
62
62
  return commonBufferInfo;
63
63
  }
64
64
  calCityGeo() {
65
- // @ts-ignore
66
- const [minLng, minLat, maxLng, maxLat] = this.layer.getSource().extent;
65
+ // 当启用 enableRelativeCoordinates 时,使用 originalExtent(原始绝对坐标范围)
66
+ const originalExtent = this.layer.getOriginalExtent();
67
+ const extent = originalExtent[0] !== 0 || originalExtent[2] !== 0 ? originalExtent : this.layer.getSource().extent;
68
+ const [minLng, minLat, maxLng, maxLat] = extent;
67
69
  const w = maxLng - minLng;
68
70
  const h = maxLat - minLat;
69
71
  this.cityCenter = [(maxLng + minLng) / 2, (maxLat + minLat) / 2];
@@ -967,12 +967,12 @@ class BaseLayer extends _eventemitter.EventEmitter {
967
967
  return this.styleAttributeService.getLayerAttributeScale(name);
968
968
  }
969
969
  getLegend(name) {
970
- var _attribute$scale, _scales$, _attribute$scale2;
970
+ var _attribute$scale, _scales$, _scales$2;
971
971
  const attribute = this.styleAttributeService.getLayerStyleAttribute(name);
972
972
  const scales = (attribute === null || attribute === void 0 || (_attribute$scale = attribute.scale) === null || _attribute$scale === void 0 ? void 0 : _attribute$scale.scalers) || [];
973
973
  return {
974
974
  type: (_scales$ = scales[0]) === null || _scales$ === void 0 || (_scales$ = _scales$.option) === null || _scales$ === void 0 ? void 0 : _scales$.type,
975
- field: attribute === null || attribute === void 0 || (_attribute$scale2 = attribute.scale) === null || _attribute$scale2 === void 0 ? void 0 : _attribute$scale2.field,
975
+ field: (_scales$2 = scales[0]) === null || _scales$2 === void 0 ? void 0 : _scales$2.field,
976
976
  items: this.getLegendItems(name)
977
977
  };
978
978
  }
@@ -1216,7 +1216,7 @@ class BaseLayer extends _eventemitter.EventEmitter {
1216
1216
  * 继承空方法
1217
1217
  * @param time
1218
1218
  */
1219
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1219
+
1220
1220
  setEarthTime(time) {
1221
1221
  console.warn('empty fn');
1222
1222
  }
@@ -46,7 +46,9 @@ class BaseLayerPickService {
46
46
  const container = this.layer.getContainer();
47
47
  const pickingService = container.pickingService;
48
48
  const mapService = container.mapService;
49
- const extent = this.layer.getSource().extent;
49
+ // 当启用 enableRelativeCoordinates 时,使用 originalExtent 判断绝对坐标是否在范围内
50
+ const originalExtent = this.layer.getOriginalExtent();
51
+ const extent = originalExtent[0] !== 0 || originalExtent[2] !== 0 ? originalExtent : this.layer.getSource().extent;
50
52
  const isPick = (0, _l7Utils.lngLatInExtent)(target.lngLat, extent);
51
53
  const layerTarget = {
52
54
  x: target.x,
@@ -18,8 +18,9 @@ export declare enum ShapeType2D {
18
18
  * 生成规则多边形顶点个数
19
19
  * @param pointCount 顶点个数 3 => 三角形
20
20
  * @param start 顶点起始角度 调整图形的方向
21
+ * @param angleOffset 额外的角度偏移,用于调整六边形方向
21
22
  */
22
- export declare function polygonPath(pointCount: number, start?: number): IPath;
23
+ export declare function polygonPath(pointCount: number, start?: number, angleOffset?: number): IPath;
23
24
  export declare function circle(): IPath;
24
25
  export declare function square(): IPath;
25
26
  export declare function triangle(): IPath;
@@ -31,16 +31,17 @@ let ShapeType2D = exports.ShapeType2D = /*#__PURE__*/function (ShapeType2D) {
31
31
  * 生成规则多边形顶点个数
32
32
  * @param pointCount 顶点个数 3 => 三角形
33
33
  * @param start 顶点起始角度 调整图形的方向
34
+ * @param angleOffset 额外的角度偏移,用于调整六边形方向
34
35
  */
35
- function polygonPath(pointCount, start = 0) {
36
+ function polygonPath(pointCount, start = 0, angleOffset = Math.PI / 4) {
36
37
  const step = Math.PI * 2 / pointCount;
37
38
  const line = [];
38
39
  for (let i = 0; i < pointCount; i++) {
39
40
  line.push(step * i + start * Math.PI / 12);
40
41
  }
41
42
  const path = line.map(t => {
42
- const x = Math.sin(t + Math.PI / 4);
43
- const y = Math.cos(t + Math.PI / 4);
43
+ const x = Math.sin(t + angleOffset);
44
+ const y = Math.cos(t + angleOffset);
44
45
  return [x, y, 0];
45
46
  });
46
47
  // path.push(path[0]);
@@ -56,7 +57,12 @@ function triangle() {
56
57
  return polygonPath(3);
57
58
  }
58
59
  function hexagon() {
59
- return polygonPath(6, 1);
60
+ // 生成 pointy-top 六边形(尖角朝上)
61
+ // 使用 angleOffset = 0 并翻转 y 方向,以匹配 d3-hexbin 的方向
62
+ // d3-hexbin 在屏幕坐标系中 y 向下为正,使用 y = -cos(angle)
63
+ // 我们需要翻转 y 坐标以确保蜂窝网格闭合
64
+ const path = polygonPath(6, 0, 0);
65
+ return path.map(p => [p[0], -p[1], p[2]]);
60
66
  }
61
67
  function pentagon() {
62
68
  return polygonPath(5);