diff options
-rw-r--r-- | perllib/Geo/Coordinates/CH1903.pm | 14 | ||||
-rw-r--r-- | web/js/OpenLayers.Projection.CH1903.js | 141 |
2 files changed, 49 insertions, 106 deletions
diff --git a/perllib/Geo/Coordinates/CH1903.pm b/perllib/Geo/Coordinates/CH1903.pm index 611126962..612182152 100644 --- a/perllib/Geo/Coordinates/CH1903.pm +++ b/perllib/Geo/Coordinates/CH1903.pm @@ -37,21 +37,11 @@ Geo::Coordinates::CH1903 =cut -sub deg2sec($) { - my $angle = shift; - - my $deg = int($angle); - my $min = int(($angle - $deg) * 60); - my $sec = ((($angle - $deg) * 60) - $min) * 60; - - return $sec + ($min * 60) + ($deg * 3600); -} - sub from_latlon($$) { my ($lat, $lon) = @_; - $lat = deg2sec($lat); - $lon = deg2sec($lon); + $lat *= 3600; + $lon *= 3600; my $lat_aux = ($lat - 169028.66) / 10000; my $lon_aux = ($lon - 26782.5) / 10000; 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; }, |