Log in

Decimal degrees do dd°mm'ss"

by mika 22. June 2010 12:55

A quick task - convert decimal degrees back to dd°mm'ss''. Not sure if there are other ways of doing this in manifold at this stage so an active column did the trick.

A script is in c#, so just copy and paste it to the script attached to a table when creating an active column. Then simply put the appropriate method name to be used by a column and that's basically it.


using Manifold.Interop.Scripts;
using System;

class Script {

	static string Decimal2Degrees(double decimalDegrees)
		int fullDegrees = (int) Math.Floor(decimalDegrees);
		double decimalMinutes = (decimalDegrees - fullDegrees) * 60;
		int fullMinutes = (int) Math.Floor(decimalMinutes);

		double decimalSeconds = (decimalMinutes - fullMinutes) * 60;
		int fullSeconds = (int) Math.Round(decimalSeconds);

		string strMinutes = fullMinutes.ToString();
		if(fullMinutes < 10){
			strMinutes = "0" + fullMinutes.ToString();

		string strSeconds = fullSeconds.ToString();
		if(fullSeconds < 10){
			strSeconds = "0" + fullSeconds.ToString();

		return fullDegrees.ToString() + "°" + strMinutes + "'" + strSeconds + "\"";

	static object getLongitude()
		return Decimal2Degrees((double)Context.Record.get_Data("Longitude (I)"));

	static object getLatitude()
		return Decimal2Degrees((double)Context.Record.get_Data("Latitude (I)"));

[EDIT] As Adam has pointed out, the code in its first form could return 60 for seconds what of course does not make too much sense. Now, there are a few ways of fixing it - one can use floor and drop the remaining decimal part, or a test can be performed to check if the number of seconds does not exceed 59 seconds, or maybe if the number of seconds rounds to 60 one should increase number of minutes by one and then degrees by one if minutes reach 60 and... Well, to keep it simple at this stage one line of the code needs to be added just after assigning a value to the fullSeconds variable:

fullSeconds = fullSeconds > 59? 59: fullSeconds;

This works as if one used Math.Floor but only if the number rounds to 60. Not perfect for all uses but...

One more thing - as I started thinking a bit more about what the code actually does it appeared to me that for negative coordinates it will return wrong values as it uses Math.Floor - so for -37.50 one will get -38... Living on the northern hemisphere east of Greenwich and not having to deal with negative coordinates on a daily basis, huh?

Tags: , ,

GIS | manifold | scripting manifold

Comments (3) -

9/1/2010 11:19:14 PM #


As Greg pointed out - it is of course also possible to get the same effect by using lat/lon column data types and appropriate formatting for the content

mika Poland |

9/2/2010 8:04:27 AM #

Adam Wachowski

Hi, nice blog!

A small thing:

The way the code is written you might end up with 60 seconds due to Math.Round. Yes, this is a pain to deal with. Smile

Adam Wachowski United States |

9/2/2010 9:25:40 AM #


Thanks Adam. Adding an additional test there wouldn't hurt indeed Wink

mika Poland |

footer cartoninjas.net cartomatic.net blogengine.net pgdstudio.pl