/usr/lib/python3/dist-packages/geopy/geocoders/dot_us.py is in python3-geopy 0.95.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | import getpass
from urllib.parse import urlencode
from urllib.request import urlopen
from geopy.geocoders.base import Geocoder
from geopy import util
import csv
class GeocoderDotUS(Geocoder):
def __init__(self, username=None, password=None, format_string='%s'):
if username and (password is None):
password = getpass.getpass(
"geocoder.us password for %r: " % username
)
self.format_string = format_string
self.username = username
self.__password = password
def get_url(self):
username = self.username
password = self.__password
if username and password:
auth = '%s@%s:' % (username, password)
resource = 'member/service/namedcsv'
else:
auth = ''
resource = 'service/namedcsv'
return 'http://%sgeocoder.us/%s' % (auth, resource)
def geocode(self, query, exactly_one=True):
if isinstance(query, str):
query = query.encode('utf-8')
query_str = self.format_string % query
page = urlopen("%s?%s" % (
self.get_url(),
urlencode({'address':query_str})
))
reader = csv.reader(page)
places = [r for r in reader]
# GeoNames only returns the closest match, no matter what.
#
#if exactly_one and len(places) != 1:
# raise ValueError("Didn't find exactly one placemark! " \
# "(Found %d.)" % len(places))
#
#if exactly_one:
# return self._parse_result(places[0])
#else:
# return [self._parse_result(place) for place in places]
return self._parse_result(places[0])
@staticmethod
def _parse_result(result):
# turn x=y pairs ("lat=47.6", "long=-117.426") into dict key/value pairs:
place = dict(
[x for x in [x.split('=', 1) for x in result] if len(x)>1])
address = [
place.get('number', None),
place.get('prefix', None),
place.get('street', None),
place.get('type', None),
place.get('suffix', None)
]
city = place.get('city', None)
state = place.get('state', None)
zip_code = place.get('zip', None)
name = util.join_filter(", ", [
util.join_filter(" ", address),
city,
util.join_filter(" ", [state, zip_code])
])
latitude = place.get('lat', None)
longitude = place.get('long', None)
if latitude and longitude:
latlon = float(latitude), float(longitude)
else:
return None
# TODO use Point/Location object API in 0.95
#if latitude and longitude:
# point = Point(latitude, longitude)
#else:
# point = None
#return Location(name, point, dict(result))
return name, latlon
|