Skip to content Skip to sidebar Skip to footer

How Can I Query All My Data Within A Distance Of 5 Meters?

I am using GeoDjango with PostGIS. Then I am into trouble on how to query my postgres db table to get all data within a distance of 5 meters. UPDATES1 I am using GeoDjango 1.2.7 I

Solution 1:

In general, the best PostGIS function for such a query is ST_DWithin():

Returns true if the geometries are within the specified distance of one another.

eg. all customers that live within 1000 meters of shop #1:

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

ST_DWithin will use the spatial index which you should have created and therefore outperform ST_Distance.

In Django there seems to be a corresponding filter called dwithin:

Returns models where the distance to the geometry field from the lookup geometry are within the given distance from one another.

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

D(m=5) returns a distance object of length 5 meters

geom is the geometry from which you want to calculate distances to Zipcode objects

dwithin() is the function used

poly is the geometry attribute of Zipcode objects

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

Solution 2:

I just did this a few days ago.

it is fairly hard because you should create a geography rather than a geometry point, to have access to meter unit.

so I just did it in a small extra where query

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

notice the geography part and the buffer part.


Solution 3:

  1. what is poly__distance_lte? is a function?

The document page assumes poly to be the name of the geometry field within your Zipcode model. distance_lte is just a lookup filter that finds objects within a certain distance of a point.


  1. what is geom? is a variable? how to create it?

It's a previously defined variable. To find Zipcode objects with the poly field that are within a distance of x miles from point A, you need to define point A. geom is that definition. For example, it could be a django.contrib.gis.geos.Point. You can set the latitude and longitude of that point and use it as the center of your search circle. In the example you obtained, this center is named geom


  1. what is D? is a function? if yes, m is a parameter name of D function?

D is a class. More specifically, it's a short alias for the class called Distance. They both can be found in django.contrib.gis.measure. You can create an instance of this class using various real world distance metrics such as kilometers, miles, meter. In this case m is for meter.


Solution 4:

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


Post a Comment for "How Can I Query All My Data Within A Distance Of 5 Meters?"