c# - 使用 DbGeography 的 MultiPolygon 和 Polygon 的交集

标签 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.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 更改为 STContainsSTWithin 时,结果集会被过滤,但这次;过滤太多,出现了太多缺失的地理位置。

最佳答案

使用您提供给我的示例数据,许多对象都存在所谓的环方向问题。简单地说,指定地理多边形角的顺序很重要。也就是说 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/

相关文章:

sql-server - SQL Server XML类型从任何标记中选择Attribute = X

sql-server - 执行具有多个结果集的存储过程

sql-server - SSIS 2012 - 条件 header 的位置

c# - 文化(语言)发生变化时的动态字体大小

c# - 将项目添加到字典返回 System.IndexOutOfRangeException : Index was outside the bounds of the array

c# - 在 c# 中记录击键时键入特殊字符时显示双字符

c# - 在 KeyValuePair 列表中查找重复键

c# - 嵌套开关表达式

c# - 用于处理任何事件的通用委托(delegate)类型

.net - 用于 ASP.NET Web 应用程序的 DevExpress 与 Telerik 网格