0

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 形式です。しかし、座標はテーブル内の多角形の 1 つの重心からのものであるため、それらはその多角形の内側にある必要があります。つまり、返された場所レコードのセットを取得する必要があります...しかし、そうではありません。

なんで?私は何が欠けていますか?

ポイントを含むと予想されるポリゴンは次のとおりです。

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)

のスキーマは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

終わり

私のレールは非常に錆びていますが、クラス Place work へのクエリを作成できません....

4

1 に答える 1

1

Taryn の要求に従って、現在のオブジェクトの:poly属性にポイントが含まれているかどうかを判断するためにバイナリ応答を返す、機能するインスタンス メソッドを次に示します。

def contains? pt
    self[:poly].contains?(pt)
end

明らかに些細なことです。私が抱えている問題は、クラスメソッドを使用してインスタンスのポリゴン属性にポイントが含まれているかどうかを確認するときに、失われることです....

def self.for_point pt
    where([:poly].contains?(pt))
end

これは最後の、還元的で絶望的な試みです。明らかに、必要なことは、各オブジェクトでインスタンス メソッドが呼び出される必要があることですが、これは基本的に Ruby ループであり、何百万ものエントリを持つ可能性のあるテーブルをトラバースするのは非常識に思えます....

例に示されている SQL ベースの構文を完全に理解することはできませんが、いずれにせよ、インスタンス メソッドは純粋な Ruby です。なぜクラス クエリで SQL にドロップする必要があるのでしょうか? それとも私ですか?

また、以前は RGeo gem を使用せずにこのようなコードを書いていたので、バウンディング ボックスをチェックしていましたが、これは非常に簡単で、このようなクエリはすべて、垂直方向と水平方向の境界を持つ領域に基づく長方形の領域に基づいているため、問題ありません。しかし、私が維持しなければならない多くの機能とハッカーを避けるために、私は理由で宝石を使用しています...

于 2018-02-26T21:34:49.950 に答える