使用 DbGeography 的 MultiPolygon 和 Polygon 的交集

Intersection of MultiPolygon and Polygon by using DbGeography

我正在尝试从交叉点 DbGeography 列中获取实体,该列内部有 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;

所以结果很奇怪。我正在选择一个距离数据库结果集千里之外的 bbox,但此查询仍然 returns 结果。

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

编辑:

我试图消除 Entity Framework 并使用 Raw SQL 但结果是一样的:

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

当我将 STIntersects 更改为 STContainsSTWithin 时,结果集会被过滤,但这次;过滤太多了,出现了太多缺失的地理位置。

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

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

现在,当我在数据上 运行 一个 select 时,它似乎代表了一个有一些河流(或者可能是街道)流经的城市。我猜这更符合您的需求。