Skip to content

VectorLayer support progressive Render #2169

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jan 10, 2024
Merged
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,5 @@ build/Release
# Dependency directory
# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
node_modules
debug
debug
debug1
4 changes: 4 additions & 0 deletions src/geometry/Geometry.js
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,10 @@ class Geometry extends JSONAble(Eventable(Handlerable(Class))) {
}

_getPainter() {
//for performance
if (this._painter) {
return this._painter;
}
const layer = this.getLayer();
if (!this._painter && layer) {
if (GEOMETRY_COLLECTION_TYPES.indexOf(this.type) !== -1) {
Expand Down
11 changes: 11 additions & 0 deletions src/geometry/GeometryCollection.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,17 @@ class GeometryCollection extends Geometry {
return false;
}

// fix #2177 GeometryCollection hitTolerance always is 0
_hitTestTolerance() {
const geometries = this.getGeometries();
let hitTolerance = 0;
for (let i = 0, len = geometries.length; i < len; i++) {
const t = geometries[i]._hitTestTolerance();
hitTolerance = Math.max(hitTolerance, t);
}
return hitTolerance;
}

_computeExtent(projection) {
return computeExtent.call(this, projection, '_computeExtent');
}
Expand Down
2 changes: 2 additions & 0 deletions src/geometry/Marker.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class Marker extends CenterMixin(Geometry) {
constructor(coordinates, opts) {
super(opts);
this.type = 'Point';
//for subclass,Quickly determine whether a Geometry is a point
this.isPoint = true;
if (coordinates) {
this.setCoordinates(coordinates);
}
Expand Down
37 changes: 30 additions & 7 deletions src/layer/VectorLayer.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Browser from '../core/Browser';
import { isNil } from '../core/util';
import { isNil, isNumber } from '../core/util';
import Extent from '../geo/Extent';
import Geometry from '../geometry/Geometry';
import OverlayLayer from './OverlayLayer';
Expand Down Expand Up @@ -29,6 +29,9 @@ const TEMP_EXTENT = new PointExtent();
* @property {Number} [options.collisionBufferSize=2] - collision buffer size
* @property {Number} [options.collisionDelay=250] - collision delay time when map Interacting
* @property {String} [options.collisionScope=layer] - Collision range:layer or map
* @property {Boolean} [options.progressiveRender=false] - progressive Render
* @property {Number} [options.progressiveRenderCount=1000] - progressive Render page size
* @property {Boolean} [options.progressiveRenderDebug=false] - progressive Render debug
* @memberOf VectorLayer
* @instance
*/
Expand All @@ -48,7 +51,10 @@ const options = {
'collision': false,
'collisionBufferSize': 2,
'collisionDelay': 250,
'collisionScope': 'layer'
'collisionScope': 'layer',
'progressiveRender': false,
'progressiveRenderCount': 1000,
'progressiveRenderDebug': false
};
// Polyline is for custom line geometry
// const TYPES = ['LineString', 'Polyline', 'Polygon', 'MultiLineString', 'MultiPolygon'];
Expand Down Expand Up @@ -123,6 +129,9 @@ class VectorLayer extends OverlayLayer {
}

_hitGeos(geometries, cp, options = {}) {
if (!geometries || !geometries.length) {
return [];
}
const filter = options['filter'],
hits = [];
const tolerance = options['tolerance'];
Expand All @@ -131,10 +140,16 @@ class VectorLayer extends OverlayLayer {
const imageData = renderer && renderer.getImageData && renderer.getImageData();
if (imageData) {
let hitTolerance = 0;
for (let i = geometries.length - 1; i >= 0; i--) {
const t = geometries[i]._hitTestTolerance() + (tolerance || 0);
if (t > hitTolerance) {
hitTolerance = t;
const maxTolerance = renderer.maxTolerance;
//for performance
if (isNumber(maxTolerance)) {
hitTolerance = maxTolerance;
} else {
for (let i = geometries.length - 1; i >= 0; i--) {
const t = geometries[i]._hitTestTolerance() + (tolerance || 0);
if (t > hitTolerance) {
hitTolerance = t;
}
}
}

Expand Down Expand Up @@ -163,12 +178,20 @@ class VectorLayer extends OverlayLayer {
return hits;
}
}
const onlyVisible = options.onlyVisible;
for (let i = geometries.length - 1; i >= 0; i--) {
const geo = geometries[i];
if (!geo || !geo.isVisible() || !geo._getPainter() || !geo.options['interactive']) {
if (!geo || !geo.options['interactive']) {
continue;
}
//当onlyVisible===false时才需要判断isVisible,因为渲染时已经判断过isVisible的值了
if (!onlyVisible && (!geo.isVisible())) {
continue;
}
const painter = geo._getPainter();
if (!painter) {
continue;
}
const bbox = painter.getRenderBBOX && painter.getRenderBBOX();
if (bbox) {
const { x, y } = cp;
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/geometry/Painter.js
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,7 @@ class Painter extends Class {
}

getSprite(resources, canvasClass) {
if (this.geometry.type !== 'Point') {
if (!this.geometry.isPoint) {
return null;
}
this._spriting = true;
Expand Down
4 changes: 2 additions & 2 deletions src/renderer/geometry/symbolizers/StrokeAndFillSymbolizer.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default class StrokeAndFillSymbolizer extends CanvasSymbolizer {
if (!symbol) {
return false;
}
if (geometry && (geometry.type === 'Point')) {
if (geometry && (geometry.isPoint)) {
return false;
}
for (const p in symbol) {
Expand All @@ -30,7 +30,7 @@ export default class StrokeAndFillSymbolizer extends CanvasSymbolizer {
this.symbol = symbol;
this.geometry = geometry;
this.painter = painter;
if (geometry.type === 'Point') {
if (geometry.isPoint) {
return;
}
this.style = this._defineStyle(this.translate());
Expand Down
Loading