2017-04-15 136 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函數轉換位置。

相關問題