我正在尝试从 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,但此查询仍然返回结果。
我认为这是关于 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
更改为 STContains
或 STWithin
时,结果集会被过滤,但这次;过滤太多,出现了太多缺失的地理位置。
最佳答案
使用您提供给我的示例数据,许多对象都存在所谓的环方向问题。简单地说,指定地理多边形角的顺序很重要。也就是说 ABCDA <> ADCBA。幸运的是,修复很简单。我在示例表上运行了以下更新:
update l
set Geo = Geo.ReorientObject()
from Listele as l
where Geo.EnvelopeAngle() = 180
现在,当我对数据进行选择时,它似乎代表了一个有一些河流(或者可能是街道)流经的城市。我猜这更符合您的需求。
关于c# - 使用 DbGeography 的 MultiPolygon 和 Polygon 的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963379/