背景
我有一个国家数据库,我从here的形状文件中获取并使用http://www.sharpgis.net中的Shape2Sql工具上传到我的数据库。
使用该工具时,我选择了使用SRID 4326的选项,因为我认为这代表地球表面的几何形状(如果我错了,请纠正我。)
当我在Sql管理工作室中运行Select时,在结果窗格中有一个空间选项卡,它基本上显示了世界地图,即查询中的所有几何数据,我可以在那里看到英国。
问题是:
我有一组LatLng坐标,我想找出坐标所在的国家/地区。我正在使用Entity Framework,我的代码看起来像这样
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]
United Kindom的Inters列为1,否则为0,是否有人知道如何从EntityFramework中创建MakeValid?
答案 0 :(得分: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