public function set_values_from_point(lat_lng $point)
 {
     $this->OS6 = geometry::lat_long_to_os($point, 6);
     $this->OS8 = geometry::lat_long_to_os($point, 8);
     $this->WGS84_lat = $point->lat();
     $this->WGS84_lng = $point->lng();
     $osgb36 = gps_datums::convert($point, 'WGS84', 'OSGB36');
     $this->OSGB36_lat = $osgb36->lat();
     $this->OSGB36_lng = $osgb36->lng();
 }
Exemplo n.º 2
0
 /**
  * @param string $gridRef
  * @return lat_lng
  */
 static function os_to_lat_long($gridRef)
 {
     $gr = self::gridref_letter_to_number($gridRef);
     $E = $gr[0];
     $N = $gr[1];
     $a = 6377563.396;
     $b = 6356256.91;
     // Airy 1830 major & minor semi-axes
     $F0 = 0.9996012717;
     // NatGrid scale factor on central meridian
     $lat0 = 49 * M_PI / 180;
     $lon0 = -2 * M_PI / 180;
     // NatGrid true origin
     $N0 = -100000;
     $E0 = 400000;
     // northing & easting of true origin; metres
     $e2 = 1 - $b * $b / ($a * $a);
     // eccentricity squared
     $n = ($a - $b) / ($a + $b);
     $n2 = $n * $n;
     $n3 = $n * $n * $n;
     $lat = $lat0;
     $M = 0;
     do {
         $lat = ($N - $N0 - $M) / ($a * $F0) + $lat;
         $Ma = (1 + $n + 5 / 4 * $n2 + 5 / 4 * $n3) * ($lat - $lat0);
         $Mb = (3 * $n + 3 * $n * $n + 21 / 8 * $n3) * sin($lat - $lat0) * cos($lat + $lat0);
         $Mc = (15 / 8 * $n2 + 15 / 8 * $n3) * sin(2 * ($lat - $lat0)) * cos(2 * ($lat + $lat0));
         $Md = 35 / 24 * $n3 * sin(3 * ($lat - $lat0)) * cos(3 * ($lat + $lat0));
         $M = $b * $F0 * ($Ma - $Mb + $Mc - $Md);
         // meridional arc
     } while ($N - $N0 - $M >= 1.0E-5);
     // ie until < 0.01mm
     $cosLat = cos($lat);
     $sinLat = sin($lat);
     $nu = $a * $F0 / sqrt(1 - $e2 * $sinLat * $sinLat);
     // transverse radius of curvature
     $rho = $a * $F0 * (1 - $e2) / pow(1 - $e2 * $sinLat * $sinLat, 1.5);
     // meridional radius of curvature
     $eta2 = $nu / $rho - 1;
     $tanLat = tan($lat);
     $tan2lat = $tanLat * $tanLat;
     $tan4lat = $tan2lat * $tan2lat;
     $tan6lat = $tan4lat * $tan2lat;
     $secLat = 1 / $cosLat;
     $nu3 = $nu * $nu * $nu;
     $nu5 = $nu3 * $nu * $nu;
     $nu7 = $nu5 * $nu * $nu;
     $VII = $tanLat / (2 * $rho * $nu);
     $VIII = $tanLat / (24 * $rho * $nu3) * (5 + 3 * $tan2lat + $eta2 - 9 * $tan2lat * $eta2);
     $IX = $tanLat / (720 * $rho * $nu5) * (61 + 90 * $tan2lat + 45 * $tan4lat);
     $X = $secLat / $nu;
     $XI = $secLat / (6 * $nu3) * ($nu / $rho + 2 * $tan2lat);
     $XII = $secLat / (120 * $nu5) * (5 + 28 * $tan2lat + 24 * $tan4lat);
     $XIIA = $secLat / (5040 * $nu7) * (61 + 662 * $tan2lat + 1320 * $tan4lat + 720 * $tan6lat);
     $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;
     $lon = $lon0 + $X * $dE - $XI * $dE3 + $XII * $dE5 - $XIIA * $dE7;
     return gps_datums::convert(new lat_lng(rad2deg($lat), rad2deg($lon)), 'OSGB36', 'WGS84');
 }