利用DbGeography研究MultiPolygon和Polygon的交点

时间:2015-11-27 18:55:08

标签: c# .net sql-server entity-framework geospatial

我正在尝试从交集MultiPolygons列中获取实体,其中Polygon位于内部,var sqlPoly = SqlGeography.Parse(bbox); //bbox is in WKT format if (sqlPoly.EnvelopeAngle() >= 90) sqlPoly = sqlPoly.ReorientObject(); var box = DbGeography.FromBinary(sqlPoly.STAsBinary().Value); //resulting bbox is OK and tested by parsing WKT var query = from ls in _mdb.Listings where box.Intersects(ls.Geo) select ls; 是边界框

var q = "DECLARE @g geography; SET @g = geography::Parse('" + box.AsText() + "'); SELECT * FROM Listings WHERE @g.STIntersects(Geo) = 1;";

所以结果非常奇怪。我正在选择距离数据库结果集千里之外的bbox,但此查询仍会返回结果。

我认为这是关于MultiPolygons的一个问题。

编辑:

我尝试删除Entity Framework并使用Raw SQL但结果相同:

STIntersects

当我使用STContainsSTWithin更改{{1}}时,结果集会被过滤,但这一次;过多地过滤了太多缺失的地理位置。

1 个答案:

答案 0 :(得分:1)

使用您提供给我的样本数据,许多对象都会出现所谓的环形方向问题。简单地说,指定地理多边形的角落的顺序很重要。也就是说ABCDA<> ADCBA。幸运的是,修复很简单。我在示例表上运行了以下更新:

update l
set Geo = Geo.ReorientObject()
from Listele as l
where Geo.EnvelopeAngle() = 180

现在,当我对数据进行选择时,它似乎代表了一个流经它的河流(或许是街道)的城市。我猜的更多的是你正在寻找的东西。