我有以下范围我已经使用原始SQL:
class DeliveryZone < ActiveRecord::Base
def self.contains(addressable)
point = addressable.lonlat
where(<<-SQL.squish)
ST_Intersects("delivery_zones"."shape", ST_GeomFromText('#{point}'))
SQL
end
end
对于PostgreSQL类型,delivery_zones.shape
是geography(Polygon,4326)
而point
是geography(Point,4326)
。
在rails控制台中,它们分别是#<RGeo::Geos::CAPIPolygonImpl>
和#<RGeo::Geos::CAPIPointImpl>
。
我想写更类似于
的内容where(arel_table[:shape].st_intersects(point))
...但是这给了我这个错误:
RuntimeError:unsupported:RGeo :: Geos :: CAPIPointImpl
希望能帮助我从模型中获取原始SQL!另外,我是RGeo / PostGIS的新手,所以请不要认为我知道自己在做什么。 :d
答案 0 :(得分:0)
请不要假设我知道你究竟在谈论什么,但我使用squeel
gem来编写使用rgeo
和{{1}的rails样式查询}。 Daniel Azuma撰写了一些关于这个主题的精彩博客,这些博客让我在几年前就开始了。以下是本系列的第一部分:http://daniel-azuma.com/articles/georails/part-1
据我了解,这可能会有所帮助:
activerecord-postgis-adapter
请注意,只有在您安装了squeel gem时才有效。如果你想特别关注它,也许你应该使用它:
class DeliveryZone < ActiveRecord::Base
def self.contains(addressable)
where{st_intersects(:shape, addressable)}
end
end
很高兴其他人正在使用rails用于GIS的东西。祝你好运
答案 1 :(得分:0)
您可以在不arel
或squeel
:
where("delivery_zones.shape && ?", addressable.lonlat.to_geometry)
一般情况下,这应该有效:
where("point_column && ?", rgeo_object.to_geometry)
以下是一个模型为City
的示例,其中包含一个名为coordinates
的点列,其为st_point
。我想查询由两个角点(SE&amp; NW)定义的边界框中的所有城市:
box = RGeo::Cartesian::BoundingBox.create_from_points(
City.first.coordinates, City.last.coordinates)
City.where("coordinates && ?", box.to_geometry)
发生了什么事?
> box.to_geometry.to_s
=> "POLYGON ((-90.0674 29.9627, -79.09529 29.9627, -79.09529 36.18375, -90.0674 36.18375, -90.0674 29.9627))"
> City.where("coordinates && ?", box.to_geometry).to_sql
=> "SELECT \"cities\".* FROM \"cities\" WHERE (coordinates && '0020000003000010e60000000100000005c05684504816f007403df67381d7dbf5c053c6193b3a68b2403df67381d7dbf5c053c6193b3a68b2404217851eb851ecc05684504816f007404217851eb851ecc05684504816f007403df67381d7dbf5')"