Упорядочить по ближайшему - PostGIS, GeoRuby, пространственный_адаптер - PullRequest
7 голосов
/ 25 февраля 2011

Я пытаюсь выполнить запрос заказа, который находит записи, ближайшие к current_user.

Я знаю, что расстояние между двумя точками: current_location.euclidean_distance(@record.position)

Как я могу включить это в запрос PostGIS (или active_record /atial_adapter)?

Ответы [ 6 ]

14 голосов
/ 25 февраля 2011

Чтобы получить 5 ближайших:

SELECT * FROM your_table 
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt)) 
limit 5;

Если у вас большой набор данных и вы знаете, что не хотите искать дальше, скажем, 1 км, запрос будет более эффективным, если вы сделаете это.:

SELECT * FROM your_table 
WHERE ST_DWithin(your_table.geom, ST_Geomfromtext(your point as wkt, 1000)
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt))  
limit 5;

/ Никлас

6 голосов
/ 10 апреля 2014

На всякий случай, если кто-то наткнется на эту проблему в рельсах 4. Я использую RGEO Gem, и это работает для меня

scope :closest, ->(point) { order("ST_Distance(lonlat, ST_GeomFromText('#    {point.as_text}', #{SRID}))").limit(5) }
2 голосов
/ 20 апреля 2012

Если вы действительно хотите найти буквально 5 записей, ближайших к current_user, рассмотрите поиск окрестностей, который поддерживается индексом KNN в PostGIS 2.0 (см. Оператор «<->»):

SELECT * FROM your_table ORDER BY your_table.geom <-> ST_Geomfromtext(your point as wkt, 1000) LIMIT 5

2 голосов
/ 25 февраля 2011

Чтобы обернуть это, с помощью всех, я получил это работает, как я хотел:

order("ST_Distance(items.position, ST_GeomFromText('POINT (#{current_location.y} #{current_location.x})', #{SRID}))")
1 голос
/ 25 февраля 2011

Посмотрите документацию ST_Distance в PostGIS.

0 голосов
/ 25 февраля 2011

Если вам НЕ НУЖНО использовать PostGIS, Geo-Kit делает это прекрасно, используя Google или Yahoo (я только использовал Google), и в ваших запросах вы можете сортировать по расстоянию, это здорово ..

...