Better, but still not all the way there
This commit is contained in:
@@ -77,12 +77,6 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) {
|
|||||||
*/
|
*/
|
||||||
this.renderedResolution_;
|
this.renderedResolution_;
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {ol.Extent}
|
|
||||||
*/
|
|
||||||
this.renderedExtent_;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {boolean}
|
* @type {boolean}
|
||||||
@@ -169,15 +163,7 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
var tileResolution = tileGrid.getResolution(z);
|
var tileResolution = tileGrid.getResolution(z);
|
||||||
var tileRange = tileGrid.getTileRangeForExtentAndResolution(
|
var tileRange = tileGrid.getTileRangeForExtentAndResolution(
|
||||||
extent, tileResolution);
|
extent, tileResolution);
|
||||||
var tileExtent = tileGrid.getTileRangeExtent(z, tileRange);
|
var tileRangeExtent = tileGrid.getTileRangeExtent(z, tileRange);
|
||||||
|
|
||||||
// bail out if nothing to do
|
|
||||||
// TODO: try to make it less work to determine that nothing changed
|
|
||||||
if (!this.layerChanged_ && this.renderedResolution_ == tileResolution &&
|
|
||||||
// TODO: extent.equals(other)
|
|
||||||
this.renderedExtent_.toString() == tileExtent.toString()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear tiles at alt-z
|
// clear tiles at alt-z
|
||||||
if (this.renderedResolution_ != tileResolution) {
|
if (this.renderedResolution_ != tileResolution) {
|
||||||
@@ -202,11 +188,26 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
finalCanvas.height = sketchSize.height;
|
finalCanvas.height = sketchSize.height;
|
||||||
var finalContext = this.context_;
|
var finalContext = this.context_;
|
||||||
|
|
||||||
|
var sketchOrigin = tileRangeExtent.getTopLeft();
|
||||||
|
var frameOrigin = extent.getTopLeft();
|
||||||
|
var transform = this.transform_;
|
||||||
|
goog.vec.Mat4.makeIdentity(transform);
|
||||||
|
goog.vec.Mat4.translate(transform,
|
||||||
|
frameState.size.width / 2, frameState.size.height / 2, 0);
|
||||||
|
goog.vec.Mat4.rotateZ(transform, view2DState.rotation);
|
||||||
|
goog.vec.Mat4.scale(
|
||||||
|
transform,
|
||||||
|
tileResolution / view2DState.resolution,
|
||||||
|
tileResolution / view2DState.resolution,
|
||||||
|
1);
|
||||||
|
goog.vec.Mat4.translate(
|
||||||
|
transform,
|
||||||
|
(frameOrigin.x - view2DState.center.x) / tileResolution,
|
||||||
|
(view2DState.center.y - frameOrigin.y) / tileResolution,
|
||||||
|
0);
|
||||||
|
|
||||||
var sketchTransform = this.sketchTransform_;
|
var sketchTransform = this.sketchTransform_;
|
||||||
goog.vec.Mat4.makeIdentity(sketchTransform);
|
goog.vec.Mat4.makeIdentity(sketchTransform);
|
||||||
goog.vec.Mat4.translate(sketchTransform,
|
|
||||||
sketchSize.width / 2, sketchSize.height / 2, 0);
|
|
||||||
goog.vec.Mat4.rotateZ(sketchTransform, view2DState.rotation);
|
|
||||||
goog.vec.Mat4.scale(
|
goog.vec.Mat4.scale(
|
||||||
sketchTransform,
|
sketchTransform,
|
||||||
1 / tileResolution,
|
1 / tileResolution,
|
||||||
@@ -214,8 +215,8 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
1);
|
1);
|
||||||
goog.vec.Mat4.translate(
|
goog.vec.Mat4.translate(
|
||||||
sketchTransform,
|
sketchTransform,
|
||||||
-view2DState.center.x,
|
-sketchOrigin.x,
|
||||||
-view2DState.center.y,
|
-sketchOrigin.y,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
var sketchCanvasRenderer = new ol.renderer.canvas.Renderer(
|
var sketchCanvasRenderer = new ol.renderer.canvas.Renderer(
|
||||||
@@ -231,8 +232,8 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
tileCoord = new ol.TileCoord(z, x, y);
|
tileCoord = new ol.TileCoord(z, x, y);
|
||||||
key = tileCoord.toString();
|
key = tileCoord.toString();
|
||||||
tile = this.tileCache_[key];
|
tile = this.tileCache_[key];
|
||||||
|
tileExtent = tileGrid.getTileCoordExtent(tileCoord);
|
||||||
if (tile === undefined) {
|
if (tile === undefined) {
|
||||||
tileExtent = tileGrid.getTileCoordExtent(tileCoord);
|
|
||||||
// TODO: instead of filtering here, do this on the source and maintain
|
// TODO: instead of filtering here, do this on the source and maintain
|
||||||
// a spatial index
|
// a spatial index
|
||||||
function filterFn(feature) {
|
function filterFn(feature) {
|
||||||
@@ -248,7 +249,7 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
filter = filters[i];
|
filter = filters[i];
|
||||||
type = filter.getType();
|
type = filter.getType();
|
||||||
features = source.getFeatures(filter);
|
features = source.getFeatures(filter);
|
||||||
// TODO: spatial indes of tiles - see filterFn above
|
// TODO: spatial index of tiles - see filterFn above
|
||||||
features = goog.array.filter(features, filterFn);
|
features = goog.array.filter(features, filterFn);
|
||||||
if (features.length) {
|
if (features.length) {
|
||||||
// TODO: layer.getSymbolizerLiterals(features) or similar
|
// TODO: layer.getSymbolizerLiterals(features) or similar
|
||||||
@@ -268,25 +269,11 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
|
|||||||
this.tileCache_[key] = tile;
|
this.tileCache_[key] = tile;
|
||||||
}
|
}
|
||||||
finalContext.drawImage(tile,
|
finalContext.drawImage(tile,
|
||||||
x * tileSize.width, (tileRange.maxY - y) * tileSize.height);
|
(tileExtent.minX - frameOrigin.x) / tileResolution,
|
||||||
|
(frameOrigin.y - tileExtent.maxY) / tileResolution);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var sketchOrigin = tileExtent.getTopLeft();
|
|
||||||
var frameOrigin = extent.getTopLeft();
|
|
||||||
|
|
||||||
var dx = (sketchOrigin.x - frameOrigin.x) / resolution;
|
|
||||||
var dy = (frameOrigin.y - sketchOrigin.y) / resolution;
|
|
||||||
|
|
||||||
var transform = this.transform_;
|
|
||||||
goog.vec.Mat4.makeIdentity(transform);
|
|
||||||
goog.vec.Mat4.translate(transform, dx, dy, 0);
|
|
||||||
goog.vec.Mat4.scale(
|
|
||||||
transform,
|
|
||||||
tileResolution / resolution,
|
|
||||||
tileResolution / resolution,
|
|
||||||
1);
|
|
||||||
|
|
||||||
this.renderedResolution_ = tileResolution;
|
this.renderedResolution_ = tileResolution;
|
||||||
this.renderedExtent_ = tileExtent;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user