/** * 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); }