Conversion Functions

From NZ PHP User's Group

Jump to: navigation, search

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