converting easting and northing (mercator) values to Lat / Long
#1
converting easting and northing (mercator) values to Lat / Long
Anyone ever needed to convert between easting and northing co-ords and lat/long ones?
Ive got a load of points specified in mercator, but I need them all in lat/long instead.
So im looking for the simplest equation possible to convert between the two.
Google says this:
But ideally I would like to find something easier to implement than that if possible, as this on a time and materials basis and thats going to take a long time to convert to the language I want and error check etc!
Ive got a load of points specified in mercator, but I need them all in lat/long instead.
So im looking for the simplest equation possible to convert between the two.
Google says this:
##+############################################### ###########################
#
# utm2utm -- Converts Universal Transverse Mercator (UTM) into
# latitude and longitude coordinates. More fun math which I got off
# the web.
#
proc utm2ll {northing easting zone {letter S}} {
set PI [expr {atan(1) * 4}]
set K0 0.9996
# WGS-84
set er 6378137 ;# EquatorialRadius
set es2 0.00669438 ;# EccentricitySquared
set es2x [expr {1.0 - $es2}]
set x [expr {$easting - 500000.0}]
set northernHemisphere [expr {$letter >= "N"}]
set y [expr {$northing - ($northernHemisphere ? 0.0 : 10000000.0)}]
set long_origin [expr {($zone - 1) * 6 - 180 + 3}] ;# +3 puts in middle
set ep2 [expr {$es2 / $es2x}]
set e1 [expr {(1.0 - sqrt($es2x)) / (1.0 + sqrt($es2x))}]
set M [expr {$y / $K0}]
set mu [expr {$M / ($er * (1.0 - $es2 /4.0 - 3 * $es2 * $es2 /64.0
- 5 * $es2 * $es2 * $es2 /256.0))}]
set phi [expr {$mu + (3 * $e1 / 2 - 27 * $e1 * $e1 * $e1 / 32 ) * sin(2*$mu)
+ (21 * $e1 * $e1 / 16 - 55 * $e1 * $e1 * $e1 * $e1 / 32) *
sin(4*$mu ) + (151 * $e1 * $e1 * $e1 / 96 ) * sin(6*$mu)}]
set N1 [expr {$er / sqrt(1.0 - $es2 * sin($phi) * sin($phi))}]
set T1 [expr {tan($phi) * tan($phi)}]
set C1 [expr {$ep2 * cos($phi) * cos($phi)}]
set R1 [expr {$er * $es2x / pow(1.0 - $es2 * sin($phi) * sin($phi), 1.5)}]
set D [expr {$x / ($N1 * $K0)}]
set latitude [expr {$phi - ($N1 * tan($phi) / $R1) * ($D * $D / 2
- (5 + 3 * $T1 + 10 * $C1 - 4 * $C1 * $C1 - 9 * $ep2) *
$D * $D * $D * $D / 24
+ (61 + 90 * $T1 + 298 * $C1 + 45 * $T1 * $T1
- 252 * $ep2 - 3 * $C1 * $C1 ) * $D * $D * $D * $D * $D * $D / 720)}]
set latitude [expr {$latitude * 180.0 / $PI}]
set longitude [expr {($D - (1 + 2 * $T1 + $C1) * $D * $D * $D / 6
+ (5 - 2 * $C1 + 28 * $T1 - 3 * $C1 * $C1
+ 8 * $ep2 + 24 * $T1 * $T1) * $D * $D * $D * $D * $D / 120)
/ cos($phi)}]
set longitude [expr {$long_origin + $longitude * 180.0 / $PI}]
return[list $latitude $longitude]
}
#
# utm2utm -- Converts Universal Transverse Mercator (UTM) into
# latitude and longitude coordinates. More fun math which I got off
# the web.
#
proc utm2ll {northing easting zone {letter S}} {
set PI [expr {atan(1) * 4}]
set K0 0.9996
# WGS-84
set er 6378137 ;# EquatorialRadius
set es2 0.00669438 ;# EccentricitySquared
set es2x [expr {1.0 - $es2}]
set x [expr {$easting - 500000.0}]
set northernHemisphere [expr {$letter >= "N"}]
set y [expr {$northing - ($northernHemisphere ? 0.0 : 10000000.0)}]
set long_origin [expr {($zone - 1) * 6 - 180 + 3}] ;# +3 puts in middle
set ep2 [expr {$es2 / $es2x}]
set e1 [expr {(1.0 - sqrt($es2x)) / (1.0 + sqrt($es2x))}]
set M [expr {$y / $K0}]
set mu [expr {$M / ($er * (1.0 - $es2 /4.0 - 3 * $es2 * $es2 /64.0
- 5 * $es2 * $es2 * $es2 /256.0))}]
set phi [expr {$mu + (3 * $e1 / 2 - 27 * $e1 * $e1 * $e1 / 32 ) * sin(2*$mu)
+ (21 * $e1 * $e1 / 16 - 55 * $e1 * $e1 * $e1 * $e1 / 32) *
sin(4*$mu ) + (151 * $e1 * $e1 * $e1 / 96 ) * sin(6*$mu)}]
set N1 [expr {$er / sqrt(1.0 - $es2 * sin($phi) * sin($phi))}]
set T1 [expr {tan($phi) * tan($phi)}]
set C1 [expr {$ep2 * cos($phi) * cos($phi)}]
set R1 [expr {$er * $es2x / pow(1.0 - $es2 * sin($phi) * sin($phi), 1.5)}]
set D [expr {$x / ($N1 * $K0)}]
set latitude [expr {$phi - ($N1 * tan($phi) / $R1) * ($D * $D / 2
- (5 + 3 * $T1 + 10 * $C1 - 4 * $C1 * $C1 - 9 * $ep2) *
$D * $D * $D * $D / 24
+ (61 + 90 * $T1 + 298 * $C1 + 45 * $T1 * $T1
- 252 * $ep2 - 3 * $C1 * $C1 ) * $D * $D * $D * $D * $D * $D / 720)}]
set latitude [expr {$latitude * 180.0 / $PI}]
set longitude [expr {($D - (1 + 2 * $T1 + $C1) * $D * $D * $D / 6
+ (5 - 2 * $C1 + 28 * $T1 - 3 * $C1 * $C1
+ 8 * $ep2 + 24 * $T1 * $T1) * $D * $D * $D * $D * $D / 120)
/ cos($phi)}]
set longitude [expr {$long_origin + $longitude * 180.0 / $PI}]
return[list $latitude $longitude]
}
Last edited by Chip; 30-09-2009 at 11:50 AM.
#2
Never mind, found a javascript one now which is a fairly similar langauge to what im using anyway.
function OSGridToLatLong(gridRef) {
var gr = gridrefLetToNum(gridRef);
var E = gr[0], N = gr[1];
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*tan6la t);
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 new LatLon(lat.toDeg(), lon.toDeg());
}
var gr = gridrefLetToNum(gridRef);
var E = gr[0], N = gr[1];
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*tan6la t);
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 new LatLon(lat.toDeg(), lon.toDeg());
}
Thread
Thread Starter
Forum
Replies
Last Post
nicodinho
Ford Non RS / XR / ST parts for sale.
6
07-10-2015 12:56 PM