gpt4 book ai didi

django - 如何在GeoDjango中添加点距离作为注释

转载 作者:行者123 更新时间:2023-12-03 22:46:46 26 4
gpt4 key购买 nike

我有一个带有单个 PointField 的地理模型,我希望为每个模型与给定点的距离添加注释,稍后我可以对其进行过滤并进行额外的jiggery pokery。

有明显的 queryset.distance(to_point)函数,但这实际上并没有注释查询集,它只是为查询集中的每个模型添加了一个距离属性,这意味着我不能然后应用 .filter(distance__lte=some_distance)以后再说吧。

我也知道按场和距离本身进行过滤,如下所示:

queryset.filter(point__distance_lte=(to_point, D(mi=radius)))

但由于我想做多个过滤器(以获得不同距离范围内的模型计数),我真的不想让 DB 每次都计算与给定点的距离,因为这可能很昂贵。

有任何想法吗?具体来说,有没有办法将其添加为常规注释而不是每个模型的插入属性?

最佳答案

我找不到任何烘焙方法,所以最后我创建了自己的聚合类:

这仅适用于 post_gis,但为另一个地理数据库制作一个不应该太棘手。

from django.db.models import Aggregate, FloatField
from django.db.models.sql.aggregates import Aggregate as SQLAggregate


class Dist(Aggregate):
def add_to_query(self, query, alias, col, source, is_summary):
source = FloatField()
aggregate = SQLDist(
col, source=source, is_summary=is_summary, **self.extra)
query.aggregates[alias] = aggregate


class SQLDist(SQLAggregate):
sql_function = 'ST_Distance_Sphere'
sql_template = "%(function)s(ST_GeomFromText('%(point)s'), %(field)s)"

这可以按如下方式使用:
queryset.annotate(distance=Dist('longlat', point="POINT(1.022 -42.029)"))

任何人都知道这样做的更好方法,请告诉我(或告诉我为什么我的很愚蠢)

关于django - 如何在GeoDjango中添加点距离作为注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24182064/

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