Skip to content

Commit a3ed852

Browse files
[fix]maplibre-l7多坐标系
1 parent 13702c5 commit a3ed852

File tree

3 files changed

+173
-18
lines changed

3 files changed

+173
-18
lines changed

src/maplibregl/overlay/L7/l7-render.js

Lines changed: 11 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/maplibregl/overlay/L7Layer.js

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,51 @@ export class L7Layer extends L7LayerBase {
2727
this.l7layer = new L7[type]({ ...options, name: this.id });
2828
this.setDataFn = this.l7layer.setData.bind(this.l7layer);
2929
}
30+
this.overlay = true;
31+
}
32+
/**
33+
* @function L7Layer.prototype.getL7Layer
34+
* @description 获取@antv/L7的layer实例。
35+
* @returns {Object} @antv/L7的layer实例。
36+
*/
37+
getL7Layer() {
38+
return this.l7layer;
39+
}
40+
41+
/**
42+
* @function L7Layer.prototype.reRender
43+
* @description 当修改@antv/L7的layer的配置时,重新渲染。
44+
*/
45+
reRender() {
46+
if (this.scene && this.scene.getLayer(this.l7layer.id)) {
47+
this.scene.layerService.renderLayer(this.l7layer.id);
48+
}
49+
this.map && this.map.triggerRepaint();
50+
}
51+
52+
moveLayer(id, beforeId) {
53+
this.map.style.moveLayer(id, beforeId);
54+
}
55+
56+
setVisibility(visibility) {
57+
if (this.animateStatus) {
58+
this.cancelAnimationFrame();
59+
}
60+
visibility ? this.l7layer.show() : this.l7layer.hide();
61+
this.map.style.setLayoutProperty(this.id, 'visibility', visibility ? 'visible' : 'none');
62+
}
63+
addSceneLayer(scene) {
64+
this.scene = scene;
65+
this.scene.addLayer(this.l7layer);
66+
this.updateSourceEffect();
67+
}
68+
69+
updateSourceEffect() {
70+
const source = this.l7layer.getSource();
71+
source &&
72+
source.on('update', () => {
73+
this.reRender();
74+
});
3075
}
3176

3277
onAdd(map) {
@@ -36,10 +81,10 @@ export class L7Layer extends L7LayerBase {
3681
map.$l7scene = scene;
3782
scene.on('loaded', () => {
3883
this.addSceneLayer(scene);
39-
})
84+
});
4085
return;
4186
}
42-
this.addSceneLayer(map.$l7scene)
87+
this.addSceneLayer(map.$l7scene);
4388
}
4489

