我正在使用Python和Sqlalchemy將經度和緯度值存儲在Sqlite數據庫中。我創建了一個hybrid method爲我的地址對象,Python - SqlAlchemy:按大圓距離過濾查詢?
@hybrid_method
def great_circle_distance(self, other):
"""
Tries to calculate the great circle distance between the two locations
If it succeeds, it will return the great-circle distance
multiplied by 3959, which calculates the distance in miles.
If it cannot, it will return None.
"""
return math.acos( self.cos_rad_lat
* other.cos_rad_lat
* math.cos(self.rad_lng - other.rad_lng)
+ self.sin_rad_lat
* other.sin_rad_lat
) * 3959
所有值一樣cos_rad_lat
和sin_rad_lat
是我預先計算優化的計算值。總之,當我運行下面的查詢,
pq = Session.query(model.Location).filter(model.Location.great_circle_distance(loc) < 10)
我碰到下面的錯誤,
line 809, in great_circle_distance
* math.cos(self.rad_lng - other.rad_lng)
TypeError: a float is required
當我打印值self.rad_lng
和other.rad_lng
我得到的,例如,
self.rad_lng: Location.rad_lng
other.rad_lng: -1.29154947064
我在做什麼錯?
這不是haversine公式,它是餘弦公式的球形法律。請參閱(例如)http://www.movable-type.co.uk/scripts/latlong.html –
我們可以看到一個更完整的「Location」類示例嗎?特別是,每個屬性如何成爲現實。他們是否是階級屬性? – SingleNegationElimination
哎呀,你是對的。不是馬丁,只是大圓距離。 – john