From d10eff97a2a14b0a5670ce1a0e0f9c2f52c01496 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 24 Jun 2013 11:34:16 -0600 Subject: [PATCH 1/3] Allow getMetersPerUnit to work without units identifier (see #814) --- externs/proj4js.js | 6 ++++++ src/ol/proj/proj.js | 10 +++++++++- test/spec/ol/proj/proj.test.js | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/externs/proj4js.js b/externs/proj4js.js index ebdf9566da..b12d7ef13e 100644 --- a/externs/proj4js.js +++ b/externs/proj4js.js @@ -76,6 +76,12 @@ Proj4js.Proj.prototype.units; Proj4js.Proj.prototype.srsCode; +/** + * @type {number} + */ +Proj4js.Proj.prototype.to_meter; + + /** * @nosideeffects * @param {Proj4js.Proj} source diff --git a/src/ol/proj/proj.js b/src/ol/proj/proj.js index 21d244f2be..d6fa643b4f 100644 --- a/src/ol/proj/proj.js +++ b/src/ol/proj/proj.js @@ -143,7 +143,15 @@ ol.Projection.prototype.getUnits = function() { * @return {number} Meters. */ ol.Projection.prototype.getMetersPerUnit = function() { - return ol.METERS_PER_UNIT[this.units_]; + var metersPerUnit; + if (!goog.isNull(this.units_)) { + metersPerUnit = ol.METERS_PER_UNIT[this.units_]; + } else { + if (this instanceof ol.Proj4jsProjection_) { + metersPerUnit = this.getProj4jsProj().to_meter; + } + } + return metersPerUnit; }; diff --git a/test/spec/ol/proj/proj.test.js b/test/spec/ol/proj/proj.test.js index af306338c7..4c80a78ec5 100644 --- a/test/spec/ol/proj/proj.test.js +++ b/test/spec/ol/proj/proj.test.js @@ -313,11 +313,31 @@ describe('ol.proj', function() { describe('ol.Projection.prototype.getMetersPerUnit()', function() { + beforeEach(function() { + Proj4js.defs['EPSG:26782'] = + '+proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 ' + + '+lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 ' + + '+ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs'; + ol.proj.configureProj4jsProjection({ + code: 'EPSG:26782' + }); + }); + + afterEach(function() { + ol.proj.proj4jsProjections_ = {}; + delete Proj4js.defs['EPSG:26782']; + }); + it('returns value in meters', function() { var epsg4326 = ol.proj.get('EPSG:4326'); expect(epsg4326.getMetersPerUnit()).to.eql(111194.87428468118); }); + it('works for proj4js projections without units', function() { + var epsg26782 = ol.proj.get('EPSG:26782'); + expect(epsg26782.getMetersPerUnit()).to.eql(0.3048006096012192); + }); + }); describe('ol.proj.configureProj4jsProjection()', function() { From a9f01a4390c82a6432148e828ad2e719297bae78 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 24 Jun 2013 11:34:48 -0600 Subject: [PATCH 2/3] Use getMetersPer unit method --- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index 5909385894..cc6d7a61c1 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -332,9 +332,12 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame = // lazy tile grid creation if (idle) { // avoid rendering issues for very high zoom levels - var gridResolution = Math.max(resolution, - ol.renderer.canvas.MIN_RESOLUTION / - ol.METERS_PER_UNIT[projection.getUnits()]); + var minResolution = ol.renderer.canvas.MIN_RESOLUTION; + var metersPerUnit = projection.getMetersPerUnit(); + if (metersPerUnit) { + minResolution = minResolution / metersPerUnit; + } + var gridResolution = Math.max(resolution, minResolution); if (gridResolution !== this.renderedResolution_) { tileGrid = new ol.tilegrid.TileGrid({ origin: [0, 0], From 20527ab1f109e36cd63d8841f72671afa446dc21 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 24 Jun 2013 11:34:59 -0600 Subject: [PATCH 3/3] Reuse tile range --- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index cc6d7a61c1..f690fbc589 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -159,7 +159,7 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) { * @private * @type {ol.TileRange} */ - this.tileRange_ = null; + this.tileRange_ = new ol.TileRange(NaN, NaN, NaN, NaN); /** * @private @@ -360,8 +360,8 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame = // set up transform for the layer canvas to be drawn to the map canvas var tileResolution = tileGrid.getResolution(0); if (idle) { - this.tileRange_ = tileGrid.getTileRangeForExtentAndResolution( - extent, tileResolution); + tileGrid.getTileRangeForExtentAndResolution( + extent, tileResolution, this.tileRange_); } var transform = this.transform_, tileRange = this.tileRange_,