General Car Related Discussion. To discuss anything that is related to cars and automotive technology that doesnt naturally fit into another forum catagory.

converting easting and northing (mercator) values to Lat / Long

Thread Tools
 
Search this Thread
 
Old 30-09-2009, 11:48 AM
  #1  
Chip
*** Sierra RS Custard ***
Thread Starter
iTrader: (3)
 
Chip's Avatar
 
Join Date: Dec 2006
Posts: 47,250
Received 22 Likes on 14 Posts
Default 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:
##+############################################### ###########################
#
# 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]
}
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!

Last edited by Chip; 30-09-2009 at 11:50 AM.
Old 30-09-2009, 11:53 AM
  #2  
Chip
*** Sierra RS Custard ***
Thread Starter
iTrader: (3)
 
Chip's Avatar
 
Join Date: Dec 2006
Posts: 47,250
Received 22 Likes on 14 Posts
Default

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());
}
Related Topics
Thread
Thread Starter
Forum
Replies
Last Post
mark94
Ford Mondeo Including ST
5
10-10-2023 06:52 PM
nicodinho
Ford Non RS / XR / ST parts for sale.
6
07-10-2015 12:56 PM
sridgett
General Car Related Discussion.
2
01-10-2015 07:30 PM
Fil
General Car Related Discussion.
6
30-09-2015 12:08 PM
mondeomark
Cars & Parts Wanted.
0
28-09-2015 06:28 AM



Quick Reply: converting easting and northing (mercator) values to Lat / Long



All times are GMT. The time now is 05:21 PM.