Skip to content

Commit 5cee6e0

Browse files
[fix]deckgl高效率点击图层缩放渲染两次,点击事件卡顿 review by songym
1 parent 5ef3d16 commit 5cee6e0

File tree

2 files changed

+41
-63
lines changed

2 files changed

+41
-63
lines changed

src/openlayers/overlay/Graphic.js

Lines changed: 35 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import * as olExtent from 'ol/extent';
1717
import Polygon from 'ol/geom/Polygon';
1818
import Point from 'ol/geom/Point';
1919
import ImageLayer from 'ol/layer/Image';
20-
import { transform } from 'ol/proj';
2120

2221
const defaultProps = {
2322
color: [0, 0, 0, 255],
@@ -85,42 +84,38 @@ export class Graphic extends ImageCanvasSource {
8584

8685
if (options.onClick) {
8786
me.map.on('click', function(e) {
88-
const graphic = me.findGraphicByPixel(e, me);
89-
if (graphic) {
90-
if (me.isDeckGLRender) {
91-
const params = me.getDeckglArguments(me, e, graphic);
92-
options.onClick(params);
93-
} else {
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-
}
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+
);
105104
}
106-
107-
}
105+
106+
}
108107
});
109108
}
110-
if (options.onHover || options.highlightColor) {
109+
111110
me.map.on('pointermove', function(e) {
112-
const graphic = me.findGraphicByPixel(e, me);
113-
if (graphic) {
114-
if (me.isDeckGLRender) {
115-
if (options.highlightColor) {
116-
me.renderer.deckGL.pickObject({ x: e.pixel[0], y: e.pixel[1] });
117-
}
118-
const params = me.getDeckglArguments(me, e, graphic);
119-
options.onHover && options.onHover(params);
120-
}
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);
121115
}
116+
}
122117
});
123-
}
118+
124119
//eslint-disable-next-line no-unused-vars
125120
function canvasFunctionInternal_(extent, resolution, pixelRatio, size, projection) {
126121
var mapWidth = size[0] / pixelRatio;
@@ -139,6 +134,12 @@ export class Graphic extends ImageCanvasSource {
139134
me.renderer.selected = this.selected;
140135
me.renderer.drawGraphics(graphics);
141136
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+
}
142143
return me.renderer.getCanvas();
143144
}
144145

@@ -193,7 +194,7 @@ export class Graphic extends ImageCanvasSource {
193194
me._highLightClose();
194195
for (let i = graphics.length - 1; i >= 0; i--) {
195196
let style = graphics[i].getStyle();
196-
if (!me.isDeckGLRender && !style) {
197+
if (!style) {
197198
return;
198199
}
199200
//已经被高亮的graphics 不被选选中
@@ -229,7 +230,7 @@ export class Graphic extends ImageCanvasSource {
229230
if (geo.intersectsCoordinate(this.map.getCoordinateFromPixel(evtPixel))) {
230231
contain = true;
231232
}
232-
} else if (image) {
233+
} else {
233234
let extent = [];
234235
extent[0] = center[0] - image.getAnchor()[0] * resolution;
235236
extent[2] = center[0] + image.getAnchor()[0] * resolution;
@@ -238,15 +239,6 @@ export class Graphic extends ImageCanvasSource {
238239
if (olExtent.containsCoordinate(extent, coordinate)) {
239240
contain = true;
240241
}
241-
} else {
242-
let extent = [];
243-
extent[0] = center[0] - me._options.radius * resolution;
244-
extent[2] = center[0] + me._options.radius * resolution;
245-
extent[1] = center[1] - me._options.radius * resolution;
246-
extent[3] = center[1] + me._options.radius * resolution;
247-
if (olExtent.containsCoordinate(extent, coordinate)) {
248-
contain = true;
249-
}
250242
}
251243

252244
if (contain === true) {
@@ -274,24 +266,6 @@ export class Graphic extends ImageCanvasSource {
274266
return undefined;
275267
}
276268

277-
getDeckglArguments(me, e, graphic) {
278-
const view = me.map.getView();
279-
const projection = view.getProjection().getCode();
280-
return {
281-
object: graphic,
282-
layer: me.renderer._renderLayer,
283-
pixel: e.pixel,
284-
x: e.pixel[0],
285-
y: e.pixel[1],
286-
pixelRatio: me.renderer.pixelRatio,
287-
lngLat: transform(graphic.getGeometry().getCoordinates(), projection, 'EPSG:4326'),
288-
picked: true,
289-
index:1,
290-
color: me._options.color,
291-
devicePixel: e.devicePixel
292-
}
293-
}
294-
295269
/**
296270
* @function Graphic.prototype.setGraphics
297271
* @description 设置绘制的点要素,会覆盖之前的所有要素。
@@ -530,7 +504,7 @@ export class Graphic extends ImageCanvasSource {
530504
this.map.removeLayer(this.hitGraphicLayer);
531505
this.hitGraphicLayer = null;
532506
}
533-
!this.isDeckGLRender && this.changed();
507+
this.changed();
534508
}
535509

536510
/**

test/openlayers/overlay/GraphicSpec.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -673,13 +673,17 @@ describe('openlayers_GraphicLayer', () => {
673673
const source = graphicLayer.getSource();
674674
if (source.renderer) {
675675
unByKey(key);
676+
source.isDeckGLRender = true;
676677
source._forEachFeatureAtCoordinate([0, 0], 1, (result) => {
677678
expect(result).not.toBeNull();
678679
});
679680
const res = source.findGraphicByPixel({ pixel: [0, 0] }, source);
680681
expect(res).toBeUndefined();
681-
const res1 = source.getDeckglArguments(source, { pixel: [0, 0] }, graphics[0]);
682-
expect(res1).not.toBeNull();
682+
683+
spyOn(map, 'getFeaturesAtPixel').and.callFake(()=> graphics);
684+
const res1 = source.findGraphicByPixel({ pixel: [0, 0] }, source);
685+
expect(res1).not.toBeUndefined();
686+
683687
let pixel = map.getPixelFromCoordinate([0, 0]);
684688
map.forEachFeatureAtPixel(pixel, (graphic, layer) => {
685689
expect(graphic).toBe(graphics[0]);

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