コード例 #1
0
 public function coordenadas($north, $east, $utmZone)
 {
     // This is the lambda knot value in the reference
     $LngOrigin = Deg2Rad($utmZone * 6 - 183);
     // The following set of class constants define characteristics of the
     // ellipsoid, as defined my the WGS84 datum.  These values need to be
     // changed if a different dataum is used.
     $FalseNorth = 0;
     // South or North?
     //if (lat < 0.) FalseNorth = 10000000.  // South or North?
     //else          FalseNorth = 0.
     $Ecc = 0.081819190842622;
     // Eccentricity
     $EccSq = $Ecc * $Ecc;
     $Ecc2Sq = $EccSq / (1.0 - $EccSq);
     $Ecc2 = sqrt($Ecc2Sq);
     // Secondary eccentricity
     $E1 = (1 - sqrt(1 - $EccSq)) / (1 + sqrt(1 - $EccSq));
     $E12 = $E1 * $E1;
     $E13 = $E12 * $E1;
     $E14 = $E13 * $E1;
     $SemiMajor = 6378137.0;
     // Ellipsoidal semi-major axis (Meters)
     $FalseEast = 500000.0;
     // UTM East bias (Meters)
     $ScaleFactor = 0.9996;
     // Scale at natural origin
     // Calculate the Cassini projection parameters
     $M1 = ($north - $FalseNorth) / $ScaleFactor;
     $Mu1 = $M1 / ($SemiMajor * (1 - $EccSq / 4.0 - 3.0 * $EccSq * $EccSq / 64.0 - 5.0 * $EccSq * $EccSq * $EccSq / 256.0));
     $Phi1 = $Mu1 + (3.0 * $E1 / 2.0 - 27.0 * $E13 / 32.0) * sin(2.0 * $Mu1);
     +(21.0 * $E12 / 16.0 - 55.0 * $E14 / 32.0) * sin(4.0 * $Mu1);
     +(151.0 * $E13 / 96.0) * sin(6.0 * $Mu1);
     +(1097.0 * $E14 / 512.0) * sin(8.0 * $Mu1);
     $sin2phi1 = sin($Phi1) * sin($Phi1);
     $Rho1 = $SemiMajor * (1.0 - $EccSq) / pow(1.0 - $EccSq * $sin2phi1, 1.5);
     $Nu1 = $SemiMajor / sqrt(1.0 - $EccSq * $sin2phi1);
     // Compute parameters as defined in the POSC specification.  T, C and D
     $T1 = tan($Phi1) * tan($Phi1);
     $T12 = $T1 * $T1;
     $C1 = $Ecc2Sq * cos($Phi1) * cos($Phi1);
     $C12 = $C1 * $C1;
     $D = ($east - $FalseEast) / ($ScaleFactor * $Nu1);
     $D2 = $D * $D;
     $D3 = $D2 * $D;
     $D4 = $D3 * $D;
     $D5 = $D4 * $D;
     $D6 = $D5 * $D;
     // Compute the Latitude and Longitude and convert to degrees
     $lat = $Phi1 - $Nu1 * tan($Phi1) / $Rho1 * ($D2 / 2.0 - (5.0 + 3.0 * $T1 + 10.0 * $C1 - 4.0 * $C12 - 9.0 * $Ecc2Sq) * $D4 / 24.0 + (61.0 + 90.0 * $T1 + 298.0 * $C1 + 45.0 * $T12 - 252.0 * $Ecc2Sq - 3.0 * $C12) * $D6 / 720.0);
     $lat = Rad2Deg($lat);
     $lon = $LngOrigin + ($D - (1.0 + 2.0 * $T1 + $C1) * $D3 / 6.0 + (5.0 - 2.0 * $C1 + 28.0 * $T1 - 3.0 * $C12 + 8.0 * $Ecc2Sq + 24.0 * $T12) * $D5 / 120.0) / cos($Phi1);
     $lon = Rad2Deg($lon);
     // Create a object to store the calculated Latitude and Longitude values
     $PC_LatLon['lat'] = $lat;
     $PC_LatLon['lon'] = $lon;
     // Returns a PC_LatLon object
     return $PC_LatLon;
 }
コード例 #2
0
ファイル: near.php プロジェクト: kojoty/opencaching-pl
 $ilat2 = Deg2Rad(0.5 + $wiersz['latitude'] * 360000.0);
 $ilon2 = Deg2Rad(0.5 + $wiersz['longitude'] * 360000.0);
 $dist = round(acos(sin($kord1) * sin($wiersz['latitude']) + cos($kord1) * cos($wiersz['latitude']) * cos(abs($kord2 - $wiersz['longitude']))) * 111.19, 1);
 $lat1 = $kord1;
 $lon1 = $kord2;
 $lat2 = $wiersz['latitude'];
 $lon2 = $wiersz['longitude'];
 $result = 0.0;
 $ilat1 = 0.5 + $lat1 * 360000.0;
 $ilat2 = 0.5 + $lat2 * 360000.0;
 $ilon1 = 0.5 + $lon1 * 360000.0;
 $ilon2 = 0.5 + $lon2 * 360000.0;
 $lat1 = Deg2Rad($lat1);
 $lon1 = Deg2Rad($lon1);
 $lat2 = Deg2Rad($lat2);
 $lon2 = Deg2Rad($lon2);
 if ($ilat1 == $ilat2 && $ilon1 == $ilon2) {
 } else {
     if ($ilon1 == $ilon2) {
         if ($ilat1 > $ilat2) {
             $result = 180.0;
         }
     } else {
         $c = acos(sin($lat2) * sin($lat1) + cos($lat2) * cos($lat1) * cos($lon2 - $lon1));
         $A = asin(cos($lat2) * sin($lon2 - $lon1) / sin($c));
         $result = Rad2Deg($A);
         if ($ilat2 > $ilat1 && $ilon2 > $ilon1) {
         } else {
             if ($ilat2 < $ilat1 && $ilon2 < $ilon1) {
                 $result = 180.0 - $result;
             } else {