Acceso a los datos espaciales posteriores a la GRANS de los rieles
-
20-09-2019 - |
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?
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.