4590
_getL7Filter(filter) {

test/maplibregl/overlay/L7LayerSpec.js

Lines changed: 115 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,32 @@ var url = GlobeParameter.ChinaURL + '/zxyTileImage.png?z={z}&x={x}&y={y}';
88

99
describe('maplibregl_L7Layer', () => {
1010
var originalTimeout;
11-
var testDiv, map, getL7Scene, setLayoutProperty,removeLayer;
11+
var testDiv, map, getL7Scene, setLayoutProperty, removeLayer;
1212
var data = [
1313
{
1414
id: '5011000000404',
1515
name: '铁路新村(华池路)',
1616
longitude: 121.4316962,
1717
latitude: 31.26082325,
1818
unit_price: 71469.4,
19-
count: 2
19+
count: 2,
20+
v: 100
2021
}
2122
];
2223
beforeAll((done) => {
2324
getL7Scene = maplibregl.Map.prototype.getL7Scene;
2425
setLayoutProperty = maplibregl.Map.prototype.setLayoutProperty;
2526
removeLayer = maplibregl.Map.prototype.removeLayer;
2627
mbglmap.prototype.getL7Scene = getL7Scene;
28+
mbglmap.prototype.setLayoutProperty = setLayoutProperty;
2729

2830
spyOn(maplibregl, 'Map').and.callFake(mbglmap);
2931

3032
spyOn(L7, 'PointLayer').and.callFake(mockL7.PointLayer);
3133
spyOn(L7, 'GeometryLayer').and.callFake(mockL7.GeometryLayer);
34+
spyOn(L7, 'HeatmapLayer').and.callFake(mockL7.HeatmapLayer);
3235
spyOn(L7, 'Scene').and.callFake(mockL7.Scene);
3336
spyOn(L7, 'Maplibre').and.callFake(mockL7.Maplibre);
34-
3537
testDiv = window.document.createElement('div');
3638
testDiv.setAttribute('id', 'map');
3739
testDiv.style.styleFloat = 'left';
@@ -83,14 +85,16 @@ describe('maplibregl_L7Layer', () => {
8385
document.body.removeChild(testDiv);
8486
map = null;
8587
});
88+
8689
it('getL7Scene', (done) => {
8790
map.getL7Scene().then((scene) => {
8891
expect(scene).not.toBeNull();
8992
map.$l7scene = null;
9093
done();
9194
});
9295
});
93-
it('getL7Scene', (done) => {
96+
97+
it('getL7Scene1', (done) => {
9498
var layer = new L7Layer({ type: 'PointLayer' });
9599
var l7Layer = layer.getL7Layer();
96100
l7Layer
@@ -111,6 +115,7 @@ describe('maplibregl_L7Layer', () => {
111115
map.$l7scene = null;
112116
done();
113117
});
118+
expect(layer.isSourceLoaded()).toBeTruthy();
114119
});
115120

116121
it('PointLayer', (done) => {
@@ -272,7 +277,6 @@ describe('maplibregl_L7Layer', () => {
272277
expect(map.style.setLayoutProperty).toHaveBeenCalled();
273278
expect(layer.animateStatus).toBeFalsy();
274279

275-
276280
map.setLayoutProperty(layer.id, 'visibility', 'visible');
277281
expect(l7Layer.show).toHaveBeenCalled();
278282
expect(map.style.setLayoutProperty).toHaveBeenCalled();
@@ -299,15 +303,17 @@ describe('maplibregl_L7Layer', () => {
299303
map.addLayer(layer);
300304
map.style.fire = () => {};
301305
map.style.setLayoutProperty = () => {};
306+
302307
map.overlayLayersManager = { [layer.id]: layer };
303308
expect(l7Layer).not.toBeNull();
304309
map.setLayoutProperty = setLayoutProperty;
310+
305311
spyOn(l7Layer, 'show');
306312
spyOn(l7Layer, 'hide');
307313
spyOn(map.style, 'setLayoutProperty');
308314
expect(layer.animateStatus).toBeTruthy();
309315

310-
map.setLayoutProperty(layer.id, 'visibility', 'hidden');
316+
map.setLayoutProperty(layer.id, 'visibility', 'none');
311317
expect(l7Layer.hide).toHaveBeenCalled();
312318
expect(map.style.setLayoutProperty).toHaveBeenCalled();
313319
expect(layer.animateStatus).toBeFalsy();
@@ -318,6 +324,109 @@ describe('maplibregl_L7Layer', () => {
318324

319325
done();
320326
});
327+
it('HeatmapLayer grid updateSource', (done) => {
328+
var layer = new L7Layer({ type: 'HeatmapLayer' });
329+
var l7Layer = layer.getL7Layer();
330+
l7Layer
331+
.source(data, {
332+
parser: {
333+
type: 'json',
334+
x: 'longitude',
335+
y: 'latitude'
336+
},
337+
transforms: [
338+
{
339+
type: 'grid',
340+
size: 2000000,
341+
field: 'v',
342+
method: 'sum'
343+
}
344+
]
345+
})
346+
.shape('circle')
347+
.active(true)
348+
.animate(true)
349+
.size(56)
350+
.color('#4cfd47');
351+
map.addLayer(layer);
352+
spyOn(layer, 'reRender');
353+
l7Layer.setData(data, {
354+
parser: {
355+
type: 'json',
356+
x: 'j',
357+
y: 'w'
358+
},
359+
transforms: [
360+
{
361+
type: 'grid',
362+
size: 200000,
363+
field: 'v',
364+
method: 'sum'
365+
}
366+
]
367+
});
368+
expect(l7Layer).not.toBeNull();
369+
expect(layer.reRender).toHaveBeenCalled();
370+
done();
371+
});
372+
373+
it('mvt layer', (done) => {
374+
var layer = new L7Layer({ type: 'PointLayer' });
375+
var l7Layer = layer.getL7Layer();
376+
l7Layer
377+
.source('http://localhost:8190/zhejiang.mbtiles/{z}/{x}/{y}.pbf', {
378+
parser: {
379+
type: 'mvt',
380+
tileSize: 256,
381+
zoomOffset: 0,
382+
maxZoom: 9,
383+
extent: [-180, -85.051129, 179, 85.051129]
384+
}
385+
})
386+
.shape('circle')
387+
.color('#4cfd47');
388+
map.addLayer(layer);
389+
map.style.fire = () => {};
390+
map.style.setLayoutProperty = () => {};
391+
392+
map.overlayLayersManager = { [layer.id]: layer };
393+
expect(layer.sourceId).toBe(layer.id);
394+
const layerSource = layer.getSource(layer.id);
395+
expect(layerSource.type).toBe('vector');
396+
let features;
397+
const result = {
398+
cb: function (data) {
399+
features = data;
400+
}
401+
};
402+
spyOn(result, 'cb').and.callThrough();
403+
layer.queryRenderedFeatures([0, 0], {}, result.cb);
404+
expect(result.cb.calls.count()).toBe(1);
405+
expect(features).not.toBeUndefined();
406+
expect(layer.querySourceFeatures().length).toBeGreaterThan(0);
407+
408+
layer = new L7Layer({ type: 'PointLayer', options: { layerID: 'empty-test' } });
409+
l7Layer = layer.getL7Layer();
410+
l7Layer
411+
.source('http://localhost:8190/zhejiang.mbtiles/{z}/{x}/{y}.pbf', {
412+
parser: {
413+
type: 'mvt',
414+
tileSize: 256,
415+
zoomOffset: 0,
416+
maxZoom: 9,
417+
extent: [-180, -85.051129, 179, 85.051129]
418+
}
419+
})
420+
.shape('circle')
421+
.color('#4cfd47');
422+
map.addLayer(layer);
423+
expect(layer.isSourceLoaded()).toBeFalsy();
424+
425+
map.overlayLayersManager = { [layer.id]: layer };
426+
l7Layer.rawConfig.name = 'empty-test';
427+
expect(layer.querySourceFeatures().length).toBe(0);
428+
done();
429+
});
321430

322431
it('extend custom overlayLayer base', (done) => {
323432
const paint = {

0 commit comments

Comments
 (0)