레일에서 Postgis 공간 데이터에 액세스합니다
-
20-09-2019 - |
문제
Rails 응용 프로그램에서 기존 PostGIS 데이터베이스를 사용해야합니다. 지금까지 나는 DB에 액세스 할 수 있습니다. Georuby는 'geom'열을 포인트 객체로 전환합니다.
내가 찾고있는 것은 해당 테이블에서 activerecord와 같은 쿼리를 실행하는 쉬운 방법입니다.
Poi.find_within_radius(...)
또는 거리 계산 등과 같은 유사한 공간 쿼리. 알.
나는 Rails 플러그인을 동반 한 Geokit의 몇 가지 조합을 시도했지만 Ruby/Rails 우주에는 더 나은 것이 있어야한다고 확신합니다. 힌트가 있습니까?
해결책
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)
다른 팁
추가 Synecdoche의 대답, 레일 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) }
용법:
home = Point.new(5,5)
Poi.rated(5).within(home, 25)
범위를 체인하지 않더라도 대부분의 경우 클래스 방법을 사용하는 것보다 낫습니다.
st_distance ()는 PostGIS를 설치하지 않았거나 PostGIS 템플릿을 만들지 않았을 것임을 의미하지 않습니다. 또는 템플릿이 존재하는 경우 PostGIS 템플릿을 사용하여 데이터베이스를 만들지 않았습니다.
제휴하지 않습니다 StackOverflow