2017-04-15 61 views
1

我想要计算GeoDjango中同一模型上两个字段之间的距离。下面是我想要做的方式:GeoDjango中同一模型上的字段之间的计算距离

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

凡位置是PointField和i_move是一个浮动。然而,这是不行的,在Django投掷:

浮动()参数必须是一个字符串或数字,而不是“F”

我也试图首先与一个大的距离数比注释,之后的距离比到外地:

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

这根本不起作用,没有错误抛出。

我不能找到任何人做类似的事情,但我认为这个问题不是最近的。

回答

0

看来,这是不可能做到传统的使用F字段查找的方式。我结束了使用额外的查询参数,和Postgres的St_Distance_Sphere功能,这实际上是因为它返回以米为单位的距离非常好:)

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

ref_location是一个Django点(,位置是PointField和i_move是一个浮动。 Django Points有一种方法来获得他们的wkt表示。但是,当ST_Distance_Sphere传递给几何对象时,应使用postgres强制转换“::”来转换位置,使用ST_GeomFromText函数转换位置。