代码之家  ›  专栏  ›  技术社区  ›  hendrixski

杰德扬戈,德维辛和距离的区别?

  •  17
  • hendrixski  · 技术社区  · 16 年前

    使用geodjango,两者之间的区别是什么?

    myObj.objects.filter(point__dwithin(...etc.))   
    

    myObj.objects.filter(point__distance_lt(...etc.))  
    

    ?
    他们是在做同样的事情,还是在做微妙的不同的事情?

    1 回复  |  直到 16 年前
        1
  •  28
  •   Felix Kling    16 年前

    好吧,我做了一些研究,但我不知道结果是否有用;)

    • 我看了一下 unit tests 他们用来测试数据库查询,但没有给出真正的提示(给我)。

    • 我尝试比较生成的SQL:

    我已经有一个地理应用程序使用 波斯特雷斯尔 数据库。当我使用 __distance_lt :

    Place.objects.filter(location__distance_lt=(p.location, D(km=1))).query.as_sql()
    

    我得到这个生成的SQL:

    SELECT (some_fields_here)
    FROM "places_place" 
    WHERE ST_distance_sphere("places_place"."location", %s) < 1000.0
    

    当我试图用do to the same with __dwithin ,我得到一个错误:

    Place.objects.filter(location__dwithin=(p.location, D(km=1))).query.as_sql()
    
    TypeError: Only numeric values of degree units are allowed on geographic DWithin queries.
    

    所以我不得不将查询更改为“不使用” D 对象:

    Place.objects.filter(location__dwithin=(p.location, 1)).query.as_sql()
    

    结果是

    SELECT (some fields here) 
    FROM "places_place" 
    WHERE ST_DWithin("places_place"."location", %s, 1)
    

    总结:

    内隐
    -将度值作为距离参数。
    -用途 ST_DWithin SQL函数。

    γ距离
    -可以采用其他距离值;)。
    -用途 ST_distance_sphere SQL函数。

    顺便说一句,两个查询的结果不同,但我想这主要是因为我不知道要使用哪个“degree”值。