2009-10-07 14 views
7

Necesito usar una base de datos PostGIS existente de mi aplicación Rails. Hasta ahora puedo acceder al DB muy bien, GeoRuby convierte muy bien la columna 'geom' en un objeto Point.Acceso a los datos espaciales de PostGIS desde Rails

Lo que estoy buscando es una manera fácil de ejecutar consultas similares a ActiveRecord en esas tablas, p.

Poi.find_within_radius(...) 

o consultas espaciales similares como cálculos de distancia et. Alabama.

Probé varias combinaciones de geokit, que acompañan a los complementos de los rieles, pero estoy bastante seguro de que debe haber algo mejor en el universo ruby ​​/ rails. ¿Algún consejo?

Respuesta

6

ya que tienes GeoRuby, poner en su modelo de 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 

Para los cálculos de distancia se pueden utilizar métodos en el punto de objetos

dist_circle = poi1.geom.spherical_distance(poi2.geom) 
dist_projected = poi1.geom.euclidean_distance(poi2.geom) 
+0

¡Gracias por las muestras, las probé y funcionan como un amuleto! Ahora tengo un punto de partida para investigar un poco más (o incursionar en mi caso ...) – Lakitu

0

ST_Distance() no le significa, probablemente, no tiene postgis instalado o no creó una plantilla de postgis ... o no creó su base de datos usando la plantilla de postgis si la plantilla existe.

1

Agregando a synecdoche's answer, en Rails 3 puede usar los alcances ActiveRelation, que le permiten encadenar consultas.

No comprobado:

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

Uso:

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

Incluso si no lo hace alcances de la cadena, la mayoría de las veces es mejor que usar métodos de clase.

Cuestiones relacionadas