Completely untested, but hopefully sends you in the right direction:
from sqlalchemy import func, literal, Column, Integer, Numeric, MetaData
metadata = MetaData()
markers = Table("markers", metadata,
Column("id", Integer, primary_key=True),
Column("lat", Numeric),
Column("lng", Numeric),
)
origin_lat = 37
origin_lng = -122
distance = (
3959
* func.acos(func.cos(func.radians(literal(origin_lat))))
* func.cos(func.radians(markers.lat))
* func.cos(func.radians(markers.lng) - func.radians(literal(origin_lng)))
+ func.sin(func.radians(literal(origin_lat)))
* func.sin(func.radians(markers.lat))
)
query = (
session.query(markers.lat, markers.lng, distance.label("distance"))
.having(distance < literal(25))
.order_by(distance)
.limit(20)
)
-Ryan Kelly