Pregunta

Necesito usar una base de datos Postgis existente desde mi aplicación Rails. Hasta ahora puedo acceder a la DB muy bien, Georuby convierte muy bien la columna 'Geom' en un objeto de punto.

Lo que estoy buscando es una manera fácil de ejecutar consultas similares a Activerecord en esas tablas, por ejemplo,

Poi.find_within_radius(...)

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

Probé varias combinaciones de geokit, acompañando complementos de rieles, pero estoy bastante seguro de que debe haber algo mejor en el universo Ruby/Rails. ¿Alguna pista?

¿Fue útil?

Solución

Desde que tienes Georuby, pon tu modelo 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 puede usar métodos en los objetos de punto

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

Otros consejos

Añadiendo a Respuesta de Synecdoche, en Rails 3 puedes usar ActiveRelation ámbitos, que te permitirían encadenar consultas.

No probado:

# 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 encadenas los ámbitos, la mayoría de las veces es mejor que usar métodos de clase.

St_distance () no significa que probablemente no tenga instalado después de las gelatinas o no creó una plantilla de posgis ... o no creó su base de datos utilizando la plantilla posterior a la GAGIS si la plantilla existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top