def normalize_street_address(address_text): ''' Given a free-formed address in a string, returns the normalized street address portion of a result obtained by Google Geocoding API. Including additional address information (e.g. city, zip code) is useful for the API query, but will the information will not be included in the result. Returns None if normalization was not possible. ''' response = geocoding_client.run_geocode_request(address_text) result = response.best_result(wrapped=True) # TODO: add ambiguous result handling if not result: return None return result.get_street_address()
def resolve_location(partial_location, allow_numberless=True): ''' Resolves a partial Location object into a complete one using the Google Geocoding API. Useful for fleshing out non-named locations not in Factual's Places database. Also useful for normalizing street addresses contained in Location objects. Returns None if resolution was not possible. ''' LAT_BUFFER, LONG_BUFFER = 0.005, 0.005 # need to combine most Location fields into a string state = partial_location.state if partial_location.postcode: state += ' ' + partial_location.postcode nbrhd = partial_location.neighborhood.name if partial_location.neighborhood else '' fields = [partial_location.address, nbrhd, partial_location.town, state] address_text = ', '.join([field for field in fields if field != '']) biasing_args = {} # use the location's lat/long to create a bounding window biaser if partial_location.latitude is not None and partial_location.longitude is not None: biasing_args['bounds'] = \ ((partial_location.latitude-LAT_BUFFER, partial_location.longitude-LONG_BUFFER), (partial_location.latitude+LAT_BUFFER, partial_location.longitude+LONG_BUFFER)) # use country as a region biaser if partial_location.country: biasing_args['region'] = partial_location.country # Run the geocoding response = geocoding_client.run_geocode_request(address_text, **biasing_args) result = response.best_result(wrapped=True) # TODO: add ambiguous result handling if not result or not result.is_address_concrete(allow_numberless): return None # convert geocoding result to Location return _geocode_result_to_location(result)
def resolve_location(partial_location,allow_numberless=True): ''' Resolves a partial Location object into a complete one using the Google Geocoding API. Useful for fleshing out non-named locations not in Factual's Places database. Also useful for normalizing street addresses contained in Location objects. Returns None if resolution was not possible. ''' LAT_BUFFER, LONG_BUFFER = 0.005, 0.005 # need to combine most Location fields into a string state = partial_location.state if partial_location.postcode: state += ' ' + partial_location.postcode nbrhd = partial_location.neighborhood.name if partial_location.neighborhood else '' fields = [partial_location.address, nbrhd, partial_location.town, state] address_text = ', '.join( [field for field in fields if field != '' ]) biasing_args = {} # use the location's lat/long to create a bounding window biaser if partial_location.latitude is not None and partial_location.longitude is not None: biasing_args['bounds'] = \ ((partial_location.latitude-LAT_BUFFER, partial_location.longitude-LONG_BUFFER), (partial_location.latitude+LAT_BUFFER, partial_location.longitude+LONG_BUFFER)) # use country as a region biaser if partial_location.country: biasing_args['region'] = partial_location.country # Run the geocoding response = geocoding_client.run_geocode_request(address_text,**biasing_args) result = response.best_result(wrapped=True) # TODO: add ambiguous result handling if not result or not result.is_address_concrete(allow_numberless): return None # convert geocoding result to Location return _geocode_result_to_location(result)