Last active
December 24, 2015 05:39
-
-
Save giacecco/6751808 to your computer and use it in GitHub Desktop.
Testing consistency between dbamber/UkGeoTool (https://github.com/dbamber/UkGeoTool) and the source by Chris Veness (http://www.movable-type.co.uk/scripts/latlong-gridref.html). With easting 510350 / northing 179950 as an input, the first function outputs { latitude: 51.50721000898611, longitude: -0.40978487356944765 } , while the second { lat: …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Source http://www.movable-type.co.uk/scripts/latlong-gridref.html | |
Number.prototype.toDeg = function() { // convert radians to degrees (signed) | |
return this * 180 / Math.PI; | |
} | |
osGridToLatLong = function(gridref) { | |
var E = gridref.easting; | |
var N = gridref.northing; | |
var a = 6377563.396, b = 6356256.910; // Airy 1830 major & minor semi-axes | |
var F0 = 0.9996012717; // NatGrid scale factor on central meridian | |
var lat0 = 49*Math.PI/180, lon0 = -2*Math.PI/180; // NatGrid true origin | |
var N0 = -100000, E0 = 400000; // northing & easting of true origin, metres | |
var e2 = 1 - (b*b)/(a*a); // eccentricity squared | |
var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n; | |
var lat=lat0, M=0; | |
do { | |
lat = (N-N0-M)/(a*F0) + lat; | |
var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0); | |
var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0); | |
var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0)); | |
var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0)); | |
M = b * F0 * (Ma - Mb + Mc - Md); // meridional arc | |
} while (N-N0-M >= 0.00001); // ie until < 0.01mm | |
var cosLat = Math.cos(lat), sinLat = Math.sin(lat); | |
var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat); // transverse radius of curvature | |
var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5); // meridional radius of curvature | |
var eta2 = nu/rho-1; | |
var tanLat = Math.tan(lat); | |
var tan2lat = tanLat*tanLat, tan4lat = tan2lat*tan2lat, tan6lat = tan4lat*tan2lat; | |
var secLat = 1/cosLat; | |
var nu3 = nu*nu*nu, nu5 = nu3*nu*nu, nu7 = nu5*nu*nu; | |
var VII = tanLat/(2*rho*nu); | |
var VIII = tanLat/(24*rho*nu3)*(5+3*tan2lat+eta2-9*tan2lat*eta2); | |
var IX = tanLat/(720*rho*nu5)*(61+90*tan2lat+45*tan4lat); | |
var X = secLat/nu; | |
var XI = secLat/(6*nu3)*(nu/rho+2*tan2lat); | |
var XII = secLat/(120*nu5)*(5+28*tan2lat+24*tan4lat); | |
var XIIA = secLat/(5040*nu7)*(61+662*tan2lat+1320*tan4lat+720*tan6lat); | |
var dE = (E-E0), dE2 = dE*dE, dE3 = dE2*dE, dE4 = dE2*dE2, dE5 = dE3*dE2, dE6 = dE4*dE2, dE7 = dE5*dE2; | |
lat = lat - VII*dE2 + VIII*dE4 - IX*dE6; | |
var lon = lon0 + X*dE - XI*dE3 + XII*dE5 - XIIA*dE7; | |
return { latitude: lat.toDeg(), longitude: lon.toDeg() }; | |
} | |
console.log(osGridToLatLong({ easting: 510350., northing: 179950. })); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var geo = require('UkGeoTool'); // https://github.com/dbamber/UkGeoTool | |
var point = { easting: 510350., northing: 179950. }; | |
console.log(geo.eastNorthToLatLong(point.northing, point.easting)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment