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

时间:2015-11-29 05:10:18

标签: ruby-on-rails-4 activerecord postgis 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))

...但是这给了我这个错误:

  

RuntimeError:unsupported:RGeo :: Geos :: CAPIPointImpl

希望能帮助我从模型中获取原始SQL!另外,我是RGeo / PostGIS的新手,所以请不要认为我知道自己在做什么。 :d

2 个答案:

答案 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)

您可以在不arelsqueel

的情况下执行此操作

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