Skip to content

Commit 6fc23f7

Browse files
[fix]ol 高效率点击图层 review by songym
1 parent 5d35085 commit 6fc23f7

File tree

2 files changed

+124
-22
lines changed

2 files changed

+124
-22
lines changed

src/openlayers/overlay/Graphic.js

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,29 +84,38 @@ export class Graphic extends ImageCanvasSource {
8484

8585
if (options.onClick) {
8686
me.map.on('click', function(e) {
87-
if (me.renderer instanceof GraphicWebGLRenderer) {
88-
return;
89-
}
90-
const features = me.map.getFeaturesAtPixel(e.pixel) || [];
91-
for (let index = 0; index < features.length; index++) {
92-
const graphic = features[index];
93-
if (me.graphics.indexOf(graphic) > -1) {
94-
options.onClick(graphic, e);
95-
if (me.isHighLight) {
96-
me._highLight(
97-
graphic.getGeometry().getCoordinates(),
98-
new Style({
99-
image: graphic.getStyle()
100-
}).getImage(),
101-
graphic,
102-
e.pixel
103-
);
104-
}
105-
break;
106-
}
107-
}
87+
if (me.isDeckGLRender) {
88+
const params = me.renderer.deckGL.pickObject({ x: e.pixel[0], y: e.pixel[1] });
89+
options.onClick(params);
90+
return;
91+
}
92+
const graphic = me.findGraphicByPixel(e, me);
93+
if (graphic) {
94+
options.onClick(graphic, e);
95+
if (me.isHighLight) {
96+
me._highLight(
97+
graphic.getGeometry().getCoordinates(),
98+
new Style({
99+
image: graphic.getStyle()
100+
}).getImage(),
101+
graphic,
102+
e.pixel
103+
);
104+
}
105+
106+
}
108107
});
109108
}
109+
110+
me.map.on('pointermove', function(e) {
111+
if (me.isDeckGLRender) {
112+
const params = me.renderer.deckGL.pickObject({ x: e.pixel[0], y: e.pixel[1] });
113+
if (options.onHover) {
114+
options.onHover(params);
115+
}
116+
}
117+
});
118+
110119
//eslint-disable-next-line no-unused-vars
111120
function canvasFunctionInternal_(extent, resolution, pixelRatio, size, projection) {
112121
var mapWidth = size[0] / pixelRatio;
@@ -124,6 +133,13 @@ export class Graphic extends ImageCanvasSource {
124133
me.renderer._clearBuffer();
125134
me.renderer.selected = this.selected;
126135
me.renderer.drawGraphics(graphics);
136+
me.isDeckGLRender = me.renderer instanceof GraphicWebGLRenderer;
137+
if(me.isDeckGLRender){
138+
if (!me.context) {
139+
me.context = Util.createCanvasContext2D(mapWidth, mapHeight);
140+
}
141+
return me.context.canvas;
142+
}
127143
return me.renderer.getCanvas();
128144
}
129145

@@ -179,7 +195,7 @@ export class Graphic extends ImageCanvasSource {
179195
for (let i = graphics.length - 1; i >= 0; i--) {
180196
let style = graphics[i].getStyle();
181197
if (!style) {
182-
return;
198+
return;
183199
}
184200
//已经被高亮的graphics 不被选选中
185201
if (style instanceof HitCloverShape) {
@@ -239,6 +255,17 @@ export class Graphic extends ImageCanvasSource {
239255
}
240256
}
241257

258+
findGraphicByPixel(e, me) {
259+
const features = me.map.getFeaturesAtPixel(e.pixel) || [];
260+
for (let index = 0; index < features.length; index++) {
261+
const graphic = features[index];
262+
if (me.graphics.indexOf(graphic) > -1) {
263+
return graphic;
264+
}
265+
}
266+
return undefined;
267+
}
268+
242269
/**
243270
* @function Graphic.prototype.setGraphics
244271
* @description 设置绘制的点要素,会覆盖之前的所有要素。

test/openlayers/overlay/GraphicSpec.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,5 +649,80 @@ describe('openlayers_GraphicLayer', () => {
649649
done();
650650
}
651651
});
652+
});
653+
it('onCLick', (done) => {
654+
map = new Map({
655+
target: 'map',
656+
view: new View({
657+
center: [0, 0],
658+
zoom: 2,
659+
projection: 'EPSG:4326'
660+
}),
661+
renderer: ['canvas']
652662
});
663+
var graphics = [new GraphicObj(new Point([0, 0]))];
664+
var graphicStyle = {
665+
color: [0, 255, 128, 255],
666+
highlightColor: [255, 0, 0, 255],
667+
radius: 20
668+
};
669+
graphicLayer = new ImageLayer({
670+
source: new GraphicSource({
671+
render: 'webgl',
672+
graphics: graphics,
673+
color: graphicStyle.color,
674+
highlightColor: graphicStyle.highlightColor,
675+
radius: graphicStyle.radius,
676+
map: map,
677+
onClick: function (graphic) {
678+
if (graphic) {
679+
graphic.lngLat;
680+
}
681+
},
682+
onHover: function (graphic) {
683+
if (graphic) {
684+
graphic.lngLat;
685+
}
686+
}
687+
})
688+
});
689+
map.addLayer(graphicLayer);
690+
const viewport = map.getViewport();
691+
const key = graphicLayer.on('postrender', function () {
692+
const source = graphicLayer.getSource();
693+
if (source.renderer) {
694+
unByKey(key);
695+
source.isDeckGLRender = true;
696+
source._forEachFeatureAtCoordinate([0, 0], 1, (result) => {
697+
expect(result).not.toBeNull();
698+
});
699+
const res = source.findGraphicByPixel({ pixel: [0, 0] }, source);
700+
expect(res).toBeUndefined();
701+
702+
spyOn(map, 'getFeaturesAtPixel').and.callFake(() => graphics);
703+
const res1 = source.findGraphicByPixel({ pixel: [0, 0] }, source);
704+
expect(res1).not.toBeUndefined();
705+
706+
let pixel = map.getPixelFromCoordinate([0, 0]);
707+
map.forEachFeatureAtPixel(pixel, (graphic, layer) => {
708+
expect(graphic).toBe(graphics[0]);
709+
expect(layer).toBe(graphicLayer);
710+
});
711+
source.renderer = { _clearBuffer: () => {}, deckGL: { pickObject: () => ({}) } };
712+
viewport.dispatchEvent(new Event('pointermove'));
713+
714+
const event = new Event('click');
715+
event.pixel = [0, 0];
716+
// ol内部对target属性赋值了, 但是原生Event不能被赋值
717+
Object.defineProperty(event, "target", {
718+
value : null,
719+
writable : true,
720+
enumerable : true,
721+
configurable : true
722+
});
723+
map.dispatchEvent(event);
724+
done();
725+
}
726+
});
727+
});
653728
});

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy