SQL function to convert UK OS coordinates from easting/northing to longitude and latitude

前端 未结 6 1246
南方客
南方客 2021-02-10 10:51

Please can someone post a SQL function to convert easting/northing to longitude/latitude. I know it\'s incredibly complicated but I haven\'t found anyone who has documented it i

6条回答
  •  自闭症患者
    2021-02-10 11:13

    I needed the same function, and javascript made it difficult to interact with the DB. I have converted your JS to PHP and this could be more useful when updating your database - ie: query table, loop through result set, call function, update table.

    function OSGridToLatLong($E, $N) {
    
      $a = 6377563.396; 
      $b = 6356256.910;              // 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 >= 0.00001);  // 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 array(
    
        'longitude' => $lon * 180 / M_PI,
        'latitude'  => $lat * 180 / M_PI
    
      );
    
    }
    

提交回复
热议问题