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

时间:2011-10-21 04:58:04

标签: python postgresql postgis geodjango

我正在使用GeoDjango和PostGIS。然后我就如何查询我的postgres数据库表以获取5米范围内的所有数据而遇到麻烦。

UPDATES1 我正在使用GeoDjango 1.2.7

我在此网址https://docs.djangoproject.com/en/dev/ref/contrib/gis/geoquerysets/#std:fieldlookup-distance_lte

中找到了一些内容

Zipcode.objects.filter( poly__distance_lte =( geom D (* m * = 5) ))

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

  1. 什么是 poly_distance_lte ?是一个功能?
  2. 什么是 geom ?是一个变量?如何创建它?
  3. 什么是 D ?是一个功能?如果是, m D 功能的参数名称?

4 个答案:

答案 0 :(得分:10)

一般来说,此类查询的最佳PostGIS功能是 ST_DWithin()

  

如果几何在彼此的指定距离内,则返回true。

例如。所有居住在距离商店#1的1000米范围内的客户:

SELECT customers.* 
FROM customers, shops
WHERE ST_DWithin(customers.the_geog, shops.the_geog, 1000)
  AND shop.id = 1

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

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

  

返回模型,其中查找几何体与几何体字段的距离在彼此给定的距离内。

Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
Backend   SQL Equivalent
PostGIS   ST_DWithin(poly, geom, 5)

D(m = 5)返回长度为5米的距离物体

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

dwithin()是使用的函数

poly是Zipcode对象的几何属性

z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')

答案 1 :(得分:1)

我几天前就这样做了。

这是相当困难的,因为你应该创建一个地理而不是几何点,才能访问仪表单元。

所以我只是在一个小额外的地方进行查询

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))

注意地理位置部分和缓冲区部分。

答案 2 :(得分:1)

  1. 什么是poly__distance_lte?是一个功能?
  2. 文档页面假定polyZipcode模型中几何字段的名称。 distance_lte只是一个查找过滤器,用于查找某点距离内的对象。


    1. 什么是geom?是一个变量?如何创建它?
    2. 这是先前定义的变量。要查找距离A点距离x英里的Zipcode字段的poly个对象,您需要定义A点。geom就是该定义。例如,它可以是django.contrib.gis.geos.Point。您可以设置该点的纬度和经度,并将其用作搜索圈的中心。在您获得的示例中,此中心名为geom


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

答案 3 :(得分:1)

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

reference from django project