def nearest(request):
try:
x = request.params['x']
y = request.params['y']
z = request.params['z']
if 'limit' in request.params:
limit = request.params['limit']
else:
limit = 10
if 'include' in request.params:
include = True
else:
include = False
if 'cubesize' in request.params:
cubesize = request.params['cubesize']
else:
cubesize = 200
if 'aggressive' in request.params:
sql = text('SELECT *,(sqrt((systems.X - ' + x + ')^2 + (systems.Y - ' +
y + ')^2 + (systems.Z - ' + z + '0)^2)) as DISTANCE from '
'systems WHERE x BETWEEN ' + str(float(x)-cubesize) + ' AND ' +
str(float(x)+cubesize) + ' AND y BETWEEN ' + str(float(y)-cubesize) +
' AND ' + str(float(y)+cubesize) +' AND z BETWEEN ' +
str(float(z)-cubesize) + ' AND '+ str(float(z)+cubesize) +
' ORDER BY DISTANCE LIMIT ' + str(limit) + ';')
else:
sql = text('SELECT *,(sqrt((populated_systems.X - ' + x + ')^2 + (populated_systems.Y - ' +
y + ')^2 + (populated_systems.Z - ' + z + '0)^2)) as DISTANCE from '
'populated_systems ORDER BY DISTANCE LIMIT ' + str(limit) + ';')
result = DBSession.execute(sql)
candidates = []
ids = []
bodies = []
stations = []
for row in result:
candidates.append({'name': row['name'], 'distance': row['distance'], 'id': row['id']})
ids.append(row['id'])
if include:
query = DBSession.query(Body).filter(Body.system_id.in_(tuple(ids)))
results = query.all()
for row in results:
bodies.append(object_as_dict(row))
query = DBSession.query(Station).filter(Station.system_id.in_(tuple(ids)))
results = query.all()
for row in results:
stations.append(object_as_dict(row))
except DBAPIError:
return Response(db_err_msg, content_type='text/plain', status=500)
if bodies:
return {'meta': {'query_x': x, 'query_y': y, 'query_z': z, 'limit': limit, 'cubesize': cubesize,
'include': include},
'candidates': candidates, 'included': {'bodies': bodies, 'stations': stations}}
else:
return {'meta': {'query_x': x, 'query_y': y, 'query_z': z, 'limit': limit, 'cubesize':cubesize,
'included': include},
'data': candidates}
评论列表
文章目录