Как я могу запросить все свои данные на расстоянии 5 метров?

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

ОБНОВЛЕНИЯ1 Я использую 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. что такое геометрия? является переменной? как его создать?
  3. что такое D? это функция? если да, то m является именем параметра функции D?

person eros    schedule 21.10.2011    source источник
comment
Пожалуйста, не ставьте теги в заголовке.   -  person ThiefMaster    schedule 24.10.2011


Ответы (4)


В общем, лучшей функцией 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 есть соответствующий фильтр с именем внутри:

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

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))')
person underdark    schedule 24.10.2011
comment
Как я уже писал ранее, что там D и geom? m имя параметра D нет? poly в чем смысл? __dwithin это не функция? - person eros; 24.10.2011
comment
Я пробовал, но не могу распознать. D — ошибка компиляции. как насчет poly, что это? - person eros; 25.10.2011
comment
Я ценю ваши ответы. Как насчет создания пространственного индекса? Вы имеете в виду, что мне нужно выполнить какую-то задачу, чтобы создать его? Если да, то как может быть? - person eros; 26.10.2011
comment
любой пример того, как сделать пространственную индексацию - person eros; 31.10.2011
comment
+1 за объяснение расстояния и внутри и того, что быстрее (поскольку синтаксис и использование в документах django для Distance_lte и dwithin идентичны, и это не дает никаких подсказок, что использовать) - person Anentropic; 31.03.2012

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

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

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

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

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

person tdihp    schedule 21.10.2011
comment
У меня есть два (2) уточнения.. 1) Почему вы не использовали ST_Distance(..) ‹ 5? Я думаю об использовании ST_Distance (например, Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))), но не знаю, как подготовить параметр. 2) Я новичок в Python GeoDjango, не могли бы вы привести пример того, как его использовать, и, пожалуйста, укажите, как подготовить значения параметров. - person eros; 21.10.2011
comment
@eros 1 ST_Distance тестирует множество геометрий (может быть, все геометрии во всей таблице, если вы не фильтруете), буфер и пересечение работают лучше, насколько я пытался. 2 я тоже новичок, скоро обновлю ответ - person tdihp; 21.10.2011
comment
как насчет «the_geom» и «геометрии»? - большое спасибо. Я с нетерпением жду вашего обновленного ответа. Кроме того, спасибо за рассмотрение производительности. Я пропустил эти моменты. С уважением. - person eros; 21.10.2011
comment
о, я уже обновил. геометрия — это поле геометрии в django и postgis, где вы храните свою карту/местоположение/... любые геоданные, геометрия по умолчанию для таблицы — «the_geom». замените его своим собственным именем поля геометрии. - person tdihp; 21.10.2011
comment
Вы должны использовать ST_DWithin вместо решения буфера + пересечения. ST_DWithin будет использовать пространственный индекс, который вы должны были создать, и поэтому превосходит ST_Distance. Создание геометрии буфера является ненужным накладным расходом. - person underdark; 22.10.2011
comment
@underdark не могли бы вы опубликовать это как ответ. и, пожалуйста, включите фрагмент. - person eros; 24.10.2011
comment
@tdihp 'the_geom' - это имя поля в моей таблице1. Но я не могу понять часть "геометрия". геометрия также является именем поля моей таблицы1? - person eros; 24.10.2011
comment
@underdark ST_D Насколько я помню, будет использоваться исходное измерение длины, а не метр. и, насколько я пытался, класс django Distance не решает эту проблему. - person tdihp; 27.10.2011
comment
@tdihp ST_DWithin будет использовать исходные измерения длины, если используются геометрии, и метры, если используются географические объекты. - person underdark; 27.10.2011

  1. что такое poly__distance_lte? это функция?

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


  1. что такое геом? является переменной? как его создать?

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


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

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

person lastoneisbearfood    schedule 12.03.2013

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

person Raj    schedule 28.09.2016