1

背景

我有一个国家数据库,我从这里的形状文件中获取并使用http://www.sharpgis.net的 Shape2Sql 工具上传到我的数据库。

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

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

问题是:

我有一组 LatLng 坐标,我想找出坐标所在的国家。我正在使用实体框架,我的代码看起来像这样

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));

即使我在数据库中有英国并且我使用我当前的位置作为坐标,我的查询总是将国家/地区返回为 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 服务器上解决了这个问题

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

Inters 列对于 United Kingdom 为 1,否则为 0,有人知道我如何从 EntityFramework 执行 MakeValid 吗?

4

1 回答 1

1

好的,除了上面的 tsql 查询之外,这里是如何使用实体框架执行此操作

 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

SELECT [Id]
      ,[NAME]
      ,[ISO]
      ,[Geom]
  FROM [Countries] 
  WHERE [Geom].MakeValid().STIntersects(geometry::STGeomFromText('POINT(-1.098928023733833 53.15366296446161)', 4326)) = 1
于 2013-07-10T11:34:39.983 回答