0

geometry(地理ではない)列と他の「標準」列を持つSQL Server 2008 R2テーブルがあります。現在、テスト用にテーブルに 1 つの行があり、そのレコードのジオメトリ列には次の境界を持つ多角形があり、多角形を挿入したときの SRID は 0 (ゼロ) でした:

POLYGON ((380 220, 380 575, 585 575, 380 575, 380 220))

EF5 を使用して、ポイントがそのポリゴン内にあるかどうかを確認したいと思います。まず、ポイントを作成します。

DbGeometry testPoint = DbGeometry.PointFromText("POINT(400 240)", 0);

List<LocationArea> tResults = (from s in db.LocationAreas
       where testPoint .Intersects(SqlSpatialFunctions.MakeValid(s.AreaBounds))
       select s).ToList();

SqlSpatialFunctions.MakeValidメソッドを追加する前に私が得た最初のエラーは、s.AreaBounds結果が「有効」ではなかったのに対し、コードで作成されたポイントは「有効」でした。この優れた投稿の助けを借りてそれを修正しました-> query-dbgeometry-for-specific-latlng-value

今、私は夢中になる可能性があります (私はしばらくこのコードを見てきました)、しかし、私は常に空のリストを返し (カウント = 0)、ポイントはポリゴンの境界内にあると信じています.

だから、私が言ったように、どんなポインタも高く評価されますが、私だけかもしれません:-)

ドミニク

4

1 に答える 1

0

私が望む結果を得るために多くのさまざまなことを試した後、以下のコードは最終的に機能し、これまでに投げたすべてのポリゴン/ポイントシナリオで毎回機能します.

これが必要な理由はわかりませんが、Entity Framework でジオメトリ SQL 列を使用するときに、これが将来誰かに役立つことを願っています。

DbGeometry testPoint = DbGeometry.PointFromText("POINT(400 240)", 0);

List<LocationArea> tResults = (from s in db.LocationAreas
   where testPoint .Intersects(SqlSpatialFunctions.MakeValid(s.AreaBounds).Envelope)
   select s).ToList();

詳細なデバッグを行い、Linq クエリを介して返された DBGeometry フィールドを実際に調べた後、これを見つけました。s.AreaBounds フィールドが、もともと DB に保存されていたPOLYGON(...)値ではなく、 LINESTRING(...)値を返すことがわかりました。返されたオブジェクト プロパティをさらに調べると、.Envelopeに必要なものが含まれていることがわかりました。

于 2013-10-02T03:37:10.200 に答える