gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:45 27 4
gpt4 key购买 nike

我正在尝试从 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com