generated from mwc/lab_weather
189 lines
5.2 KiB
Python
189 lines
5.2 KiB
Python
#!/usr/bin/python
|
|
# coding: utf8
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
|
|
from geocoder.base import OneResult, MultipleResultsQuery
|
|
from geocoder.keys import tamu_key
|
|
|
|
|
|
class TamuResult(OneResult):
|
|
|
|
def __init__(self, json_content):
|
|
self.output_geocode = json_content.get('OutputGeocode', {})
|
|
self.parsed_address = json_content.get('ParsedAddress', {})
|
|
self.reference_feature = json_content.get('ReferenceFeature', {})
|
|
self.census_value = json_content.get('CensusValues', [{}])[0].get('CensusValue1', {})
|
|
super(TamuResult, self).__init__(json_content)
|
|
|
|
@property
|
|
def lat(self):
|
|
lat = self.output_geocode.get('Latitude')
|
|
if lat:
|
|
return float(lat)
|
|
|
|
@property
|
|
def lng(self):
|
|
lng = self.output_geocode.get('Longitude')
|
|
if lng:
|
|
return float(lng)
|
|
|
|
@property
|
|
def quality(self):
|
|
return self.output_geocode.get('MatchedLocationType')
|
|
|
|
@property
|
|
def accuracy(self):
|
|
return self.output_geocode.get('FeatureMatchingGeographyType')
|
|
|
|
@property
|
|
def confidence(self):
|
|
return self.output_geocode.get('MatchScore')
|
|
|
|
@property
|
|
def housenumber(self):
|
|
return self.parsed_address.get('Number')
|
|
|
|
@property
|
|
def street(self):
|
|
name = self.parsed_address.get('Name', '')
|
|
suffix = self.parsed_address.get('Suffix', '')
|
|
return ' '.join([name, suffix]).strip()
|
|
|
|
@property
|
|
def address(self):
|
|
return ' '.join([
|
|
self.parsed_address.get('Number', ''),
|
|
self.parsed_address.get('Name', ''),
|
|
self.parsed_address.get('Suffix', ''),
|
|
self.parsed_address.get('City', ''),
|
|
self.parsed_address.get('State', ''),
|
|
self.parsed_address.get('Zip', '')])
|
|
|
|
@property
|
|
def city(self):
|
|
return self.parsed_address.get('City')
|
|
|
|
@property
|
|
def state(self):
|
|
return self.parsed_address.get('State')
|
|
|
|
@property
|
|
def postal(self):
|
|
return self.parsed_address.get('Zip')
|
|
|
|
@property
|
|
def census_tract(self):
|
|
return self.census_value.get('CensusTract')
|
|
|
|
@property
|
|
def census_block(self):
|
|
return self.census_value.get('CensusBlock')
|
|
|
|
@property
|
|
def census_msa_fips(self):
|
|
return self.census_value.get('CensusMsaFips')
|
|
|
|
@property
|
|
def census_mcd_fips(self):
|
|
return self.census_value.get('CensusMcdFips')
|
|
|
|
@property
|
|
def census_metdiv_fips(self):
|
|
return self.census_value.get('CensusMetDivFips')
|
|
|
|
@property
|
|
def census_place_fips(self):
|
|
return self.census_value.get('CensusPlaceFips')
|
|
|
|
@property
|
|
def census_cbsa_fips(self):
|
|
return self.census_value.get('CensusCbsaFips')
|
|
|
|
@property
|
|
def census_state_fips(self):
|
|
return self.census_value.get('CensusStateFips')
|
|
|
|
@property
|
|
def census_county_fips(self):
|
|
return self.census_value.get('CensusCountyFips')
|
|
|
|
@property
|
|
def census_year(self):
|
|
return self.census_value.get('CensusYear')
|
|
|
|
|
|
class TamuQuery(MultipleResultsQuery):
|
|
"""
|
|
TAMU Geocoding Services
|
|
=======================
|
|
|
|
Params
|
|
------
|
|
:param location: The street address of the location you want geocoded.
|
|
:param city: The city of the location to geocode.
|
|
:param state: The state of the location to geocode.
|
|
:param zipcode: The zipcode of the location to geocode.
|
|
:param key: The API key (use API key "demo" for testing).
|
|
|
|
API Reference
|
|
-------------
|
|
https://geoservices.tamu.edu/Services/Geocode/WebService
|
|
"""
|
|
provider = 'tamu'
|
|
method = 'geocode'
|
|
CENSUSYEARS = ['1990', '2000', '2010']
|
|
|
|
_URL = 'https://geoservices.tamu.edu/Services/Geocode/WebService' \
|
|
'/GeocoderWebServiceHttpNonParsed_V04_01.aspx'
|
|
_RESULT_CLASS = TamuResult
|
|
_KEY = tamu_key
|
|
|
|
def _build_params(self, location, provider_key, **kwargs):
|
|
# city, state, zip
|
|
city = kwargs.get('city', '')
|
|
state = kwargs.get('state', '')
|
|
zipcode = kwargs.get('zipcode', '')
|
|
return {
|
|
'streetAddress': location,
|
|
'city': city,
|
|
'state': state,
|
|
'zip': zipcode,
|
|
'apikey': provider_key,
|
|
'format': 'json',
|
|
'census': 'true',
|
|
'censusYear': '|'.join(self.CENSUSYEARS),
|
|
'notStore': 'false',
|
|
'verbose': 'true',
|
|
'version': '4.01'
|
|
}
|
|
|
|
def _catch_errors(self, json_response):
|
|
exception_occured = json_response.get('ExceptionOccured')
|
|
status_code = json_response.get('QueryStatusCodeValue')
|
|
exception = json_response.get('Exception')
|
|
|
|
if exception_occured == 'True' or status_code != '200' or exception:
|
|
self.error = exception
|
|
|
|
if status_code == '401' or status_code == '470':
|
|
self.error = u'Tamu returned status_code {0}. Is API key {1} valid?'.format(status_code, self.key)
|
|
|
|
return self.error
|
|
|
|
def _adapt_results(self, json_response):
|
|
return json_response['OutputGeocodes']
|
|
|
|
|
|
if __name__ == '__main__':
|
|
logging.basicConfig(level=logging.INFO)
|
|
g = TamuQuery(
|
|
'595 Market Street',
|
|
city='San Francisco',
|
|
state='CA',
|
|
zipcode='94105')
|
|
|
|
g.debug()
|