gpt4 book ai didi

python - 使用余弦球面定律在 Django 中按邻近度过滤邮政编码

转载 作者:太空狗 更新时间:2023-10-29 18:16:17 24 4
gpt4 key购买 nike

我正在尝试处理 Django 中基本商店定位器的邻近搜索。我不想在我的应用程序中使用 PostGIS 来使用 GeoDjango 的距离过滤器,而是想在模型查询中使用余弦球面定律距离公式。为了提高效率,我希望所有计算都在一次查询中在数据库中完成。

来自 Internet 的 MySQL 查询示例实现了余弦球面定律,如下所示:

SELECT id, ( 
3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) *
sin( radians( lat ) ) )
)
AS distance FROM stores HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

查询需要为每个商店的纬度/经度值引用邮政编码外键。如何在 Django 模型查询中完成所有这些工作?

最佳答案

有可能执行 raw SQL queries in Django .

我的建议是,编写查询以提取 ID 列表(看起来您现在正在这样做),然后使用 ID 提取关联的模型(在常规的非原始 SQL Django 查询中) .尽量让您的 SQL 尽可能独立于方言,这样如果您不得不切换数据库,就不必再担心一件事。

为了澄清,这里有一个如何做到这一点的例子:

def get_models_within_25 (self):
from django.db import connection, transaction
cursor = connection.cursor()

cursor.execute("""SELECT id, (
3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) *
sin( radians( lat ) ) ) )
AS distance FROM stores HAVING distance < 25
ORDER BY distance LIMIT 0 , 20;""")
ids = [row[0] for row in cursor.fetchall()]

return MyModel.filter(id__in=ids)

作为免责声明,我不能保证这段代码,因为我已经几个月没写任何 Django 了,但它应该是正确的。

关于python - 使用余弦球面定律在 Django 中按邻近度过滤邮政编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916953/

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