From 3c305db4a44bca70d19ed465fc2895353a79278c Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 4 Jan 2013 18:47:33 +0100 Subject: [PATCH] Canvas tile renderer - first cut Untested and no styling --- src/ol/renderer/canvas/canvastilerenderer.js | 174 +++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/ol/renderer/canvas/canvastilerenderer.js diff --git a/src/ol/renderer/canvas/canvastilerenderer.js b/src/ol/renderer/canvas/canvastilerenderer.js new file mode 100644 index 0000000000..7055d122be --- /dev/null +++ b/src/ol/renderer/canvas/canvastilerenderer.js @@ -0,0 +1,174 @@ +goog.provide('ol.renderer.tile.Canvas'); + +goog.require('goog.style'); +goog.require('ol.Coordinate'); +goog.require('ol.Pixel'); +goog.require('ol.Projection'); + + + +ol.renderer.tile.Canvas = function(layerRenderer) { + + this.layerRenderer_ = layerRenderer; + + /** + * @type {ol.Projection} + * @private + */ + this.projection_; + + /** + * @type {number} + * @private + */ + this.resolution_; + + /** + * @type {ol.Coordinate} + * @private + */ + this.origin_ = new ol.Coordinate(0, 0); + + /** + * @type {ol.Pixel} + * @private + */ + this.originPixel_; + + /** + * @type {Object|ol.Size} + * @private + */ + this.size_; + + /** + * @type {CanvasContext} + * @private + */ + this.context_; + + /** + * @type {CanvasImageData} + * @private + */ + this.pixelData_; + +}; + +/** + * @param size {Object|ol.Size} + */ +ol.renderer.tile.Canvas.prototype.setSize = function(size) { + if (!(size instanceof ol.Size)) { + size = new ol.Size(size.width, size.height); + } + this.size_ = size; + if (!this.context_) { + this.context_ = document.createElement('canvas').getContext('2d'); + this.pixelData_ = this.context_.createImageData(1,1).data; + this.pixelData[3] = 1; // opacity + } + goog.style.setSize(this.canvas_, size); +}; + +/** + * @param size {Object|ol.Coordinate} + */ +ol.renderer.tile.Canvas.prototype.setOrigin = function(origin) { + if (!(origin instanceof ol.Coordinate)) { + origin = new ol.Coordinate(origin.x, origin.y); + } + this.origin_ = origin; + this.originPixel_ = this.layerRenderer_.getPixelFromCoordinate(origin); +}; + +/** + * @param resolution {number} + */ +ol.renderer.tile.Canvas.prototype.setResolution = function(resolution) { + this.resolution_ = resolution; +}; + +/* + * @param geoJson {Object|Array} GeoJSON or an array of GeoJSON features + * @param projection {ol.Projection=} + */ +ol.renderer.tile.Canvas.prototype.render = function(geoJson, projection) { + var map = this.map; + this.projection_ = map.getProjection(); + this.resolution_ = map.getResolution(); + + var features; + if (goog.isArray(geoJson)) { + features = geoJson; + } else if (geoJson.type === 'FeatureCollection') { + features = geoJson.features; + } else if (geoJson.type === 'Feature') { + features = [geoJson]; + } + + if (features) { + //FIXME Support geometry level projections + projection = projection || new ol.Projection('EPSG:4326'); + if (!(projection instanceof ol.Projection)) { + projection = new ol.Projection(projection); + } + for (var i=0, ii=features.length; i