python-package/lets_plot/geo_data/gis/geocoding_service.py (35 lines of code) (raw):
import gzip
import json
import urllib.parse
import urllib.request
from urllib.error import HTTPError
from .json_request import RequestFormatter
from .json_response import ResponseParser
from .request import Request
from .response import Response
from lets_plot._global_settings import has_global_value, get_global_str, GEOCODING_ROUTE
from lets_plot.settings_utils import GEOCODING_PROVIDER_URL
class GeocodingService:
def do_request(self, request: Request) -> Response:
if not has_global_value(GEOCODING_PROVIDER_URL):
raise ValueError('Geocoding server url is not defined')
try:
request_json = RequestFormatter().format(request).to_dict()
request_str = json.dumps(request_json)
request = urllib.request.Request(
url=get_global_str(GEOCODING_PROVIDER_URL) + GEOCODING_ROUTE,
headers={'Content-Type': 'application/json', 'Accept-Encoding': 'gzip'},
method='POST',
data=bytearray(request_str, 'utf-8')
)
response = urllib.request.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
content = response.read()
response_str = gzip.decompress(content).decode('utf-8')
else:
response_str = response.read().decode('utf-8')
response_json = json.loads(response_str)
return ResponseParser().parse(response_json)
except HTTPError as e:
raise ValueError(
'Geocoding server connection failure: {} {} ({})'.format(e.code, e.msg, e.filename)) from None