C# 利用DbGeography实现多边形与多边形的求交

C# 利用DbGeography实现多边形与多边形的求交,c#,.net,sql-server,entity-framework,geospatial,C#,.net,Sql Server,Entity Framework,Geospatial,我试图从交叉点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.STAsBi

我试图从交叉点
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,它距离db结果集有千英里远,但是这个查询仍然返回结果

我认为这是一个多管齐下的问题

编辑:

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

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

当我用
STContains
STWithin
更改
STIntersects
时,结果集将被过滤,但这一次;过滤太多,出现太多缺少的地理位置。

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

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

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

没有样本数据,很难说发生了什么。但对于geospatial,我通常喜欢在地图上绘制相关项目,以确保我认为数据所代表的是它实际代表的内容。例如,做一些简单的事情,比如让一个多边形覆盖整个地球减去你真正关心的区域。看起来您在定义
sqlPoly
(我假设它是您的边界框)时考虑了这一点,但我没有对DB表中的数据做任何这样的假设。验证你的假设很好。实际上我正在地图上做测试。此查询准备一个结果集,该结果集将在GeoJson服务上提供。此服务根据您明确指示的可见边界框进行查询。我正在尝试验证所有假设,但唯一的可能性是多多边形的问题,因为多边形似乎是在多个多边形上过滤的,但多个多边形不是:(我所能想到的是,出于某种原因,
STIntersects()
只对标量多边形起作用(即,不是多多边形()地理实例),但我只是做了一个简单的概念验证,证明了它确实有效。我仍然怀疑某些特定于您的数据的东西,而不是StinerSects()的工作方式。但如果无法查看您的数据,则很难进行诊断。我如何向您发送备份示例?如果您能检查一下,我将不胜感激:(在Dropbox或类似设备上放置一个db备份就可以了。我很乐意看一下。