如何查询距离5米内的所有数据?

4 投票
4 回答
3245 浏览
提问于 2025-04-17 04:44

我正在使用GeoDjango和PostGIS,现在遇到了一个问题,就是如何查询我的Postgres数据库表,以获取距离5米内的所有数据。

更新1 我使用的是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是什么?是一个函数吗?如果是的话,mD函数的参数名吗?

4 个回答

1
  1. poly__distance_lte是什么?是个函数吗?

这个文档页面假设poly是你Zipcode模型里面的一个几何字段的名字。distance_lte只是一个查找过滤器,用来找到离某个点在一定距离内的对象。


  1. geom是什么?是个变量吗?怎么创建它?

它是一个之前定义的变量。要找到距离A点x英里以内的Zipcode对象,你需要先定义A点。geom就是这个定义。例如,它可以是django.contrib.gis.geos.Point。你可以设置这个点的经度和纬度,并把它当作你搜索圆的中心。在你得到的例子中,这个中心叫做geom


  1. D是什么?是个函数吗?如果是,m是D函数的参数名吗?

D是一个类。更具体地说,它是一个叫Distance的类的简写。你可以在django.contrib.gis.measure中找到它们。你可以使用各种实际的距离单位,比如公里、英里、米,来创建这个类的实例。在这种情况下,m代表米。

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

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

10

一般来说,处理这种查询时,最好的PostGIS函数是ST_DWithin()

如果两个几何图形之间的距离在指定范围内,它就会返回真。

比如,找出所有住在距离商店#1一千米以内的顾客:

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是你想要计算与邮政编码对象之间距离的几何图形。

dwithin()是使用的函数。

poly是邮政编码对象的几何属性。

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

撰写回答