EF核心空间数据距离

时间:2019-02-18 17:15:41

标签: spatialite ef-core-2.2

将ef core 2.2空间数据与Sqlite一起使用。尝试执行查询以返回{x}半径内的所有已知位置时,输入的是度而不是米。

var nearByLocations = _context.Locations.Where(x => x.Location.Distance(current.Location) <= 0.1666666).ToList();

我认为如果查询在服务器端,它将以米为单位返回?我猜Sqlite只是不被视为服务器。我可以使用spatialite_gui在查询中确认相同的结果

select Distance(Location, (SELECT Location FROM Facility WHERE 
LocationIdentifier = '123')) as distance
from Facility
where LocationIdentifier = '456' --distance: 0.336804

这是一个限制吗?如果是这样,什么是最好的以米为单位查找位置的方法?

编辑

我能够通过RAW SQL查询完成我想要的工作。首先,我使用函数“ PtDistWithin”,然后按距离进行了排序。使用距离功能,我必须将其转换为另一个SRID。

希望我可以通过Linq进行查询,但这也可以。

var nearBy = _context.Facilities.FromSql(
                    "SELECT * FROM Facility WHERE FacilityType = 'Test' AND " +
                    "PtDistWithin(Location, {0}, CvtFromKmi({1})) " +
                    "ORDER BY Distance(TRANSFORM(Location,2855), TRANSFORM({2},2855));", bus.Location, 20, bus.Location).ToList();

1 个答案:

答案 0 :(得分:0)

我正在自己学习这些东西,但是我认为EF Core与NetTopologySuite(EF Core的空间提供者)返回的距离只是做一个笛卡尔距离(即返回与坐标相同的单位。这是因为底层类型是几何而不是地理。这似乎与sql server中内置的ST_Distance函数不同,后者确实返回米。但是,只有在使用geodata数据类型时,这才是正确的...