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; }
$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 {