Proj4js, L-EST and GeoPoint
This post is about converting Estonian coordinates (L-EST 97, L-EST 92) to the common lon/lat format that probably everyone is familiar with (EPSG4326 or WGS84).
For solving this problem I used the excellent proj4js library. The following defintions are needed for EPSG:3301 (L-EST 97) and EPSG:3300 (L-EST 92):
Proj4js.defs["EPSG:3300"] = "+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m +no_defs";
The conversion is actually pretty simple:
var y = 541975.6;
var src = new Proj4js.Proj("EPSG:3301");
var dst = new Proj4js.Proj("EPSG:4326");
var point = new Proj4js.Point(y, x);
Proj4js.transform(src, dst, point);
// 24.72504500749274
console.log(point.x);
// 58.74554729994484
console.log(point.y);
The only thing to watch out for is that you need to swap x/y when converting from L-EST. While generally lat = y and lon = x then in L-EST it seems to be reversed and you get incorrect results otherwise.
I also had the problem of needing to display the coordinates in the more human friendly DEG° MIN’ SEC” format and so I wrote a small library (GeoPoint) to do just that, it’s available at Github and released under MIT license.
// 24° 43' 30.16"
console.log(geopoint.getLonDeg());
// 58° 44' 43.97"
console.log(geopoint.getLatDeg());
GeoPoint also is able to do the reverse transformation – take the human readable format and turn it into a float:
var lat = "58° 44' 43.97"";
var geopoint = new GeoPoint(lon, lat);
// 24.725044444444443
console.log(geopoint.getLonDec());
// 58.74554722222222
console.log(geopoint.getLatDec());
As a final tip I’ll show you how to take a point in lon/lat format, convert it to L-EST and display it on Maa-amet maps (this example assumes you’ve added the above defs to Proj4js):
var lon = 24.756253;
var lat = 59.43922;
var point = new Proj4js.Point(lon, lat);
var src = new Proj4js.Proj("EPSG:4326");
var dst = new Proj4js.Proj("EPSG:3301");
Proj4js.transform(src, dst, point);
window.open("http://xgis.maaamet.ee/xGIS/XGis?app_id=UU82&user_id=at&punkt=" + point.x + "," + point.y + "&moot=2000");
You can view the actual map for the above example here and come visit us :)
Hope this was helpful to someone and happy map hacking!
1 Comment
I’ve also created a Perl module for L-EST 97 WSG84 conversion: http://pastebin.com/6a9uU2Ve