function E_N_to_Lat_Long($East, $North) { $a = 6377563.396; // Semi-major axis, a $b = 6356256.91; //Semi-minor axis, b $e0 = 400000.0; //True origin Easting, E0 $n0 = -100000.0; //True origin Northing, N0 $f0 = 0.9996012717; //Central Meridan Scale, F0 $PHI0 = 49.0; // True origin latitude, j0 $LAM0 = -2.0; // True origin longitude, l0 //Convert angle measures to radians $RadPHI0 = $PHI0 * (M_PI / 180); $RadLAM0 = $LAM0 * (M_PI / 180); //Compute af0, bf0, e squared (e2), n and Et $af0 = $a * $f0; $bf0 = $b * $f0; $e2 = ($af0 * $af0 - $bf0 * $bf0) / ($af0 * $af0); $n = ($af0 - $bf0) / ($af0 + $bf0); $Et = $East - $e0; //Compute initial value for latitude (PHI) in radians $PHId = InitialLat($North, $n0, $af0, $RadPHI0, $n, $bf0); $sinPHId2 = pow(sin($PHId), 2); $cosPHId = pow(cos($PHId), -1); $tanPHId = tan($PHId); $tanPHId2 = pow($tanPHId, 2); $tanPHId4 = pow($tanPHId, 4); $tanPHId6 = pow($tanPHId, 6); //Compute nu, rho and eta2 using value for PHId $nu = $af0 / sqrt(1 - $e2 * $sinPHId2); $rho = $nu * (1 - $e2) / (1 - $e2 * $sinPHId2); $eta2 = $nu / $rho - 1; //Compute Longitude $X = $cosPHId / $nu; $XI = $cosPHId / (6 * pow($nu, 3)) * ($nu / $rho + 2 * $tanPHId2); $XII = $cosPHId / (120 * pow($nu, 5)) * (5 + 28 * $tanPHId2 + 24 * $tanPHId4); $XIIA = $cosPHId / (5040 * pow($nu, 7)) * (61 + 662 * $tanPHId2 + 1320 * $tanPHId4 + 720 * $tanPHId6); $VII = $tanPHId / (2 * $rho * $nu); $VIII = $tanPHId / (24 * $rho * pow($nu, 3)) * (5 + 3 * $tanPHId2 + $eta2 - 9 * $eta2 * $tanPHId2); $IX = $tanPHId / (720 * $rho * pow($nu, 5)) * (61 + 90 * $tanPHId2 + 45 * $tanPHId4); $long = 180 / M_PI * ($RadLAM0 + $Et * $X - pow($Et, 3) * $XI + pow($Et, 5) * $XII - pow($Et, 7) * $XIIA); $lat = 180 / M_PI * ($PHId - pow($Et, 2) * $VII + pow($Et, 4) * $VIII - pow($Et, 6) * $IX); return array($lat, $long); }
function NEtoLL($east, $north) { // converts NGR easting and nothing to lat, lon. // input metres, output radians $nX = (double) $north; $eX = (double) $east; $a = 6377563.396; // OSGB semi-major $b = 6356256.91; // OSGB semi-minor $e0 = 400000; // OSGB easting of false origin $n0 = -100000; // OSGB northing of false origin $f0 = 0.9996012717; // OSGB scale factor on central meridian $e2 = 0.0066705397616; // OSGB eccentricity squared $lam0 = -0.03490658503988659; // OSGB false east $phi0 = 0.8552113334772214; // OSGB false north $af0 = $a * $f0; $bf0 = $b * $f0; $n = ($af0 - $bf0) / ($af0 + $bf0); $Et = $east - $e0; $phid = InitialLat($north, $n0, $af0, $phi0, $n, $bf0); $nu = $af0 / sqrt(1 - $e2 * (sin($phid) * sin($phid))); $rho = $nu * (1 - $e2) / (1 - $e2 * sin($phid) * sin($phid)); $eta2 = $nu / $rho - 1; $tlat2 = tan($phid) * tan($phid); $tlat4 = pow(tan($phid), 4); $tlat6 = pow(tan($phid), 6); $clatm1 = pow(cos($phid), -1); $VII = tan($phid) / (2 * $rho * $nu); $VIII = tan($phid) / (24 * $rho * ($nu * $nu * $nu)) * (5 + 3 * $tlat2 + $eta2 - 9 * $eta2 * $tlat2); $IX = tan($phid) / (720 * $rho * pow($nu, 5)) * (61 + 90 * $tlat2 + 45 * pow(tan($phid), 4)); $phip = $phid - $Et * $Et * $VII + pow($Et, 4) * $VIII - pow($Et, 6) * $IX; $X = pow(cos($phid), -1) / $nu; $XI = $clatm1 / (6 * ($nu * $nu * $nu)) * ($nu / $rho + 2 * $tlat2); $XII = $clatm1 / (120 * pow($nu, 5)) * (5 + 28 * $tlat2 + 24 * $tlat4); $XIIA = $clatm1 / (5040 * pow($nu, 7)) * (61 + 662 * $tlat2 + 1320 * $tlat4 + 720 * $tlat6); $lambdap = $lam0 + $Et * $X - $Et * $Et * $Et * $XI + pow($Et, 5) * $XII - pow($Et, 7) * $XIIA; $rad2deg = 180.0 / 3.141582; $geo = array('latitude' => $phip * $rad2deg, 'longitude' => $lambdap * $rad2deg); return $geo; }