문제

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 템플릿을 사용하여 데이터베이스를 만들지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top