计算GeoDjango中同一模型上的字段之间的距离

时间:2017-04-15 10:15:39

标签: django geodjango

我想计算GeoDjango中同一模型上两个字段之间的距离。这是我尝试这样做的方式:

posts = Post.objects.filter(location__distance_lte=(ref_location,D(km=F('i_move'))

其中location是PointField,i_move是float。然而,这不起作用,django投掷:

  

float()参数必须是字符串或数字,而不是' F'

我还试图先获得一个大数字的距离,而不是注释,之后比较距离现场的距离:

Post.objects.filter(location__distance_lte=(ref_location, D(km=100))
                                          ).annotate(distance=Distance('location', ref_location)
                                            ).filter(distance=F('i_move'))

这根本不起作用,不会抛出任何错误。

虽然我觉得这个问题不是最新的,但我找不到任何人做类似的事情。

1 个答案:

答案 0 :(得分:0)

似乎不可能使用F字段查找以传统的方式进行。我最终使用了额外的查询参数和postgres的Type definitions函数,这实际上非常好,因为它返回以米为单位的距离:

posts = Post.objects.filter(....).extra(
   where=['ST_Distance_Sphere(location::geometry, ST_GeomFromText(%s)) <= i_move*1000'],
   params=[ref_location.wkt])

ref_location是一个django Point(),location是一个PointField,而i_move是一个float。 Django Points有一个wkt方法来获取他们的wkt表示。但是,当ST_Distance_Sphere接受几何对象时,应使用postgres cast&#34; ::&#34;和ref_location使用St_Distance_Sphere函数转换位置。