.net 查询DBGeometry以获取特定的LatLng值

.net 查询DBGeometry以获取特定的LatLng值,.net,entity-framework,spatial-query,.net,Entity Framework,Spatial Query,背景 我有一个国家的数据库,我从一个shape文件中获得,并使用Shape2Sql工具从上传到我的数据库 在使用该工具时,我选择了使用SRID 4326的选项,因为我相信这代表了地球表面的几何图形(如果我有错误,请纠正我) 当我在Sql management studio中运行Select时,在结果窗格中有一个空间选项卡,它基本上显示了世界地图,即查询中的所有几何数据,我可以在其中看到英国 问题是: 我有一组坐标,我想找出坐标所在的国家。我使用的是实体框架,我的代码如下所示 var coords

背景

我有一个国家的数据库,我从一个shape文件中获得,并使用Shape2Sql工具从上传到我的数据库

在使用该工具时,我选择了使用SRID 4326的选项,因为我相信这代表了地球表面的几何图形(如果我有错误,请纠正我)

当我在Sql management studio中运行Select时,在结果窗格中有一个空间选项卡,它基本上显示了世界地图,即查询中的所有几何数据,我可以在其中看到英国

问题是:

我有一组坐标,我想找出坐标所在的国家。我使用的是实体框架,我的代码如下所示

var coords = location.Split(',');
var myLocation = DbGeometry.FromText(string.Format("POINT({0} {1})", coords[1], coords[0]));
var country = db.CountryRepository.Where(x => x.Geom.Contains(myLocation));
我的查询总是将country返回为null,即使数据库中有英国,并且我使用当前位置作为坐标

当我将第2行更改为
var myLocation=DbGeometry.FromText(string.Format(“POINT({0}{1})”,coords[1],coords[0]),4326)

我得到一个例外:

A .NET Framework error occurred during execution of user-defined routine or aggregate "geometry": 
System.ArgumentException: 24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly.
System.ArgumentException: 
   at Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()
   at Microsoft.SqlServer.Types.SqlGeometry.STContains(SqlGeometry other)
.
坐标:

{"latitude":"53.15366296446161","longitude":"-1.098928023733833"}
有人知道如何正确地做到这一点吗

更新

我已经使用下面的查询直接在SQL server上解决了这个问题

SELECT [Id]
      ,[NAME]
      ,[ISO]
      ,[Geom]
      ,[Geom].MakeValid().STIntersects(geometry::STGeomFromText('POINT(-1.098928023733833 53.15366296446161)', 4326)) as Inters
  FROM [Countries] 

对于United Kindom,Inters列为1,否则为0。是否有人知道如何从EntityFramework执行MakeValid操作?

好的,除了上面的tsql查询,下面是如何使用EntityFramework执行此操作

 var coords = location.Split(',');
 var myLocation = DbGeometry.FromText(string.Format("POINT({0} {1})", coords[1], coords[0]), 4326);
 var country = db.CountryRepository.Where(x => SqlSpatialFunctions.MakeValid(x.Geom).Intersects(myLocation));
TSQL


好的,除了上面的tsql查询之外,下面是如何使用EntityFramework实现这一点

 var coords = location.Split(',');
 var myLocation = DbGeometry.FromText(string.Format("POINT({0} {1})", coords[1], coords[0]), 4326);
 var country = db.CountryRepository.Where(x => SqlSpatialFunctions.MakeValid(x.Geom).Intersects(myLocation));
TSQL