Как я могу запросить все мои данные на расстоянии 5 метров? - PullRequest
3 голосов
/ 21 октября 2011

Я использую GeoDjango с PostGIS.Тогда у меня возникают проблемы с тем, как запросить мою таблицу postgres db, чтобы получить все данные на расстоянии 5 метров.

UPDATES1 Я использую GeoDjango 1.2.7

Я нашел что-то из этого URL 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 ]

10 голосов
/ 24 октября 2011

В общем, лучшая функция PostGIS для такого запроса: ST_DWithin () :

Возвращает true, если геометрия находится на указанном расстоянии друг от друга.

например. все клиенты, которые живут в пределах 1000 метров от магазина № 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 - это геометрия, из которой вы хотите вычислить расстояния до объектов Zipcode

dwithin () - используемая функция

poly является атрибутом геометрии объектов Zipcode

z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')
1 голос
/ 28 сентября 2016
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

ссылка из проекта Django

1 голос
/ 12 марта 2013
  1. что такое poly__distance_lte? такое функция?

На странице документа предполагается, что poly является именем геометрического поля в вашей Zipcode модели. distance_lte - это просто фильтр поиска, который находит объекты на определенном расстоянии от точки.


* * 1010 что такое geom? такое переменная? как его создать?

Это предварительно определенная переменная. Чтобы найти Zipcode объекты с полем poly, которые находятся на расстоянии х миль от точки A, вам нужно определить точку A. geom является этим определением. Например, это может быть django.contrib.gis.geos.Point. Вы можете установить широту и долготу этой точки и использовать ее в качестве центра круга поиска. В полученном примере этот центр называется geom


  1. что такое D? такое функция? если да, m является именем параметра функции D?

D это класс. Точнее, это короткий псевдоним для класса Distance. Они оба могут быть найдены в django.contrib.gis.measure. Вы можете создать экземпляр этого класса, используя различные реальные метрики расстояния, такие как километры, мили, метры. В этом случае м для метра.

1 голос
/ 21 октября 2011

Я только что сделал это несколько дней назад.

это довольно сложно, потому что вы должны создать географию, а не геометрическую точку, чтобы иметь доступ к единице измерения.

так что я просто сделал это в небольшом дополнительном, где запрос

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

обратите внимание на географию и буферную часть.

...