Conversion Functions
From NZ PHP User's Group
Longitude/ Latitude conversion
Converts [common Longitude/ Latitude|http://en.wikipedia.org/wiki/Geographic_coordinate_conversion] formats into a format understood by common web based mapping platforms such as Google Maps.
Supported formats
- 40:26:46N,79:56:55W
- 40:26:46.302N 79:56:55.903W
- 40°26'47"N 79°58'36"W
- 40d 26' 47" N 79d 58' 36" W
- 40.446195N 79.948862W
- 40.446195, -79.948862
- 40° 26.7717, -79° 56.93172
Code (by craiganz)
function degreeLatLong($dms) {
// returns lat,lon in decimal degrees given a string something like:
// 37°46'35.90"S, 176°6'19.89"E
// 37°46'35"S,176°6'19"E
// 37:46:35"S,176°6'19"E
// 37d46's, 176d6'e
// 37:47:35S,176:6:19E
// 37.777555S, 176.111E
// -37.777555, 176.111
// split into lat and lon components
$cleanDms = eregi_replace(' *, *', ',', $dms);
$parts = split(',', strtoupper($cleanDms));
// strip junk from strings
$lat = eregi_replace('[^0-9NSEW,\.+-]+', ' ', $parts[0]);
$lat = eregi_replace('([0-9\.+-])([NSEW])', '\1 \2', $lat);
$lon = eregi_replace('[^0-9NSEW,\.+-]+', ' ', $parts[1]);
$lon = eregi_replace('([0-9\.+-])([NSEW])', '\1 \2', $lon);
// split lat and lon into their component parts (e.g. degrees/ min/sec)
$latParts = split(' ', $lat);
$lonParts = split(' ', $lon);
// build decimal lat (if input wasn't decimal degrees)
if (eregi('\.', $latParts[0]))
$latdeg = $latParts[0] + 0.0;
else
$latdeg = $latParts[0] + $latParts[1] / 60.0 + $latParts[2] / 3600.0;
// change sign if needed
if ($latParts[count($latParts)-1] === 'S')
$latdeg = -$latdeg;
// build decimal lon (if input wasn't decimal degrees)
if (eregi('\.', $lonParts[0]))
$londeg = $lonParts[0] + 0.0;
else
$londeg = $lonParts[0] + $lonParts[1] / 60.0 + $lonParts[2] / 3600.0;
// change sign if needed
if ($lonParts[count($lonParts)-1] === 'W')
$londeg = -$londeg;
// we're done
return $latdeg . ',' . $londeg;
}

