Only draw features and geometries that are visible

This commit is contained in:
Tom Payne
2013-11-10 23:27:18 +01:00
parent c5de1db9e6
commit a17560ade3
2 changed files with 29 additions and 6 deletions
+27 -5
View File
@@ -1,8 +1,10 @@
// FIXME test, especially polygons with holes and multipolygons // FIXME test, especially polygons with holes and multipolygons
// FIXME need to handle large thick features (where pixel size matters)
goog.provide('ol.render.canvas.Immediate'); goog.provide('ol.render.canvas.Immediate');
goog.require('goog.asserts'); goog.require('goog.asserts');
goog.require('ol.extent');
goog.require('ol.render'); goog.require('ol.render');
goog.require('ol.render.IRender'); goog.require('ol.render.IRender');
goog.require('ol.style.fill'); goog.require('ol.style.fill');
@@ -14,9 +16,10 @@ goog.require('ol.style.stroke');
* @constructor * @constructor
* @implements {ol.render.IRender} * @implements {ol.render.IRender}
* @param {CanvasRenderingContext2D} context Context. * @param {CanvasRenderingContext2D} context Context.
* @param {ol.Extent} extent Extent.
* @param {goog.vec.Mat4.AnyType} transform Transform. * @param {goog.vec.Mat4.AnyType} transform Transform.
*/ */
ol.render.canvas.Immediate = function(context, transform) { ol.render.canvas.Immediate = function(context, extent, transform) {
/** /**
* @private * @private
@@ -24,6 +27,12 @@ ol.render.canvas.Immediate = function(context, transform) {
*/ */
this.context_ = context; this.context_ = context;
/**
* @private
* @type {ol.Extent}
*/
this.extent_ = extent;
/** /**
* @private * @private
* @type {goog.vec.Mat4.AnyType} * @type {goog.vec.Mat4.AnyType}
@@ -58,7 +67,8 @@ ol.render.canvas.Immediate = function(context, transform) {
ol.render.canvas.Immediate.prototype.drawImages_ = function(geometry) { ol.render.canvas.Immediate.prototype.drawImages_ = function(geometry) {
var context = this.context_; var context = this.context_;
var imageStyle = this.state_.imageStyle; var imageStyle = this.state_.imageStyle;
if (goog.isNull(imageStyle)) { if (!ol.extent.intersects(this.extent_, geometry.getExtent()) ||
goog.isNull(imageStyle)) {
return; return;
} }
var pixelCoordinates = ol.render.transformGeometry( var pixelCoordinates = ol.render.transformGeometry(
@@ -122,9 +132,12 @@ ol.render.canvas.Immediate.prototype.drawRings_ =
* @inheritDoc * @inheritDoc
*/ */
ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) { ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) {
var geometry = feature.getGeometry();
if (!ol.extent.intersects(this.extent_, geometry.getExtent())) {
return;
}
this.setFillStrokeStyle(style.fill, style.stroke); this.setFillStrokeStyle(style.fill, style.stroke);
this.setImageStyle(style.image); this.setImageStyle(style.image);
var geometry = feature.getGeometry();
var renderGeometry = var renderGeometry =
ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()]; ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()];
goog.asserts.assert(goog.isDef(renderGeometry)); goog.asserts.assert(goog.isDef(renderGeometry));
@@ -151,7 +164,8 @@ ol.render.canvas.Immediate.prototype.drawMultiPointGeometry =
*/ */
ol.render.canvas.Immediate.prototype.drawLineStringGeometry = ol.render.canvas.Immediate.prototype.drawLineStringGeometry =
function(lineStringGeometry) { function(lineStringGeometry) {
if (goog.isNull(this.state_.strokeStyle)) { if (!ol.extent.intersects(this.extent_, lineStringGeometry.getExtent()) ||
goog.isNull(this.state_.strokeStyle)) {
return; return;
} }
var context = this.context_; var context = this.context_;
@@ -168,7 +182,9 @@ ol.render.canvas.Immediate.prototype.drawLineStringGeometry =
*/ */
ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry = ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry =
function(multiLineStringGeometry) { function(multiLineStringGeometry) {
if (goog.isNull(this.state_.strokeStyle)) { var geometryExtent = multiLineStringGeometry.getExtent();
if (!ol.extent.intersects(this.extent_, geometryExtent) ||
goog.isNull(this.state_.strokeStyle)) {
return; return;
} }
var context = this.context_; var context = this.context_;
@@ -190,6 +206,9 @@ ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry =
*/ */
ol.render.canvas.Immediate.prototype.drawPolygonGeometry = ol.render.canvas.Immediate.prototype.drawPolygonGeometry =
function(polygonGeometry) { function(polygonGeometry) {
if (!ol.extent.intersects(this.extent_, polygonGeometry.getExtent())) {
return;
}
var state = this.state_; var state = this.state_;
if (goog.isNull(this.fillStyle) && goog.isNull(this.strokeStyle)) { if (goog.isNull(this.fillStyle) && goog.isNull(this.strokeStyle)) {
return; return;
@@ -214,6 +233,9 @@ ol.render.canvas.Immediate.prototype.drawPolygonGeometry =
*/ */
ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry = ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry =
function(multiPolygonGeometry) { function(multiPolygonGeometry) {
if (!ol.extent.intersects(this.extent_, multiPolygonGeometry.getExtent())) {
return;
}
var state = this.state_; var state = this.state_;
if (goog.isNull(this.fillStyle) && goog.isNull(this.strokeStyle)) { if (goog.isNull(this.fillStyle) && goog.isNull(this.strokeStyle)) {
return; return;
@@ -94,7 +94,8 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame =
var vectorLayer = this.getVectorLayer(); var vectorLayer = this.getVectorLayer();
if (vectorLayer.hasListener(ol.layer.VectorEventType.POSTRENDER)) { if (vectorLayer.hasListener(ol.layer.VectorEventType.POSTRENDER)) {
var render = new ol.render.canvas.Immediate(context, transform); var render = new ol.render.canvas.Immediate(
context, frameState.extent, transform);
var postRenderEvent = new ol.layer.VectorEvent( var postRenderEvent = new ol.layer.VectorEvent(
ol.layer.VectorEventType.POSTRENDER, vectorLayer, render, context, ol.layer.VectorEventType.POSTRENDER, vectorLayer, render, context,
null); null);