Skip to content

Commit d3eca96

Browse files
committed
【feature】mapboxgl querySourceFeatures 统一返回的结构 geoJSON
1 parent 86feffa commit d3eca96

File tree

3 files changed

+67
-13
lines changed

3 files changed

+67
-13
lines changed

src/mapboxgl/overlay/L7Layer.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -309,23 +309,28 @@ export class L7Layer extends CustomOverlayLayer {
309309
const _this = this;
310310
this.l7layer.boxSelect([Math.min(x1, x2), Math.min(y1, y2), Math.max(x1, x2), Math.max(y1, y2)], (features) => {
311311
const nextFeatures = features || [];
312-
cb(
313-
nextFeatures.map((item) => {
314-
return {
315-
...item,
316-
layer: _this.getLayer()
317-
};
318-
})
319-
);
312+
const { layerCapture = true } = options || {};
313+
if (layerCapture) {
314+
cb(
315+
nextFeatures.map((item) => {
316+
return {
317+
...item,
318+
layer: _this.getLayer()
319+
};
320+
})
321+
);
322+
return;
323+
}
324+
cb(nextFeatures);
320325
});
321326
}
322327

323328
querySourceFeatures() {
324329
if (!this.l7layer || !this.l7layer.rawConfig.visible) {
325330
return [];
326331
}
327-
const layerSource = this.l7layer.layerSource;
328-
let datas = layerSource.data.dataArray;
332+
const { layerSource, pickingService } = this.l7layer;
333+
let datas = pickingService.handleRawFeature(layerSource.data.dataArray);
329334
const { parser: { type } } = layerSource;
330335
if (type === 'mvt') {
331336
const { tileset: { cacheTiles = [] } = {} } = layerSource;
@@ -339,7 +344,7 @@ export class L7Layer extends CustomOverlayLayer {
339344
(!(item.properties || {})[featureId] ||
340345
!mvtDatas.some((feature) => feature.properties[featureId] === item.properties[featureId]))
341346
);
342-
mvtDatas.push(...features);
347+
mvtDatas.push(...pickingService.handleRawFeature(features));
343348
});
344349
datas = datas.length > mvtDatas.length ? datas : mvtDatas;
345350
}
@@ -351,7 +356,7 @@ export class L7Layer extends CustomOverlayLayer {
351356
[0, 0],
352357
[this.map.transform.width - 1, this.map.transform.height - 1] // -1 是解决报错问题
353358
];
354-
this.queryRenderedFeatures(bounds, undefined, cb);
359+
this.queryRenderedFeatures(bounds, { layerCapture: false }, cb);
355360
}
356361
return datas;
357362
}

test/mapboxgl/overlay/L7LayerSpec.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,14 @@ describe('mapboxgl L7Layer', () => {
519519
expect(queryResult.cb.calls.count()).toBe(1);
520520
expect(queryFeatures).not.toBeUndefined();
521521
expect(queryFeatures.length).toBeGreaterThan(0);
522-
expect(layer.querySourceFeatures().length).toBeGreaterThan(0);
522+
expect(queryFeatures[0].geometry).not.toBeUndefined();
523+
expect(queryFeatures[0].properties).not.toBeUndefined();
524+
expect(queryFeatures[0].layer).not.toBeUndefined();
525+
const sourceFeatures = layer.querySourceFeatures();
526+
expect(sourceFeatures.length).toBeGreaterThan(0);
527+
expect(sourceFeatures[0].geometry).not.toBeUndefined();
528+
expect(sourceFeatures[0].properties).not.toBeUndefined();
529+
expect(sourceFeatures[0].layer).toBeUndefined();
523530
expect(layer.getLayer().layout.visibility).toBe('visible');
524531
layer.setLayoutProperty('visibility', 'none');
525532
expect(layer.getLayer().layout.visibility).toBe('none');

test/tool/mock_l7.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,54 @@ class Layer {
5757
dataArray: []
5858
}
5959
};
60+
this.pickingService = {
61+
handleRawFeature: function (rawFeature) {
62+
rawFeature = rawFeature instanceof Array ? rawFeature : [rawFeature];
63+
const res = rawFeature.map((item) => {
64+
if (item === 'null') {
65+
return item;
66+
}
67+
if (item.type === 'Feature') {
68+
return item;
69+
}
70+
const newFeature = {
71+
properties: {},
72+
geometry: { type: '', coordinates: [] },
73+
};
74+
const coordinates = item.coordinates;
75+
delete item.coordinates;
76+
newFeature.properties = item;
77+
if (coordinates) {
78+
newFeature.geometry = { type: '', coordinates };
79+
}
80+
return newFeature;
81+
});
82+
return res;
83+
}
84+
}
6085
if (this.rawConfig.visible === void 0) {
6186
this.rawConfig.visible = true;
6287
}
6388
}
6489
source(data, options = {}) {
6590
const parser = options.parser || { type: "geojson" };
91+
let dataArray = [];
92+
if (parser.type === "geojson") {
93+
dataArray = data;
94+
}
95+
if (parser.type === 'json') {
96+
dataArray = [
97+
{
98+
航班有效期结束: 2016.11,
99+
到达城市: '北京',
100+
smpid: 1,
101+
coordinates: [
102+
[80.30091874, 41.26940127],
103+
[116.395645, 39.92998578]
104+
]
105+
}
106+
];
107+
}
66108
this.layerSource = {
67109
...options,
68110
parser,

0 commit comments

Comments
 (0)