Python 如何查询5米范围内的所有数据?

Python 如何查询5米范围内的所有数据?,python,postgresql,postgis,geodjango,Python,Postgresql,Postgis,Geodjango,我正在使用GeoDjango和PostGIS。然后,我陷入了如何查询我的postgres db表以获取5米范围内的所有数据的麻烦中 更新1 我正在使用GeoDjango 1.2.7 我从这个url找到了一些东西 Zipcode.objects.filter(poly_uudistance\u lte=(geom,D(*m*=5))) 但不知道如何准备参数和变量 什么是聚合距离?是函数吗 什么是几何图形?是一个变量吗?如何创建它 什么是D?是函数吗?如果是,m是D函数的参数名 我几天前刚做的 这是

我正在使用GeoDjango和PostGIS。然后,我陷入了如何查询我的postgres db表以获取5米范围内的所有数据的麻烦中

更新1 我正在使用GeoDjango 1.2.7

我从这个url找到了一些东西

Zipcode.objects.filter(poly_uudistance\u lte=(geomD(*m*=5)))

但不知道如何准备参数和变量

  • 什么是聚合距离?是函数吗
  • 什么是几何图形?是一个变量吗?如何创建它
  • 什么是D?是函数吗?如果是,mD函数的参数名

  • 我几天前刚做的

    这是相当困难的,因为您应该创建一个地理位置,而不是一个几何图形点,以访问米单位

    所以我只是在一个额外的where查询中做了这个

    extra_where = '''
        ST_Intersects(
                the_geom, geometry(ST_Buffer(ST_GeographyFromText(\'%s\'), %f)))
    '''
    your_point = 'POINT(1 2)'
    your_distance = 5 # meters
    YourModule.object.filter(something).extra(where=extra_where%(your_point, your_distance))
    

    请注意地理部分和缓冲区部分。

    一般来说,用于此类查询的最佳PostGIS功能是:

    如果几何图形之间的距离在指定范围内,则返回true

    Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
    Backend   SQL Equivalent
    PostGIS   ST_DWithin(poly, geom, 5)
    
    例如,居住在商店1000米范围内的所有客户#1:

    ST_DWithin将使用您应该创建的空间索引,因此优于ST_Distance

    在Django中,似乎有一个名为的对应过滤器:

    返回从查找几何图形到几何图形字段的距离在给定距离内的模型

    Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
    Backend   SQL Equivalent
    PostGIS   ST_DWithin(poly, geom, 5)
    
    D(m=5)返回长度为5米的距离对象

    geom是要从中计算到Zipcode对象距离的几何体

    z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')
    
    dwithin()是使用的函数

    多边形是Zipcode对象的几何体属性

    z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')
    
  • 什么是多边形距离?是函数吗
  • 文档页面假定
    poly
    Zipcode
    模型中几何体字段的名称
    distance\u lte
    只是一个查找过滤器,用于查找距离某个点一定距离内的对象


  • 什么是geom?是一个变量吗?如何创建它
  • 它是以前定义的变量。若要查找距离点a x英里范围内具有
    poly
    字段的
    Zipcode
    对象,需要定义点a。
    geom
    就是该定义。例如,它可以是一个
    django.contrib.gis.geos.Point
    。您可以设置该点的纬度和经度,并将其用作搜索圆的中心。在您获得的示例中,该中心被命名为
    geom


  • 什么是D?是函数吗?如果是,m是D函数的参数名
  • D
    是一个类。更具体地说,它是名为
    Distance
    的类的短别名。它们都可以在
    django.contrib.gis.measure
    中找到。您可以使用各种实际距离度量(如公里、英里、米)创建此类的实例。在这种情况下,m代表仪表

    from django.contrib.gis.measure import Distance, D
    
    d1 = Distance(km=5)
    print d1
    d2 = D(mi=5) # `D` is an alias for `Distance`
    print d2
    5.0 mi
    

    我有两(2)项澄清。。1) 你为什么不使用ST_距离(…)<5?我正在考虑使用ST_Distance(例如Zipcode.objects.filter(poly__Distance_lte=(geom,D(m=5))),但不知道如何准备参数。2) 我是Python GeoDjango的新手,请举例说明如何使用它,并说明如何准备参数值。@eros 1 ST_Distance测试了很多几何图形(如果不进行过滤,可能整个表中的所有几何图形),buffer和intersect的性能比我所尝试的要好。2我自己也是新手,我会尽快更新关于“几何”和“几何”的答案谢谢。我期待着看到你最新的答案。同时,感谢您考虑此次演出。我错过了那一点。问候。哦,我已经更新了。geometry是django和postgis中的一个几何字段,用于存储地图/位置/。。。对于任何地理数据,表的默认几何图形都是“the_geom”。将其替换为您自己的几何体字段名。您应该使用ST_DWithin而不是buffer+intersects解决方案。ST_DWithin将使用您应该创建的空间索引,因此性能优于ST_Distance。创建缓冲区几何体是不必要的开销。就像我之前发布的一样,
    D
    geom
    是什么
    m
    D
    的参数名,不是吗<代码>多边形是重点吗
    \uu dwithin
    是一个函数,不是吗?我试过了,但无法识别。D是编译错误。poly怎么样,是什么?谢谢你的回答。创建空间索引怎么样?你的意思是我需要做一些任务来创建它吗?如果是,怎么可能?任何关于如何使用空间索引+1来解释距离与内距离以及哪个更快的示例(因为django docs中距离和dwithin的语法和用法是相同的,并且没有给出任何使用的提示),请不要在标题中添加标签。