-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.py
69 lines (58 loc) · 2.16 KB
/
util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import re
from operator import itemgetter
point_pattern_re = re.compile(r'~?(\d+)[°o]\s?(?:(\d+(?:\.\d+)?)\s?[\'′’]?)?\s?(?:(\d+(?:\.\d+)?)(?:["″”]|\'\')?)?\s?([NESW])')
float_re = re.compile(r'(\d+\.\d+)\s*°?\s*([NESW])')
comma_dot_re = re.compile(r'(\d+,\d+)')
split_re = re.compile(r'(?<=[NE])(?:\s?,?\s+|\s+,?\s*)(?=\d)')
def parse_latlon(s):
try:
return float(s)
except ValueError:
m = float_re.match(s)
if m:
latlon, polarity = m.groups()
latlon = float(latlon)
else:
m = point_pattern_re.match(s)
if m is None:
return None
# raise ValueError('Could not parse latitude/longitude: %r' % s)
degs, mins, secs, polarity = m.groups()
if secs:
latlon = float(degs) + float(mins) / 60 + float(secs) / (60 * 60)
elif mins:
latlon = float(degs) + float(mins) / 60
else:
latlon = float(degs)
if polarity in 'SW':
latlon *= -1
return latlon
def parse_lat_and_lon(s):
if s.count(',') > 1:
s = comma_dot_re.subn(lambda m: m.group(1).replace(',', '.'), s)[0]
try:
lat, lon = s.strip().split(',')
except ValueError:
try:
lat, lon = split_re.split(s)
except ValueError as ex:
raise ValueError('Unrecognized latlon: %r' % s)
return parse_latlon(lat.strip()), parse_latlon(lon.strip())
def parse_points(l):
for lat, lon in l:
yield parse_latlon(lat), parse_latlon(lon)
def parse_points_with_magnitude(l):
for lat, lon, magnitude in l:
yield parse_latlon(lat), parse_latlon(lon), int(magnitude)
class ColorBins(object):
def __init__(self, bins_dict, default):
self.bins = sorted(list(bins_dict.items()), key=itemgetter(0), reverse=True)
self.default = default
def __call__(self, magnitude):
for binmag, style in self.bins:
if magnitude >= binmag:
return style
else:
return self.default
def __repr__(self):
return 'ColorBins(%r, default=%r)' % (self.bins, self.default)