2009-10-07 15 views
7

Potrzebuję użyć istniejącej bazy danych PostGIS z mojej aplikacji Rails. Do tej pory jestem w stanie uzyskać dostęp do bazy danych, więc GeoRuby ładnie przekształca kolumnę "geom" w obiekt Point.Uzyskiwanie dostępu do danych przestrzennych PostGIS z szyn

To, czego szukam, to prosty sposób na wykonywanie zapytań typu ActiveRecord w tych tabelach, np.

Poi.find_within_radius(...) 

lub podobne zapytania przestrzenne, takie jak obliczenia odległości itp. glin.

Próbowałem kilku kombinacji geokitów, dołączając wtyczki do szyn, ale jestem pewien, że w świecie ruby ​​/ railów musi być coś lepszego. Jakieś wskazówki?

Odpowiedz

6

Skoro masz GeoRuby, umieścić w modelu 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 

Do obliczeń odległości można używać metod w punkcie obiektów

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

Dzięki za próbki, wypróbowałem je i działają jak czar! Teraz mam punkt wyjścia do zrobienia więcej badań (lub dabbling w moim przypadku ...) – Lakitu

0

ST_Distance() nie oznacza, że ​​prawdopodobnie nie masz zainstalowanego postgis lub nie utworzyłeś szablonu postgis ... lub nie utworzyłeś bazy danych za pomocą szablonu postgis, jeśli szablon istnieje.

1

Dodanie do synecdoche's answer, w Railsach 3 można użyć zakresów ActiveRelation, które pozwoliłyby na łączenie zapytań.

Nietestowane:

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

Zastosowanie:

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

Nawet jeśli nie zakresów łańcucha, przez większość czasu jest to lepsze niż przy użyciu metod klasy.

Powiązane problemy