Only draw features and geometries that are visible
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user