aboutsummaryrefslogtreecommitdiffstats
path: root/web/js
diff options
context:
space:
mode:
authorMatthew Somerville <matthew@mysociety.org>2012-12-03 10:46:54 +0000
committerMatthew Somerville <matthew@mysociety.org>2012-12-03 10:53:09 +0000
commit2cf8ba561104a67d5d6e8d2eca0d0a6fe91ccff5 (patch)
treef845e720323ba7243f1b0e45b35ed2d4756bf035 /web/js
parent9479d41f7b004f48f0a73c075ea454c23e7d9036 (diff)
Simplify projection logic, and use X/Y same way round as everywhere else.
Diffstat (limited to 'web/js')
-rw-r--r--web/js/OpenLayers.Projection.CH1903.js141
1 files changed, 47 insertions, 94 deletions
diff --git a/web/js/OpenLayers.Projection.CH1903.js b/web/js/OpenLayers.Projection.CH1903.js
index cb62a0168..34a0500fa 100644
--- a/web/js/OpenLayers.Projection.CH1903.js
+++ b/web/js/OpenLayers.Projection.CH1903.js
@@ -5,117 +5,70 @@
*
* Maths courtesy of the Swiss Federal Office of Topography:
* http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html
+ * Simplifed a bit, and with x/y swapped the normal way round.
*/
-
OpenLayers.Projection.CH1903 = {
- // Convert SEX DMS angle to DEC
- SEXtoDEC: function(angle) {
-
- // Extract DMS
- var deg = parseInt(angle, 10);
- var min = parseInt((angle - deg) * 100, 10);
- var sec = (((angle - deg) * 100) - min) * 100;
-
- // Result in degrees sex (dd.mmss)
- return deg + ((sec / 60 + min) / 60);
-
- },
-
- // Convert DEC angle to SEX DMS
- DECtoSEX: function(angle) {
-
- // Extract DMS
- var deg = parseInt(angle, 10);
- var min = parseInt((angle - deg) * 60, 10);
- var sec = (((angle - deg) * 60) - min) * 60;
-
- // Result in degrees sex (dd.mmss)
- return deg + (min / 100) + (sec / 10000);
-
- },
-
- // Convert Degrees angle to seconds
- DEGtoSEC: function(angle) {
-
- // Extract DMS
- var deg = parseInt( angle );
- var min = parseInt( (angle - deg) * 100 );
- var sec = (((angle - deg) * 100) - min) * 100;
-
- // Result in degrees sex (dd.mmss)
- return sec + (min * 60) + (deg * 3600);
-
- },
-
- // Convert WGS lat/long (° dec) to CH y
- WGStoCHy: function(lat, lng) {
-
- // Converts degrees dec to sex
- lat = OpenLayers.Projection.CH1903.DECtoSEX(lat);
- lng = OpenLayers.Projection.CH1903.DECtoSEX(lng);
+ // Convert WGS lat/long (° dec) to CH x
+ WGStoCHx: function(lat, lng) {
- // Converts degrees to seconds (sex)
- lat = OpenLayers.Projection.CH1903.DEGtoSEC(lat);
- lng = OpenLayers.Projection.CH1903.DEGtoSEC(lng);
+ // Converts degrees dec to seconds
+ lat = lat * 3600;
+ lng = lng * 3600;
- // Axiliary values (% Bern)
+ // Auxiliary values (% Bern)
var lat_aux = (lat - 169028.66) / 10000;
var lng_aux = (lng - 26782.5) / 10000;
- // Process Y
- y = 600072.37;
- y = y + (211455.93 * lng_aux);
- y = y - (10938.51 * lng_aux * lat_aux);
- y = y - (0.36 * lng_aux * Math.pow(lat_aux, 2));
- y = y - (44.54 * Math.pow(lng_aux, 3));
+ // Process X
+ var x = 600072.37;
+ x = x + (211455.93 * lng_aux);
+ x = x - (10938.51 * lng_aux * lat_aux);
+ x = x - (0.36 * lng_aux * Math.pow(lat_aux, 2));
+ x = x - (44.54 * Math.pow(lng_aux, 3));
- return y;
+ return x;
},
- // Convert WGS lat/long (° dec) to CH x
- WGStoCHx: function(lat, lng) {
-
- // Converts degrees dec to sex
- lat = OpenLayers.Projection.CH1903.DECtoSEX(lat);
- lng = OpenLayers.Projection.CH1903.DECtoSEX(lng);
+ // Convert WGS lat/long (° dec) to CH y
+ WGStoCHy: function(lat, lng) {
- // Converts degrees to seconds (sex)
- lat = OpenLayers.Projection.CH1903.DEGtoSEC(lat);
- lng = OpenLayers.Projection.CH1903.DEGtoSEC(lng);
+ // Converts degrees dec to seconds
+ lat = lat * 3600;
+ lng = lng * 3600;
- // Axiliary values (% Bern)
+ // Auxiliary values (% Bern)
var lat_aux = (lat - 169028.66)/10000;
var lng_aux = (lng - 26782.5)/10000;
- // Process X
- x = 200147.07;
- x = x + (308807.95 * lat_aux);
- x = x + (3745.25 * Math.pow(lng_aux, 2));
- x = x + (76.63 * Math.pow(lat_aux, 2));
- x = x - (194.56 * Math.pow(lng_aux, 2) * lat_aux);
- x = x + (119.79 * Math.pow(lat_aux, 3));
+ // Process Y
+ var y = 200147.07;
+ y = y + (308807.95 * lat_aux);
+ y = y + (3745.25 * Math.pow(lng_aux, 2));
+ y = y + (76.63 * Math.pow(lat_aux, 2));
+ y = y - (194.56 * Math.pow(lng_aux, 2) * lat_aux);
+ y = y + (119.79 * Math.pow(lat_aux, 3));
- return x;
+ return y;
},
- // Convert CH y/x to WGS lat
- chToWGSlat: function(y, x) {
+ // Convert CH x/y to WGS lat
+ chToWGSlat: function(x, y) {
// Converts militar to civil and to unit = 1000km
// Axiliary values (% Bern)
- var y_aux = (y - 600000) / 1000000;
- var x_aux = (x - 200000) / 1000000;
+ var x_aux = (x - 600000) / 1000000;
+ var y_aux = (y - 200000) / 1000000;
// Process lat
var lat = 16.9023892;
- lat = lat + (3.238272 * x_aux);
- lat = lat - (0.270978 * Math.pow(y_aux, 2));
- lat = lat - (0.002528 * Math.pow(x_aux, 2));
- lat = lat - (0.0447 * Math.pow(y_aux, 2) * x_aux);
- lat = lat - (0.0140 * Math.pow(x_aux, 3));
+ lat = lat + (3.238272 * y_aux);
+ lat = lat - (0.270978 * Math.pow(x_aux, 2));
+ lat = lat - (0.002528 * Math.pow(y_aux, 2));
+ lat = lat - (0.0447 * Math.pow(x_aux, 2) * y_aux);
+ lat = lat - (0.0140 * Math.pow(y_aux, 3));
// Unit 10000" to 1 " and converts seconds to degrees (dec)
lat = lat * 100 / 36;
@@ -124,20 +77,20 @@ OpenLayers.Projection.CH1903 = {
},
- // Convert CH y/x to WGS long
- chToWGSlng: function(y, x) {
+ // Convert CH x/y to WGS long
+ chToWGSlng: function(x, y) {
// Converts militar to civil and to unit = 1000km
// Axiliary values (% Bern)
- var y_aux = (y - 600000) / 1000000;
- var x_aux = (x - 200000) / 1000000;
+ var x_aux = (x - 600000) / 1000000;
+ var y_aux = (y - 200000) / 1000000;
// Process long
var lng = 2.6779094;
- lng = lng + (4.728982 * y_aux);
- lng = lng + (0.791484 * y_aux * x_aux);
- lng = lng + (0.1306 * y_aux * Math.pow(x_aux, 2));
- lng = lng - (0.0436 * Math.pow(y_aux, 3));
+ lng = lng + (4.728982 * x_aux);
+ lng = lng + (0.791484 * x_aux * y_aux);
+ lng = lng + (0.1306 * x_aux * Math.pow(y_aux, 2));
+ lng = lng - (0.0436 * Math.pow(x_aux, 3));
// Unit 10000" to 1 " and converts seconds to degrees (dec)
lng = lng * 100 / 36;
@@ -150,8 +103,8 @@ OpenLayers.Projection.CH1903 = {
projectForwardSwiss: function(point) {
var x = OpenLayers.Projection.CH1903.WGStoCHx(point.y, point.x),
y = OpenLayers.Projection.CH1903.WGStoCHy(point.y, point.x);
- point.x = y; // x/y are geometrically swapped by the conversion functions
- point.y = x;
+ point.x = x;
+ point.y = y;
return point;
},