gpt4 book ai didi

django - GeoDjango 和 Postgis 中以米为单位的距离内位置的最佳查询

转载 作者:行者123 更新时间:2023-12-02 01:34:37 28 4
gpt4 key购买 nike

我在具有 GeoDjango 的默认 SRID、WGS84 的 Postgis 数据库中有几何图形,并且发现直接以度为单位的查找比以公里为单位要快得多,因为数据库可以跳过我认为的投影。

基本上,Place.objects.filter(location__distance__lte=(point, D(km=10)))Place.objects.filter(location__dwithin=(point, 10)) 慢几个数量级因为第一个查询会生成对表的完整扫描。但有时我需要查找以公里为单位的距离阈值的地方。

是否有某种精确的方法将 10 公里转换为查询的度数?
也许我应该使用另一个具有相同性能的等效查找?

最佳答案

您有多种方法可以解决您的问题,以下是其中两种:

如果你这样做 不太在意精度 你可以用 dwithin并使用简单的仪表到度数转换 degree(x meters) -> x / 40000000 * 360 .你会在赤道附近得到几乎准确的结果,但是当你向北或向南走时,你的距离会缩小(我们生活在一个球体上)。想象一个开始时是圆形的区域,然后缩小到接近其中一个极点的无限窄椭圆。

如果您 关心精度 您可以使用:

max_distance = 10000 # distance in meter
buffer_width = max_distance / 40000000. * 360. / math.cos(point.y / 360. * math.pi)
buffered_point = point.buffer(buffer_width)
Place.objects.filter(
location__distance__lte=(point, D(m=max_distance)),
location__overlaps=buffered_point
)

基本思想是查询在您的 point 周围的圆圈内的所有点。在学位。这部分非常高效,因为圆圈是度数并且可以使用地理索引。但是圆圈有时有点大,所以我们将过滤器保留在米中以过滤掉可能比允许的距离稍远的地方 max_distance .

关于django - GeoDjango 和 Postgis 中以米为单位的距离内位置的最佳查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31940674/

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