-
Notifications
You must be signed in to change notification settings - Fork 2
/
utils.py
140 lines (111 loc) · 4.18 KB
/
utils.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import json
import urllib
import urllib2
import csv, codecs, cStringIO, fileinput
def csvByLine(csvFile, lineHandler):
errors = ''
for row_id, line in enumerate( UnicodeReader(csvFile) ):
print "Calling Line handler for %s" % line
errors = ''.join( [errors, lineHandler( line )] )
return errors
def geolocate(location, sensor=False):
"""
Take a "location" and return its latitude and longitude
Keyword arguments:
location - String defining a geographical location (address, zip code, etc)
sensor - Boolean defining whether the location was taken from
an on-device sensor
Output:
latitude and logitude in an dict
"""
sensor = str(sensor).lower()
url = "http://maps.googleapis.com/maps/api/geocode/json?"
url += urllib.urlencode({'address': location, 'sensor': sensor})
data = urllib2.urlopen(url).read()
data = json.loads(data)
if data and data['status'] == 'OK':
return({
'latitude': data['results'][0]['geometry']['location']['lat'],
'longitude': data['results'][0]['geometry']['location']['lng']
})
else:
return None
def georeverse(lat, lon):
# construct url for reverse geocoding with google-maps
url = "http://maps.googleapis.com/maps/api/geocode/json?"
url += urllib.urlencode({'latlng': lat + ',' + lon, 'sensor': 'false'})
# retrieve and load google-map data
data = urllib2.urlopen(url).read()
data = json.loads(data)
# if request goes through, return the state and country of the location
if data['status'] == 'OK':
address_components = data['results'][0]['address_components']
# these probably shouldn't be booleans (test with None data-type at some point)
country = False
state = False
for component in address_components:
try:
if component['types'][0] == 'country':
country = component['long_name']
if component['types'][0] == 'administrative_area_level_1':
state = component['long_name']
except Exception:
pass
return ({
'state': state,
'country': country
})
return ({
'state': False,
'country': False
})
class UTF8Recoder:
"""
Iterator that reads an encoded stream and reencodes the input to UTF-8
"""
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
#return self.reader.next().decode("cp1252").encode("utf-8")
return self.reader.next().encode("utf-8")
class UnicodeReader:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
#def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
def __init__(self, f, dialect=csv.excel, encoding="cp1252", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)