New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use the new proj4.js #1228
Use the new proj4.js #1228
Changes from all commits
971c113
dc09b0a
8b89f5b
b5bdd0d
dfe92da
0c62469
8b2277c
88ab1ac
20e903f
a22d7e4
90c7450
0a01f8e
fc3ed93
4cf8383
8f1fdde
1bb5705
1ae82b0
193adf4
7789bff
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,13 +5,41 @@ goog.require('ol.control'); | |
goog.require('ol.control.ScaleLine'); | ||
goog.require('ol.layer.Tile'); | ||
goog.require('ol.proj'); | ||
goog.require('ol.proj.Projection'); | ||
goog.require('ol.source.TileWMS'); | ||
|
||
|
||
var projection = ol.proj.configureProj4jsProjection({ | ||
|
||
// By default OpenLayers does not know about the EPSG:21781 (Swiss) projection. | ||
// So we create a projection instance for EPSG:21781 and pass it to | ||
// ol.proj.addProjection to make it available to the library. | ||
|
||
var projection = new ol.proj.Projection({ | ||
code: 'EPSG:21781', | ||
extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864] | ||
// The extent is used to determine zoom level 0. Recommended values for a | ||
// projection's validity extent can be found at http://epsg.io/. | ||
extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864], | ||
units: 'm' | ||
}); | ||
ol.proj.addProjection(projection); | ||
|
||
// We also declare EPSG:21781/EPSG:4326 transform functions. These functions | ||
// are necessary for the ScaleLine control and when calling ol.proj.transform | ||
// for setting the view's initial center (see below). | ||
|
||
ol.proj.addCoordinateTransforms('EPSG:4326', projection, | ||
function(coordinate) { | ||
return [ | ||
WGStoCHy(coordinate[1], coordinate[0]), | ||
WGStoCHx(coordinate[1], coordinate[0]) | ||
]; | ||
}, | ||
function(coordinate) { | ||
return [ | ||
CHtoWGSlng(coordinate[0], coordinate[1]), | ||
CHtoWGSlat(coordinate[0], coordinate[1]) | ||
]; | ||
}); | ||
|
||
var extent = [420000, 30000, 900000, 350000]; | ||
var layers = [ | ||
|
@@ -61,8 +89,160 @@ var map = new ol.Map({ | |
target: 'map', | ||
view: new ol.View({ | ||
projection: projection, | ||
center: [660000, 190000], | ||
center: ol.proj.transform([8.23, 46.86], 'EPSG:4326', 'EPSG:21781'), | ||
extent: extent, | ||
zoom: 2 | ||
}) | ||
}); | ||
|
||
|
||
|
||
/* | ||
* Swiss projection transform functions downloaded from | ||
* http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html | ||
*/ | ||
|
||
// Convert WGS lat/long (° dec) to CH y | ||
function WGStoCHy(lat, lng) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My editor's linter complains that these functions are used before they are defined. We could move them at the beginning of the file but this will make the example's code harder to read and understand. So let's keep them here. My eyes will bleed each time I open this file but I guess it's ok :-) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're right, and the reason why I decided to move the swisstopo code to the bottom was readability of the example code. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agree. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @elemoine set the "predef":"nofunc" option on your linter for this project (assuming it's jshint) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I already did :-) Thanks. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you could put this code in a separate file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the file is not compiled it will externs. We do that already for things that are in resources/example-behaviour.js. But in this case I find it's good to have these function in the example's js file, because it gives more context to the reader, and thereby makes things easier to understand. So I'd rather keep them here. |
||
|
||
// Converts degrees dec to sex | ||
lat = DECtoSEX(lat); | ||
lng = DECtoSEX(lng); | ||
|
||
// Converts degrees to seconds (sex) | ||
lat = DEGtoSEC(lat); | ||
lng = DEGtoSEC(lng); | ||
|
||
// Axiliary values (% Bern) | ||
var lat_aux = (lat - 169028.66) / 10000; | ||
var lng_aux = (lng - 26782.5) / 10000; | ||
|
||
// Process Y | ||
var y = 600072.37 + | ||
211455.93 * lng_aux - | ||
10938.51 * lng_aux * lat_aux - | ||
0.36 * lng_aux * Math.pow(lat_aux, 2) - | ||
44.54 * Math.pow(lng_aux, 3); | ||
|
||
return y; | ||
} | ||
|
||
// Convert WGS lat/long (° dec) to CH x | ||
function WGStoCHx(lat, lng) { | ||
|
||
// Converts degrees dec to sex | ||
lat = DECtoSEX(lat); | ||
lng = DECtoSEX(lng); | ||
|
||
// Converts degrees to seconds (sex) | ||
lat = DEGtoSEC(lat); | ||
lng = DEGtoSEC(lng); | ||
|
||
// Axiliary values (% Bern) | ||
var lat_aux = (lat - 169028.66) / 10000; | ||
var lng_aux = (lng - 26782.5) / 10000; | ||
|
||
// Process X | ||
var x = 200147.07 + | ||
308807.95 * lat_aux + | ||
3745.25 * Math.pow(lng_aux, 2) + | ||
76.63 * Math.pow(lat_aux, 2) - | ||
194.56 * Math.pow(lng_aux, 2) * lat_aux + | ||
119.79 * Math.pow(lat_aux, 3); | ||
|
||
return x; | ||
|
||
} | ||
|
||
|
||
// Convert CH y/x to WGS lat | ||
function CHtoWGSlat(y, x) { | ||
|
||
// Converts militar to civil and to unit = 1000km | ||
// Axiliary values (% Bern) | ||
var y_aux = (y - 600000) / 1000000; | ||
var x_aux = (x - 200000) / 1000000; | ||
|
||
// Process lat | ||
var lat = 16.9023892 + | ||
3.238272 * x_aux - | ||
0.270978 * Math.pow(y_aux, 2) - | ||
0.002528 * Math.pow(x_aux, 2) - | ||
0.0447 * Math.pow(y_aux, 2) * x_aux - | ||
0.0140 * Math.pow(x_aux, 3); | ||
|
||
// Unit 10000" to 1 " and converts seconds to degrees (dec) | ||
lat = lat * 100 / 36; | ||
|
||
return lat; | ||
|
||
} | ||
|
||
// Convert CH y/x to WGS long | ||
function CHtoWGSlng(y, x) { | ||
|
||
// Converts militar to civil and to unit = 1000km | ||
// Axiliary values (% Bern) | ||
var y_aux = (y - 600000) / 1000000; | ||
var x_aux = (x - 200000) / 1000000; | ||
|
||
// Process long | ||
var lng = 2.6779094 + | ||
4.728982 * y_aux + | ||
0.791484 * y_aux * x_aux + | ||
0.1306 * y_aux * Math.pow(x_aux, 2) - | ||
0.0436 * Math.pow(y_aux, 3); | ||
|
||
// Unit 10000" to 1 " and converts seconds to degrees (dec) | ||
lng = lng * 100 / 36; | ||
|
||
return lng; | ||
|
||
} | ||
|
||
|
||
// Convert SEX DMS angle to DEC | ||
function SEXtoDEC(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 | ||
function DECtoSEX(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 | ||
function DEGtoSEC(angle) { | ||
|
||
// Extract DMS | ||
var deg = parseInt(angle, 10); | ||
var min = parseInt((angle - deg) * 100, 10); | ||
var sec = (((angle - deg) * 100) - min) * 100; | ||
|
||
// Avoid rounding problems with seconds=0 | ||
var parts = String(angle).split('.'); | ||
if (parts.length == 2 && parts[1].length == 2) { | ||
min = Number(parts[1]); | ||
sec = 0; | ||
} | ||
|
||
// Result in degrees sex (dd.mmss) | ||
return sec + min * 60 + deg * 3600; | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you cherry-pick https://github.com/elemoine/ol3/commit/6524124a763a7185e948408f4a5b9cf65d786ff3 for more explanations on the use of a custom projection and custom transforms in this example?