我需要找到类Place
的所有实例,其中其多边形属性包含一个点,如Place.for_point(pt)
中所提供的点。
============
好吧,我可以让此查询执行,但结果错误:
Place.all.where("ST_Contains(poly, ST_Point(#{up_pt.join(',')}))")
Place Load (0.5ms) SELECT "places".* FROM "places" WHERE (ST_Contains(poly, ST_Point(25.1,25.09999999999999))) LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
很明显,坐标是正确提供的:所提供的点的坐标为拉特龙格式。但是坐标来自桌子中一个多边形的质心,因此它们应该在该多边形内部,这意味着我应该得到一组返回的地点记录...但是我不是。
为什么?我想念什么?
这是我期望包含的多边形:
f.unproject(Place.last[:poly])
Place Load (0.3ms) SELECT "places".* FROM "places" ORDER BY "places"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> #<RGeo::Geographic::ProjectedPolygonImpl:0x3fcdc30f807c "POLYGON ((24.999999999999996 24.999999999999996, 25.2 24.999999999999996, 25.2 25.20000000000001, 24.999999999999996 25.20000000000001, 24.999999999999996 24.999999999999996))">
irb(main):134:0>
====原始帖子=====
我无法围绕如何构造这个问题。对于单个实例,我有一种方法contains?(pt)
作为Place
的实例方法,当称为place.contains?(@f.project(@pt_inside))
和@pt_inside
时,可以正常工作:@pt_inside = @f.point(25.1,25.1)
,其中@f是对象的工厂。
Place
的架构看起来像:
create_table "places", force: :cascade do |t|
t.geometry "loc", limit: {:srid=>3857, :type=>"st_point"}
t.geometry "poly", limit: {:srid=>3857, :type=>"st_polygon"}
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
结束
我的轨道非常生锈,但是我无法对上课的地方进行查询。...
每个taryn的请求,这是返回二进制响应的功能实例方法,以确定当前对象的:poly
属性是否包含点
def contains? pt
self[:poly].contains?(pt)
end
显然很微不足道。我遇到的问题是,当使用类方法来查看哪些实例的poly属性包含点时,我就迷路了....
def self.for_point pt
where([:poly].contains?(pt))
end
这只是最后一次,还原,拼命的尝试。显然,需要发生的事情是,每个对象都必须在其上调用实例方法,但这基本上是一个红宝石循环,这似乎是疯狂的,遍历具有数百万个条目的桌子....
。我无法完全获取示例显示的基于SQL的语法,但是无论如何,实例方法是纯粹的Ruby,为什么我需要在类查询中放入SQL,我问自己?还是我?
另外:我以前编写了这样的代码,没有RGEO宝石,所以我检查了边界框,这很容易做到,并且可以很好,因为所有这些查询都基于基于垂直和垂直和垂直和垂直区域的矩形区域水平边界。但是我使用的宝石是有原因的,以避免我必须维护的功能和黑客……