-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
115 lines (94 loc) · 3.68 KB
/
app.py
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!flask/bin/python
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from model import db, Location, User
from elevation import fetch_elevaion
from geopy import distance
from config import app_config
get_distances_form_query = lambda rows, location, dist = lambda x: distance.vincenty(*x).meters: \
tuple(map( dist, \
map(lambda x: (
(x.latitude, x.longitude),
location
), rows) \
))
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(app_config[config_name])
db.init_app(app)
@app.route('/location/<name>', methods=["PUT","GET"])
def location_request(name):
"""Function that handles appending or fetching a location."""
print (request.form)
if request.method == 'PUT':
try:
lat = float(request.form["latitude"])
lon = float(request.form["longitude"])
except: return "", 400 # <- Bad request
db.session.add(Location(
name = name,
latitude = lat,
longitude = lon,
elevation = fetch_elevaion( ( (lat, lon),) )[0],
))
db.session.commit()
return jsonify({ "message" : "success" }), 201
if request.method == 'GET':
d = db.session.query(Location).filter_by(name = name).first()
if not d :
return '{}', 204
return jsonify({
"name": d.name,
"latitude": d.latitude,
"longitude": d.longitude,
"elevation": d.elevation,
}), 200
@app.route('/closest', methods=["GET"])
@app.route('/user/<user>/closest', methods=["GET"])
def closest_request(user = None):
""" This function processees request for the closest location avaiable."""
try:
lat = float(request.args.get("latitude"))
lon = float(request.args.get("longitude"))
except: return "{}", 400 # <- Bad request
r = db.session.query(Location).all()
distances = get_distances_form_query(r,(lat,lon))
if not distances:
return jsonify( {"closest": {}, }), 204
# looking for minimal distance
min_d = sorted(distances)[0]
d = r[distances.index(min_d)]
return jsonify({"closest": {
"name": d.name,
"latitude": d.latitude,
"longitude": d.longitude,
"elevation": d.elevation,
"distance": min_d
}}), 200
@app.route('/indistanceof', methods=["GET"])
@app.route('/user/<user>/indistanceof', methods=["GET"])
def indistanceof_request(user = None):
""" This function processes the request for a list of
locations in a certain radius from a given position
"""
try:
lat = float(request.args.get("latitude"))
lon = float(request.args.get("longitude"))
radius = float(request.args.get("radius"))
except: return "", 400 # <- Bad request
r = db.session.query(Location).all()
distances = get_distances_form_query(r, (lat,lon))
f = sorted( filter( lambda x: x and x < radius, distances) )
resp = []
for x, n in zip(sorted(f), range(len(f))):
d = r[distances.index(x)]
resp.append({
"name": d.name,
"latitude": d.latitude,
"longitude": d.longitude,
"elevation": d.elevation,
"distance": x,
"order": n
})
return jsonify({"indistance": resp, "radius": radius}), 200
return app