1.1 --- a/EventAggregatorSupport.py Sun Apr 10 23:52:35 2011 +0200
1.2 +++ b/EventAggregatorSupport.py Tue Apr 12 00:01:28 2011 +0200
1.3 @@ -105,6 +105,12 @@
1.4 else:
1.5 return cmp(x, y)
1.6
1.7 +def sign(x):
1.8 + if x < 0:
1.9 + return -1
1.10 + else:
1.11 + return 1
1.12 +
1.13 # Utility classes and associated functions.
1.14
1.15 class Form:
1.16 @@ -1782,6 +1788,61 @@
1.17 today = datetime.date.today()
1.18 return today.year
1.19
1.20 +# Location-related functions.
1.21 +
1.22 +class Reference:
1.23 +
1.24 + "A map reference."
1.25 +
1.26 + def __init__(self, degrees, minutes=0, seconds=0):
1.27 + self.degrees = degrees
1.28 + self.minutes = minutes
1.29 + self.seconds = seconds
1.30 +
1.31 + def __repr__(self):
1.32 + return "Reference(%d, %d, %d)" % (self.degrees, self.minutes, self.seconds)
1.33 +
1.34 + def __add__(self, other):
1.35 + if not isinstance(other, Reference):
1.36 + return NotImplemented
1.37 + else:
1.38 + s = sign(self.degrees)
1.39 + o = sign(other.degrees)
1.40 + carry, seconds = adc(s * self.seconds, o * other.seconds)
1.41 + carry, minutes = adc(s * self.minutes, o * other.minutes + carry)
1.42 + return Reference(self.degrees + other.degrees + carry, minutes, seconds)
1.43 +
1.44 + def __sub__(self, other):
1.45 + if not isinstance(other, Reference):
1.46 + return NotImplemented
1.47 + else:
1.48 + return self.__add__(Reference(-other.degrees, other.minutes, other.seconds))
1.49 +
1.50 + def to_degrees(self):
1.51 + return sign(self.degrees) * (abs(self.degrees) + self.minutes / 60.0 + self.seconds / 3600.0)
1.52 +
1.53 + def to_pixels(self, scale):
1.54 + return self.to_degrees() * scale
1.55 +
1.56 +def adc(x, y):
1.57 + result = x + y
1.58 + return divmod(result, 60)
1.59 +
1.60 +def getPositionForReference(latitude, longitude, map_y, map_x, map_x_scale, map_y_scale):
1.61 + return (longitude - map_x).to_pixels(map_x_scale), (latitude - map_y).to_pixels(map_y_scale)
1.62 +
1.63 +def getPositionForCentrePoint(position, map_x_scale, map_y_scale):
1.64 + x, y = position
1.65 + return x - map_x_scale / 2.0, y - map_y_scale / 2.0
1.66 +
1.67 +def getMapReference(value):
1.68 +
1.69 + "Return a map reference by parsing the given 'value'."
1.70 +
1.71 + return Reference(*map(float, value.split(":")))
1.72 +
1.73 +# vim: tabstop=4 expandtab shiftwidth=4
1.74 +
1.75 # User interface functions.
1.76
1.77 def getParameter(request, name, default=None):