我需要找到一个类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 []>显然,提供的坐标是正确的:所提供的点中的坐标是latlon格式。但是坐标来自表中一个多边形的质心,所以它们应该在那个多边形内,这意味着我应该得到一组返回的位置记录……但我不是。
为什么?我遗漏了什么?
这是我希望包含该点的多边形:
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结束
我的rails很生疏,但是我不能对班级的地方工作进行查询...
发布于 2018-02-27 05:34:50
根据Taryn的请求,下面是一个有效的实例方法,它返回一个二进制响应,以确定当前对象的:poly属性是否包含点
def contains? pt
self[:poly].contains?(pt)
end显然是微不足道的。我遇到的问题是,当使用一个类方法来查看哪些实例的poly属性包含点时,我就迷路了……
def self.for_point pt
where([:poly].contains?(pt))
end这只是最后一次,简单化的,绝望的尝试。显然,需要发生的是每个对象都必须有一个调用它的实例方法,但这基本上是一个Ruby循环,这样做似乎很疯狂,遍历可能有数百万个条目的表……
我不能完全理解示例所展示的基于sql的语法,但无论如何,实例方法都是纯Ruby的,我问自己,为什么我需要在类查询中使用sql?或者我有吗?
另外:我以前在没有RGeo gem的情况下编写了这样的代码,所以我检查了边界框,这很容易做,而且很好,因为所有这样的查询都将基于具有垂直和水平边界的区域的矩形区域。但我使用gem是有原因的,以避免我必须维护的大量功能和黑客行为……
https://stackoverflow.com/questions/48981529
复制相似问题