我有以下范围来处理原始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))
但这给了我一个错误:
运行时错误:不支持:RGeo::Geos::CAPIPointImpl
希望得到一些帮助,从我的模型中获得原始SQL!此外,我是RGeo/PostGIS新手,所以请不要以为我知道自己在做什么。:D
请不要以为我确切知道您在说什么,但我使用squeel
gem编写带有rgeo
和activerecord-postgis-adapter
的rails样式查询。Daniel Azuma写了一些关于这个话题的很棒的博客,这让我几年前就开始了。这是该系列的第一个:http://daniel-azuma.com/articles/georails/part-1
据我所知,这可能会有所帮助:
class DeliveryZone < ActiveRecord::Base
def self.contains(addressable)
where{st_intersects(:shape, addressable)}
end
end
请注意,只有当您安装了scroll gem时,这才有效。如果你想特别注意它,也许你应该使用这个:
class DeliveryZone < ActiveRecord::Base
def self.contains(addressable)
where{st_contains(:shape, addressable)}
end
end
很高兴有人在用铁轨做GIS的东西。祝好运
您可以在没有arel
或squeel
:的情况下执行此操作
where("delivery_zones.shape && ?", addressable.lonlat.to_geometry)
一般来说,这应该有效:
where("point_column && ?", rgeo_object.to_geometry)
以下是一个City
模型的示例,该模型具有一个称为coordinates
的点列,即st_point
。我想查询由两个角点(SE和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')"