我正在尝试从交集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
当我使用STContains
或STWithin
更改{{1}}时,结果集会被过滤,但这一次;过多地过滤了太多缺失的地理位置。
答案 0 :(得分:1)
使用您提供给我的样本数据,许多对象都会出现所谓的环形方向问题。简单地说,指定地理多边形的角落的顺序很重要。也就是说ABCDA<> ADCBA。幸运的是,修复很简单。我在示例表上运行了以下更新:
update l
set Geo = Geo.ReorientObject()
from Listele as l
where Geo.EnvelopeAngle() = 180
现在,当我对数据进行选择时,它似乎代表了一个流经它的河流(或许是街道)的城市。我猜的更多的是你正在寻找的东西。