# Converting latitude and longitude to decimal values

I have GPS information presented in the form:

36°57'9" N 110°4'21" W

I can use the javascript functions of Chris Veness to convert degrees, minutes and seconds to numeric degrees, but first need to parse the GPS info into the individual latitude and longitude strings (with NSEW suffixes). I have read related posts on stackoverflow, but am not a regex expert (nor a programmer) and need some help with the parsing function. What's the best way to parse this string into latitude and longitude for use in the conversion function?

The result of all this will be a Web link that one can click on to see a Google map representation of location. To parse your input use the following.

``````function ParseDMS(input) {
var parts = input.split(/[^\d\w]+/);
var lat = ConvertDMSToDD(parts, parts, parts, parts);
var lng = ConvertDMSToDD(parts, parts, parts, parts);
}
``````

The following will convert your DMS to DD

``````function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = degrees + minutes/60 + seconds/(60*60);

if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
``````

So your input would produce the following:

``````36°57'9" N  = 36.9525000
110°4'21" W = -110.0725000
``````

Decimal coordinates can be fed into google maps to get points via `GLatLng(lat, lng)` (Google Maps API) Corrected the above functions and made the output an object.

``````function ParseDMS(input) {
var parts = input.split(/[^\d\w\.]+/);
var lat = ConvertDMSToDD(parts, parts, parts, parts);
var lng = ConvertDMSToDD(parts, parts, parts, parts);

return {
Latitude : lat,
Longitude: lng,
Position : lat + ',' + lng
}
}

function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
`````` My tweaked version coerces the string parts into Numbers so that they can actually be added together rather than concatenated. It also handles decimal values which are common for the Seconds component:

``````function ParseDMS(input) {
var parts = input.split(/[^\d\w\.]+/);
var lat = ConvertDMSToDD(parts, parts, parts, parts);
var lng = ConvertDMSToDD(parts, parts, parts, parts);
}
``````

The following will convert your DMS to DD

``````function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);

if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
`````` I got some NaN's on this function and needed to do this (don't ask me why)

``````function ConvertDMSToDD(days, minutes, seconds, direction) {
var dd = days + (minutes/60) + seconds/(60*60);
dd = parseFloat(dd);
if (direction == "S" || direction == "W") {
dd *= -1;
} // Don't do anything for N or E
return dd;
}
`````` Joe, the script you've mentioned already did what do you want. With it you can convert lat and long and put it into link to see location in Google map:

``````var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg()
`````` here is my take on this:

``````function parse_gps( input ) {

if( input.indexOf( 'N' ) == -1 && input.indexOf( 'S' ) == -1 &&
input.indexOf( 'W' ) == -1 && input.indexOf( 'E' ) == -1 ) {
return input.split(',');
}

var parts = input.split(/[°'"]+/).join(' ').split(/[^\w\S]+/);

var directions = [];
var coords = [];
var dd = 0;
var pow = 0;

for( i in parts ) {

// we end on a direction
if( isNaN( parts[i] ) ) {

var _float = parseFloat( parts[i] );

var direction = parts[i];

if( !isNaN(_float ) ) {
dd += ( _float / Math.pow( 60, pow++ ) );
direction = parts[i].replace( _float, '' );
}

direction = direction;

if( direction == 'S' || direction == 'W' )
dd *= -1;

directions[ directions.length ] = direction;

coords[ coords.length ] = dd;
dd = pow = 0;

} else {

dd += ( parseFloat(parts[i]) / Math.pow( 60, pow++ ) );

}

}

if( directions == 'W' || directions == 'E' ) {
var tmp = coords;
coords = coords;
coords = tmp;
}

return coords;
``````

}

This function doesn't handle all types of lat / long types, but it handles the following formats:

``````-31,2222,21.99999
-31 13 13 13.75S, -31 13 13 13.75W
-31 13 13 13.75S -31 13 13 13.75W
-31 13 13 13.75W -31 13.75S
36°57'9" N 110°4'21" W
110°4'21" W 36°57'9"N
``````

Which is what i needed. I used \d+(\,\d+) and \d+(.\d+) because can have float numbers

My final function:

`````` convertDMSToDD: function (dms) {
let parts = dms.split(/[^\d+(\,\d+)\d+(\.\d+)?\w]+/);
let degrees = parseFloat(parts);
let minutes = parseFloat(parts);
let seconds = parseFloat(parts.replace(',','.'));
let direction = parts;

console.log('degrees: '+degrees)
console.log('minutes: '+minutes)
console.log('seconds: '+seconds)
console.log('direction: '+direction)

let dd = degrees + minutes / 60 + seconds / (60 * 60);

if (direction == 'S' || direction == 'W') {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
``````