0

我有一个 SQL Server 2008 R2 表,它有一个geometry(不是地理)列,以及一些其他“标准”列。我目前在表中有一行用于测试,并且该记录中的几何列具有具有以下边界的多边形,并且插入多边形时的 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

现在,我可能会发疯(我一直在看这段代码),但是我总是返回一个空列表(count = 0),我相信这个点在多边形范围内。

所以,任何指针都会受到赞赏,就像我说的那样,可能只是我:-)

多米尼克

4

1 回答 1

0

在尝试了很多很多不同的事情以获得我想要的结果之后,下面的代码现在终于可以工作了,并且每次都可以工作,到目前为止我已经抛出了每个多边形/点场景。

为什么需要这样做我不知道,但我当然希望这有助于将来在实体框架中使用几何 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 字段返回一个LINESTRING(...)值,而不是最初保存在数据库中的值,即POLYGON(...)值。进一步查看返回的对象属性,我发现.Envelope有我想要的。

于 2013-10-02T03:37:10.200 回答