使用DbGeography实现多重多边形与多边形的交集

本文关键字:多边形 DbGeography 实现 使用 | 更新日期: 2023-09-27 18:24:52

我正试图从交集DbGeography列中获取实体,该列内部有MultiPolygonsPolygon是边界框

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;

所以结果非常奇怪。我选择了一个距离数据库结果集一千英里的邮箱,但这个查询仍然返回结果。

我认为这是一个关于多重多边形的问题。

编辑:

我试图消除实体框架并使用原始SQL,但结果是一样的:

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

当我用STContainsSTWithin改变STIntersects时,得到的集合被过滤,但这次;它被过滤得太多了,出现了太多缺失的地理位置。

使用DbGeography实现多重多边形与多边形的交集

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

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

现在,当我对数据进行选择时,它似乎代表了一个有一些河流(或街道)流经的城市。我猜这更像是你想要的。