سؤال

أحتاج إلى استخدام قاعدة بيانات PostGIS موجودة من تطبيق Rails الخاص بي. حتى الآن أنا قادر على الوصول إلى DB على ما يرام ، يحول Georuby عمود "Geom" بشكل جيد إلى كائن نقطة.

ما أبحث عنه هو وسيلة سهلة لتنفيذ استفسارات تشبه ActivereCord على تلك الجداول ، على سبيل المثال

Poi.find_within_radius(...)

أو الاستعلامات المكانية المماثلة مثل حسابات المسافة ET. آل.

لقد جربت عدة مجموعات من Geokit ، المصاحبة للمكونات الإضافية ، لكنني متأكد تمامًا من أنه يجب أن يكون هناك شيء أفضل في عالم Ruby/Rails. أي تلميحات؟

هل كانت مفيدة؟

المحلول

منذ أن حصلت على جوربي ، ضع طراز 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, ، في Rails 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