Example #1
0
 /**
  * Convert this grid reference into a latitude and longitude
  *
  * @return
  */
 function toLatLng()
 {
     $airy1830 = new RefEll(6377563.396, 6356256.909);
     $OSGB_F0 = 0.9996012717;
     $N0 = -100000.0;
     $E0 = 400000.0;
     $phi0 = deg2rad(49.0);
     $lambda0 = deg2rad(-2.0);
     $a = $airy1830->maj;
     $b = $airy1830->min;
     $eSquared = $airy1830->ecc;
     $phi = 0.0;
     $lambda = 0.0;
     $E = $this->easting;
     $N = $this->northing;
     $n = ($a - $b) / ($a + $b);
     $M = 0.0;
     $phiPrime = ($N - $N0) / ($a * $OSGB_F0) + $phi0;
     do {
         $M = $b * $OSGB_F0 * ((1 + $n + 5.0 / 4.0 * $n * $n + 5.0 / 4.0 * $n * $n * $n) * ($phiPrime - $phi0) - (3 * $n + 3 * $n * $n + 21.0 / 8.0 * $n * $n * $n) * sin($phiPrime - $phi0) * cos($phiPrime + $phi0) + (15.0 / 8.0 * $n * $n + 15.0 / 8.0 * $n * $n * $n) * sin(2.0 * ($phiPrime - $phi0)) * cos(2.0 * ($phiPrime + $phi0)) - 35.0 / 24.0 * $n * $n * $n * sin(3.0 * ($phiPrime - $phi0)) * cos(3.0 * ($phiPrime + $phi0)));
         $phiPrime += ($N - $N0 - $M) / ($a * $OSGB_F0);
     } while ($N - $N0 - $M >= 0.001);
     $v = $a * $OSGB_F0 * pow(1.0 - $eSquared * coordHelpers::sinSquared($phiPrime), -0.5);
     $rho = $a * $OSGB_F0 * (1.0 - $eSquared) * pow(1.0 - $eSquared * coordHelpers::sinSquared($phiPrime), -1.5);
     $etaSquared = $v / $rho - 1.0;
     $VII = tan($phiPrime) / (2 * $rho * $v);
     $VIII = tan($phiPrime) / (24.0 * $rho * pow($v, 3.0)) * (5.0 + 3.0 * coordHelpers::tanSquared($phiPrime) + $etaSquared - 9.0 * coordHelpers::tanSquared($phiPrime) * $etaSquared);
     $IX = tan($phiPrime) / (720.0 * $rho * pow($v, 5.0)) * (61.0 + 90.0 * coordHelpers::tanSquared($phiPrime) + 45.0 * coordHelpers::tanSquared($phiPrime) * coordHelpers::tanSquared($phiPrime));
     $X = coordHelpers::sec($phiPrime) / $v;
     $XI = coordHelpers::sec($phiPrime) / (6.0 * $v * $v * $v) * ($v / $rho + 2 * coordHelpers::tanSquared($phiPrime));
     $XII = coordHelpers::sec($phiPrime) / (120.0 * pow($v, 5.0)) * (5.0 + 28.0 * coordHelpers::tanSquared($phiPrime) + 24.0 * coordHelpers::tanSquared($phiPrime) * coordHelpers::tanSquared($phiPrime));
     $XIIA = coordHelpers::sec($phiPrime) / (5040.0 * pow($v, 7.0)) * (61.0 + 662.0 * coordHelpers::tanSquared($phiPrime) + 1320.0 * coordHelpers::tanSquared($phiPrime) * coordHelpers::tanSquared($phiPrime) + 720.0 * coordHelpers::tanSquared($phiPrime) * coordHelpers::tanSquared($phiPrime) * coordHelpers::tanSquared($phiPrime));
     $phi = $phiPrime - $VII * pow($E - $E0, 2.0) + $VIII * pow($E - $E0, 4.0) - $IX * pow($E - $E0, 6.0);
     $lambda = $lambda0 + $X * ($E - $E0) - $XI * pow($E - $E0, 3.0) + $XII * pow($E - $E0, 5.0) - $XIIA * pow($E - $E0, 7.0);
     return new LatLng(rad2deg($phi), rad2deg($lambda));
 }
