[Numpy-discussion] Conversion functions

Chris Barker - NOAA Federal chris.barker@noaa....
Tue Jan 1 21:41:19 CST 2013


On Tue, Jan 1, 2013 at 6:50 AM, Schönberger Johannes
<hannesschoenberger@gmail.com> wrote:

> I recently opened a new pull request which adds the functionality to
> convert between degrees and degrees, minutes and seconds
> (https://github.com/numpy/numpy/pull/2869).
>
> The discussion is about whether such conversion functionality should
> be integrated into numpy at all or whether this belongs to scipy.

handy functions, yes, but certainly not something to put in numpy --
maybe scipy, not sure the best place. I see someone (chuck? )on github
suggested a "conversion.py" module -- that should be in scipy, not
numpy, but I"m wary -- where would it stop? RAther, perhaps the
quantaties package should be adopted.

But another note: conversion to deg.min.sec with floating point is a
bit less trivial than you'd think, you can end up with results like:

xdegrees, 60 minutes.... if you're not careful -- it looks from a
first glance that the pull request does not address this. Note: I
suppose we could consider it technically OK, but it's certainly not
aesthetically pleasing.

Example:
import numpy as np

def deg2dms(x):
    out = [0,0,0]
    out[0] = np.floor(x)
    out[1] = np.floor((x - out[0]) * 60)
    out[2] = ((x - out[0]) * 60 - out[1]) * 60
    return out

print deg2dms(1.0)
print deg2dms(1.1)
print deg2dms(45.05)

In [60]: run deg2dms.py
[1.0, 0.0, 0.0]
[1.0, 6.0, 3.1974423109204508e-13]
[45.0, 2.0, 59.999999999989768]

you'd really want that to be:

 1degree 6 minutes, 0 seconds

and

 45 degrees 3 minutes, zero seconds


Here's the code I used:

    @classmethod
    def ToDegMin(self, DecDegrees, ustring = False):
        """
        Converts from decimal (binary float) degrees to:
          Degrees, Minutes

        If the optional parameter: "ustring" is True,
        a Unicode string is returned

        """
        if signbit(DecDegrees):
            Sign = -1
            DecDegrees = abs(DecDegrees)
        else:
            Sign = 1
        Degrees = int(DecDegrees)
        DecMinutes = round((DecDegrees - Degrees + 1e-14) * 60, 10)#
add a tiny bit then round to avoid binary rounding issues
        if ustring:
            if Sign == 1:
                return u"%i\xb0 %.3f'"%(Degrees, DecMinutes)
            else:
                return u"-%i\xb0 %.3f'"%(Degrees, DecMinutes)
        else:
            return (Sign*float(Degrees), DecMinutes) # float to preserve -0.0

perhaps ugly but it results in pretty output -- someone smart here
could probably offer a cleaner solution.


-Chris

-- 

Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker@noaa.gov


More information about the NumPy-Discussion mailing list