如何使用AR/Arel重写此RGeo查询



我有以下范围来处理原始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.shapegeography(Polygon,4326)pointgeography(Point,4326)

在rails控制台中,它们分别是#<RGeo::Geos::CAPIPolygonImpl>#<RGeo::Geos::CAPIPointImpl>

我想写一些更类似的东西

where(arel_table[:shape].st_intersects(point))

但这给了我一个错误:

运行时错误:不支持:RGeo::Geos::CAPIPointImpl

希望得到一些帮助,从我的模型中获得原始SQL!此外,我是RGeo/PostGIS新手,所以请不要以为我知道自己在做什么。:D

请不要以为我确切知道您在说什么,但我使用squeelgem编写带有rgeoactiverecord-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的东西。祝好运

您可以在没有arelsqueel:的情况下执行此操作

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')"

相关内容

  • 没有找到相关文章

最新更新