Example #2
0
 /**
  * Convert a latitude and longitude to an UTM reference
  *
  * @return the converted UTM reference
  */
 function toUTMRef()
 {
     $wgs84 = new RefEll(6378137, 6356752.314);
     $UTM_F0 = 0.9996;
     $a = $wgs84->maj;
     $eSquared = $wgs84->ecc;
     $longitude = $this->lng;
     $latitude = $this->lat;
     $latitudeRad = $latitude * (pi() / 180.0);
     $longitudeRad = $longitude * (pi() / 180.0);
     $longitudeZone = (int) (($longitude + 180.0) / 6.0) + 1;
     // Special zone for Norway
     if ($latitude >= 56.0 && $latitude < 64.0 && $longitude >= 3.0 && $longitude < 12.0) {
         $longitudeZone = 32;
     }
     // Special zones for Svalbard
     if ($latitude >= 72.0 && $latitude < 84.0) {
         if ($longitude >= 0.0 && $longitude < 9.0) {
             $longitudeZone = 31;
         } else {
             if ($longitude >= 9.0 && $longitude < 21.0) {
                 $longitudeZone = 33;
             } else {
                 if ($longitude >= 21.0 && $longitude < 33.0) {
                     $longitudeZone = 35;
                 } else {
                     if ($longitude >= 33.0 && $longitude < 42.0) {
                         $longitudeZone = 37;
                     }
                 }
             }
         }
     }
     $longitudeOrigin = ($longitudeZone - 1) * 6 - 180 + 3;
     $longitudeOriginRad = $longitudeOrigin * (pi() / 180.0);
     $UTMZone = coordHelpers::getUTMLatitudeZoneLetter($latitude);
     $ePrimeSquared = $eSquared / (1 - $eSquared);
     $n = $a / sqrt(1 - $eSquared * sin($latitudeRad) * sin($latitudeRad));
     $t = tan($latitudeRad) * tan($latitudeRad);
     $c = $ePrimeSquared * cos($latitudeRad) * cos($latitudeRad);
     $A = cos($latitudeRad) * ($longitudeRad - $longitudeOriginRad);
     $M = $a * ((1 - $eSquared / 4 - 3 * $eSquared * $eSquared / 64 - 5 * $eSquared * $eSquared * $eSquared / 256) * $latitudeRad - (3 * $eSquared / 8 + 3 * $eSquared * $eSquared / 32 + 45 * $eSquared * $eSquared * $eSquared / 1024) * sin(2 * $latitudeRad) + (15 * $eSquared * $eSquared / 256 + 45 * $eSquared * $eSquared * $eSquared / 1024) * sin(4 * $latitudeRad) - 35 * $eSquared * $eSquared * $eSquared / 3072 * sin(6 * $latitudeRad));
     $UTMEasting = (double) ($UTM_F0 * $n * ($A + (1 - $t + $c) * pow($A, 3.0) / 6 + (5 - 18 * $t + $t * $t + 72 * $c - 58 * $ePrimeSquared) * pow($A, 5.0) / 120) + 500000.0);
     $UTMNorthing = (double) ($UTM_F0 * ($M + $n * tan($latitudeRad) * ($A * $A / 2 + (5 - $t + 9 * $c + 4 * $c * $c) * pow($A, 4.0) / 24 + (61 - 58 * $t + $t * $t + 600 * $c - 330 * $ePrimeSquared) * pow($A, 6.0) / 720)));
     // Adjust for the southern hemisphere
     if ($latitude < 0) {
         $UTMNorthing += 10000000.0;
     }
     return new UTMRef($UTMEasting, $UTMNorthing, $UTMZone, $longitudeZone);
 }