import gevent from gevent.pywsgi import WSGIServer from gevent.queue import Queue from gevent.monkey import patch_all from gevent.subprocess import Popen, PIPE, STDOUT patch_all() import sys import os import json from flask import ( Flask, request, render_template, send_from_directory, send_file, make_response, jsonify, Response, ) app = Flask(__name__) MYDIR = os.path.abspath(os.path.dirname("__file__")) sys.path.append(os.path.join(MYDIR, "lib")) CACHEDIR = os.path.join(MYDIR, "cache") from geopy.geocoders import Nominatim # , Mapzen # geomapzen = Mapzen("mapzen-RBNbmcZ") # Nominatim() geoosm = Nominatim(timeout=7, user_agent="wttrin-geo/0.0.2") import airports # from tzwhere import tzwhere import timezonefinder tf = timezonefinder.TimezoneFinder() def load_cache(location_string): try: location_string = location_string.replace("/", "_") cachefile = os.path.join(CACHEDIR, location_string) return json.loads(open(cachefile, "r").read()) except: return None def shorten_full_address(address): parts = address.split(",") if len(parts) > 6: parts = parts[:2] + [x for x in parts[-4:] if len(x) < 20] return ",".join(parts) return address def save_cache(location_string, answer): location_string = location_string.replace("/", "_") cachefile = os.path.join(CACHEDIR, location_string) open(cachefile, "w").write(json.dumps(answer)) def query_osm(location_string): try: location = geoosm.geocode(location_string) return { "address": location.address, "latitude": location.latitude, "longitude": location.longitude, } except Exception as e: print(e) return None def add_timezone_information(geo_data): # tzwhere_ = tzwhere.tzwhere() # timezone_str = tzwhere_.tzNameAt(geo_data["latitude"], geo_data["longitude"]) timezone_str = tf.certain_timezone_at( lat=geo_data["latitude"], lng=geo_data["longitude"] ) answer = geo_data.copy() answer["timezone"] = timezone_str return answer @app.route("/") def find_location(location): airport_gps_location = airports.get_airport_gps_location( location.upper().lstrip("~") ) is_airport = False if airport_gps_location is not None: location = airport_gps_location is_airport = True location = location.replace("+", " ") answer = load_cache(location) loaded_answer = None if answer is not None: loaded_answer = answer.copy() print("cache found: %s" % location) if answer is None: answer = query_osm(location) if is_airport: answer["address"] = shorten_full_address(answer["address"]) if "timezone" not in answer: answer = add_timezone_information(answer) if answer is not None and loaded_answer != answer: save_cache(location, answer) if answer is None: return "" else: r = Response(json.dumps(answer)) r.headers["Content-Type"] = "text/json; charset=utf-8" return r app.config["JSON_AS_ASCII"] = False server = WSGIServer(("127.0.0.1", 8004), app) server.serve_forever()