# Converting DMS coordinates to decimal in R

I have a vector of DMS coordinates similar in format to the following:

``````coords <- c("43°46′50″N 79°24′53″W", "43°46′06″N 79°24′46″W")
``````

and I would like to convert them into two numeric decimal vectors for latitude and longitude to eventually mark them in `leaflet`.

``````coords_lat <- c(43.780556, 43.768333)
coords_lon <- c(-79.414722, -79.412778)
``````

My question is: Is there a function available out there in `R` that does this conversion automatically, or would I need to rely on regex and some outside tool to convert them myself?

There's the `char2dms` function in the `sp` package that will convert this format, and you'll have to give it the right separator characters. Your example has some interesting separators that I don't have on my keyboard:

``````> coords
[1] "43°46′50″N 79°24′53″W" "43°46′06″N 79°24′46″W"
``````

You could cut and paste the separators, or extract the separators from the string, eg:

``````> chd = substr(coords, 3, 3)[1]
> chm = substr(coords, 6, 6)[1]
> chs = substr(coords, 9, 9)[1]
``````

Then convert to "DMS" objects:

``````> cd = char2dms(coords,chd=chd,chm=chm,chs=chs)
[1] 43d46'50"W 43d46'6"W
``````

Once you've got those, you can convert to numeric with:

``````> as.numeric(cd)
[1] -43.78056 -43.76833
``````

To get the lat and the long you'll probably have to split your strings and then use `char2dms`, unless there's something else in the `sp` package....

Note that you can only run `char2dms` on a vector of longs or lats - if you mix them up it fails, interpreting them as whatever the first one is, it seems:

This is a longitude, West:

``````> char2dms(c("23d12'8\"W"))
[1] 23d12'8"W
``````

Run it with a vector with a latitude and then a longitude:

``````> char2dms(c("23d12'8\"N","23d12'8\"W"))
[1] 23d12'8"N 23d12'8"S
``````

returns two latitude.