From 87d6208403e9ec36114abee9ebe4c3323bd74ab2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 4 Mar 2013 10:25:20 +0100 Subject: [PATCH 1/2] Add international feet to projection units --- src/ol/projection.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ol/projection.js b/src/ol/projection.js index 91d00d3fd5..a70ac2a8bd 100644 --- a/src/ol/projection.js +++ b/src/ol/projection.js @@ -28,6 +28,7 @@ ol.HAVE_PROJ4JS = ol.ENABLE_PROJ4JS && typeof Proj4js == 'object'; */ ol.ProjectionUnits = { DEGREES: 'degrees', + FEET: 'ft', METERS: 'm' }; @@ -168,7 +169,13 @@ ol.Proj4jsProjection_.prototype.getPointResolution = var height = ol.sphere.NORMAL.haversineDistance( new ol.Coordinate(vertices[4], vertices[5]), new ol.Coordinate(vertices[6], vertices[7])); - return (width + height) / 2; + var pointResolution = (width + height) / 2; + if (this.getUnits() == ol.ProjectionUnits.FEET) { + // The radius of the normal sphere is defined in meters, so we must + // convert back to feet. + pointResolution /= 0.3048; + } + return pointResolution; } }; From b9a9e84c1bc86a15a87aec75bc6c5de72c18bbd2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 4 Mar 2013 10:26:06 +0100 Subject: [PATCH 2/2] Handle projections in feet in scale line control --- src/ol/control/scalelinecontrol.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ol/control/scalelinecontrol.js b/src/ol/control/scalelinecontrol.js index a2144e502c..02fb5bcf26 100644 --- a/src/ol/control/scalelinecontrol.js +++ b/src/ol/control/scalelinecontrol.js @@ -168,11 +168,13 @@ ol.control.ScaleLine.prototype.updateElement_ = function(frameState) { this.toEPSG4326_ = null; cosLatitude = Math.cos(goog.math.toRadians(center.y)); pointResolution *= Math.PI * cosLatitude * ol.sphere.NORMAL.radius / 180; + projectionUnits = ol.ProjectionUnits.METERS; - } else if (projectionUnits == ol.ProjectionUnits.METERS && + } else if ((projectionUnits == ol.ProjectionUnits.FEET || + projectionUnits == ol.ProjectionUnits.METERS) && this.units_ == ol.control.ScaleLineUnits.DEGREES) { - // Convert pointResolution from meters to degrees + // Convert pointResolution from meters or feet to degrees if (goog.isNull(this.toEPSG4326_)) { this.toEPSG4326_ = ol.projection.getTransform( projection, ol.projection.getFromCode('EPSG:4326')); @@ -180,20 +182,26 @@ ol.control.ScaleLine.prototype.updateElement_ = function(frameState) { var vertex = [center.x, center.y]; vertex = this.toEPSG4326_(vertex, vertex, 2); cosLatitude = Math.cos(goog.math.toRadians(vertex[1])); - pointResolution *= 180 / (Math.PI * cosLatitude * ol.sphere.NORMAL.radius); + var radius = ol.sphere.NORMAL.radius; + if (projectionUnits == ol.ProjectionUnits.FEET) { + radius /= 0.3048; + } + pointResolution *= 180 / (Math.PI * cosLatitude * radius); + projectionUnits = ol.ProjectionUnits.DEGREES; } else { this.toEPSG4326_ = null; - goog.asserts.assert( - ((this.units_ == ol.control.ScaleLineUnits.METRIC || - this.units_ == ol.control.ScaleLineUnits.IMPERIAL) && - projectionUnits == ol.ProjectionUnits.METERS) || - (this.units_ == ol.control.ScaleLineUnits.DEGREES && - projectionUnits == ol.ProjectionUnits.DEGREES)); } + goog.asserts.assert( + ((this.units_ == ol.control.ScaleLineUnits.METRIC || + this.units_ == ol.control.ScaleLineUnits.IMPERIAL) && + projectionUnits == ol.ProjectionUnits.METERS) || + (this.units_ == ol.control.ScaleLineUnits.DEGREES && + projectionUnits == ol.ProjectionUnits.DEGREES)); + var nominalCount = this.minWidth_ * pointResolution; var suffix = ''; if (this.units_ == ol.control.ScaleLineUnits.DEGREES) {