C# 在数据库中找不到点所在的多边形

C# 在数据库中找不到点所在的多边形,c#,sql-server,spatial,point-in-polygon,C#,Sql Server,Spatial,Point In Polygon,我试图使用一种方法来确定Lat长坐标是否在数据库中存储的任何多边形内,并返回它所属多边形的列表(如果有) 我有一个长/宽的: 50.120578, -103.535156 我创建了一个地理围栏并将其存储在数据库中 CREATE TABLE [dbo].[GeoFences] ( [Id] INT IDENTITY (1, 1) NOT NULL, [GeoPoints] [sys].[geography] NULL,

我试图使用一种方法来确定Lat长坐标是否在数据库中存储的任何多边形内,并返回它所属多边形的列表(如果有)

我有一个长/宽的:

50.120578, -103.535156
我创建了一个地理围栏并将其存储在数据库中

CREATE TABLE [dbo].[GeoFences] (
    [Id]           INT               IDENTITY (1, 1) NOT NULL,
    [GeoPoints]    [sys].[geography] NULL,
    CONSTRAINT [PK_dbo.GeoFences] PRIMARY KEY CLUSTERED ([Id] ASC)
);
这些是地质点的值

POLYGON ((-129.63729858398437 57.279042764977774, -92.899017333984375 56.8970039212726, -93.865814208984375 48.922499263758255, -122.86972045898437 48.806863461085172, -129.37362670898437 57.088515327886505, -129.63729858398437 57.279042764977774))
使用此方法,我希望它在多边形包围该点时返回该行

public IEnumerable<GeoFence> SearchGeoPoint(DbGeography geoPoint)
        {
            try
            {
                return _geoLocationRepository.Get.Where(obj => obj.GeoPoints.Intersects(geoPoint));
            }
            catch (Exception)
            {
                return null;
            }
        }

然而,我一直没有得到返回的行。我没有得到任何例外或错误,只是0行。

您的坐标定义顺序错误,因此您的多边形实际上用小孔表示地球

SqlGeography应始终保持内部区域位于左侧。这意味着在多边形中定义的任何孔都应该以相反的方向移动,这实际上仍然保持多边形的内部区域在您的左侧。本质上,你是在定义地球上的那个洞

简而言之,您需要颠倒坐标顺序,以获得正确的结果和您要查找的结果。如果您使用的是SQL Server 2012,请尝试重新定向对象方法:


不过,我建议在这种情况下,重定向对象实际上只是一个临时修复。如果使用正确的顺序定义了所有存储的多边形,则需要永久“重新定向”所有存储的多边形。

发现这实际上是一些问题,希望遇到此问题的人会发现这很有帮助

第一个问题是我在LINQ查询中使用了.Get.Where。当我删除.Get并直接使用数据库上下文时,我使用的是一个通用存储库,它返回了我期望的行

我换了

return _geoLocationRepository.Get.Where(obj => obj.GeoPoints.Intersects(geoPoint));


另外需要注意的是,您需要使用Long/Lat创建点而不是Lat/Long如果您使用Lat/Long,您将得到一个异常。

我完全错过了.get!!但是我仍然怀疑你的多边形顺序,它应该是有洞的地球吗?另外,如果你想要所有的结果,你可以考虑下面的,而不是逐个迭代:var查询=CONTX.GEOFECONE.THOOB= = Obj.GeopiTn.SigPotoTn.Telist.返回查询;。
return _geoLocationRepository.Get.Where(obj => obj.GeoPoints.Intersects(geoPoint));
using(var context as DatabaseContext())
{
  var results = new List<GeoFence>();
  var query = context.GeoFences.Where(obj => obj.GeoPoints.Intersects(geoPoint));

  //Have to iterate through the results (Only way I've found to access the data)
  foreach(var fence in query)
{
   results.Add(fence);
}

return results;
}