Files
openlayers/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
2013-01-22 01:36:32 -07:00

163 lines
3.8 KiB
JavaScript

goog.provide('ol.renderer.canvas.VectorLayer');
goog.require('goog.vec.Mat4');
goog.require('ol.filter.Geometry');
goog.require('ol.geom.GeometryType');
goog.require('ol.layer.Vector');
/**
* @constructor
* @extends {ol.renderer.canvas.Layer}
* @param {ol.renderer.Map} mapRenderer Map renderer.
* @param {ol.layer.Vector} layer Vector layer.
*/
ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) {
goog.base(this, mapRenderer, layer);
/**
* @private
* @type {HTMLCanvasElement}
*/
this.canvas_ = null;
/**
* @private
* @type {ol.Size}
*/
this.canvasSize_ = null;
/**
* @private
* @type {CanvasRenderingContext2D}
*/
this.context_ = null;
/**
* @private
* @type {!goog.vec.Mat4.Number}
*/
this.transform_ = goog.vec.Mat4.createNumber();
goog.vec.Mat4.makeIdentity(this.transform_);
/**
* Geometry filters in rendering order.
* @private
* @type {Array.<ol.filter.Geometry>}
* TODO: deal with multis
*/
this.geometryFilters_ = [
new ol.filter.Geometry(ol.geom.GeometryType.POLYGON),
new ol.filter.Geometry(ol.geom.GeometryType.LINESTRING),
new ol.filter.Geometry(ol.geom.GeometryType.POINT)
];
};
goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer);
/**
* @inheritDoc
*/
ol.renderer.canvas.VectorLayer.prototype.getImage = function() {
return this.canvas_;
};
/**
* @return {ol.layer.Vector} Vector layer.
*/
ol.renderer.canvas.VectorLayer.prototype.getVectorLayer = function() {
return /** @type {ol.layer.Vector} */ (this.getLayer());
};
/**
* @inheritDoc
*/
ol.renderer.canvas.VectorLayer.prototype.getTransform = function() {
return this.transform_;
};
/**
* @inheritDoc
*/
ol.renderer.canvas.VectorLayer.prototype.renderFrame =
function(frameState, layerState) {
var view2DState = frameState.view2DState;
var layer = this.getVectorLayer();
var source = layer.getVectorSource();
var extent = frameState.extent;
var canvasSize = frameState.size;
var canvas, context;
if (goog.isNull(this.canvas_)) {
canvas = /** @type {HTMLCanvasElement} */
(goog.dom.createElement(goog.dom.TagName.CANVAS));
canvas.width = canvasSize.width;
canvas.height = canvasSize.height;
context = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'));
this.canvas_ = canvas;
this.canvasSize_ = canvasSize;
this.context_ = context;
} else {
canvas = this.canvas_;
context = this.context_;
// force clear the canvas
canvas.width = canvasSize.width;
canvas.height = canvasSize.height;
this.canvasSize_ = canvasSize;
}
/**
* For now, we create a canvas renderer and have it render all features with
* every call to renderFrame.
* TODO: only render newly visible/dirty areas
*/
var canvasRenderer = new ol.renderer.canvas.Renderer(
canvas, frameState.coordinateToPixelMatrix);
// TODO: get these elsewhere
var symbolizers = {
point: new ol.style.LiteralShape({
type: ol.style.ShapeType.CIRCLE,
size: 10,
fillStyle: '#ffcc99',
strokeStyle: '#ff9933',
strokeWidth: 2,
opacity: 0.75
}),
linestring: new ol.style.LiteralLine({
strokeStyle: '#ff9933',
strokeWidth: 2,
opacity: 1
}),
polygon: new ol.style.LiteralPolygon({
fillStyle: '#ffcc99',
strokeStyle: '#ff9933',
strokeWidth: 2,
opacity: 0.5
})
};
// render features by geometry type
var filters = this.geometryFilters_,
numFilters = filters.length,
i, filter, type, features, symbolizer;
for (i = 0; i < numFilters; ++i) {
filter = filters[i];
type = filter.getType();
features = source.getFeatures(filter);
symbolizer = symbolizers[type];
canvasRenderer.renderFeaturesByGeometryType(type, features, symbolizer);
}
};