gpt4 book ai didi

python - SqlAlchemy/Sqlite距离计算

转载 作者:行者123 更新时间:2023-11-28 17:53:33 25 4
gpt4 key购买 nike

我正在使用 sqlAlchemy ORM,我想计算并返回给定点和存储点的距离。

class Event(Base):

__tablename__ = 'events'
# Schema
id = Column(Integer, primary_key=True)
title = Column(String(150))
description = Column(Text)
url = Column(String(800))
lat = Column(Float)
lng = Column(Float)

....和我的查询:

    nearest = """SELECT *, ((lat - '-41.288889') * (lat - '-41.288889')
+ (lng - 174.777222) * (lng - 174.777222)) AS distance FROM events
ORDER BY distance ASC """

e = Event.query.from_statement(nearest)

这似乎以正确的顺序返回对象,但我无法访问距离属性。我如何访问这个值 - 或者实现这个的最佳实践方法是什么?

最佳答案

问题 1:纬度和经度的长度不同......在赤道处相同(假设地球是一个球体)但在两极经度的长度为零。

更新举例说明问题的严重性:

向北或向南移动一个纬度将覆盖大约 111.2 公里(假设地球是一个球体)。向东或向西移动一个经度将在赤道覆盖约 111.2 公里。。在-41.3度的纬度上,它的覆盖范围只有83.5公里。

从 (-41.3, 174.8) 正东到 (-41.3, 174.92) 为 10.0 公里。您的计算将其视为 13.3 公里远 -- 33% 的误差

通过相当简单的近似,您可以将误差控制在 4 米以内:

from math import pi, sqrt, radians, cos
Earth_radius_km = 6371.009
km_per_deg_lat = 2 * pi * Earth_radius_km / 360.0

# what your SQL query is in effect doing
def approx_dist_1(lat1, lon1, lat2, lon2):
return km_per_deg_lat * sqrt((lat1 - lat2) ** 2 + (lon1 - lon2) ** 2)

# better version
def approx_dist_2(lat1, lon1, lat2, lon2):
# calculate km_per_deg_lon for your central station in Python and
# embed it in your query
km_per_deg_lon = km_per_deg_lat * cos(radians(lat1))
return sqrt((km_per_deg_lat *(lat1 - lat2)) ** 2 + (km_per_deg_lon * (lon1 - lon2)) ** 2)

这个近似距离对于“找到最近的披萨店”应用程序来说已经足够了,并且它的优点是可以在像 SQLite 这样不支持 sin/cos/tan 及其反函数的基本环境中使用盒子。

问题 2:SQLite 是容错的,但你不应该养成使用引号的习惯,如 (lat - '-41.288889')

问题 3:我无法在 SQLlite 级别重现您的问题:

sqlite> create table foo (lat float, lon float);
sqlite> insert into foo values(99.9, -170.1);
sqlite> select * from foo;
99.9|-170.1
sqlite> SELECT *, ((lat - '-41.288889') * (lat - '-41.288889')
...> + (lon - 174.777222) * (lon - 174.777222)) AS distance from foo;
99.9|-170.1|138874.600631492
sqlite>

也许你应该详细说明“这似乎以正确的顺序返回对象,但我无法访问距离属性”......内省(introspection) e 告诉你什么?

关于python - SqlAlchemy/Sqlite距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com