Доступ к пространственным данным PostGIS из Rails - PullRequest
7 голосов
/ 07 октября 2009

Мне нужно использовать существующую базу данных PostGIS из моего приложения Rails. Пока у меня есть доступ к БД, но GeoRuby прекрасно преобразует столбец 'geom' в объект Point.

То, что я ищу, это простой способ выполнения ActiveRecord-подобных запросов к этим таблицам, например,

Poi.find_within_radius(...)

или аналогичные пространственные запросы, такие как расчеты расстояния и т.д. и др.

Я пробовал несколько комбинаций геокита, сопровождающих плагины rails, но я вполне уверен, что во вселенной ruby ​​/ rails должно быть что-то лучшее. Есть намеки?

Ответы [ 3 ]

6 голосов
/ 09 октября 2009

Поскольку у вас есть GeoRuby, вставьте вашу модель Poi

SRID = 4326 #WGS84

# geometry column is geom
# pt is a GeoRuby Point
def self.find_within_radius(pt, dist = 0.01)
  self.all :conditions => "ST_DWithin(geom, ST_GeomFromText('POINT(#{pt.x} #{pt.y})', #{SRID}), #{dist})"
end

Для расчета расстояний вы можете использовать методы для точечных объектов

dist_circle = poi1.geom.spherical_distance(poi2.geom)
dist_projected = poi1.geom.euclidean_distance(poi2.geom)
1 голос
/ 08 ноября 2011

Добавляя к ответу synecdoche , в Rails 3 вы можете использовать ActiveRelation области, которые позволят вам связывать запросы.

Непроверенные:

# Poi.rb

scope :within, proc { |point, distance|
  p = "POINT(#{point.x} #{point.y})"
  where("ST_DWithin(geom, ST_GeomFromText('#{p}', #{SRID}), #{distance})")
}

scope :rated, proc { |rating| where(rating: rating) }

Usage:

home = Point.new(5,5)
Poi.rated(5).within(home, 25)

Даже если вы не объединяете области видимости, в большинстве случаев это лучше, чем использование методов класса.

0 голосов
/ 02 декабря 2010

ST_Distance () не означает, что вы, вероятно, не установили postgis, или вы не создали шаблон postgis ... или вы не создали свою базу данных, используя шаблон postgis, если шаблон существует.

...