spatialite - EF Core 空间数据距离
问题描述
使用带有 Sqlite 的 ef core 2.2 空间数据。当尝试执行返回 {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();
解决方案
我自己正在学习这些东西,但我认为 EF Core 与 NetTopologySuite(EF Core 的空间提供程序)返回的距离只是一个笛卡尔距离(即返回与坐标相同的单位。这是因为基础类型是几何而不是地理。这似乎与 sql server 中内置的 ST_Distance 函数不同,后者确实返回米。但是,只有当您使用地理数据类型时,这才是正确的......
推荐阅读
- highcharts - highcharts - 在水平条形图中导出的 png
- django - 阻止评估模板标签但不评估变量
- sql - FROM 子句中子查询的替代方案
- python - 写入文件直到达到一定大小,然后开始新文件
- php - php now() 中的 mysql 查询错误日期,我需要此脚本的帮助
- c# - 处理新 linq 对象中的空返回 c#
- python - PyCharm 变量资源管理器不显示带有空格的 pandas 列名
- ios - iOS 14 中的 UICollectionViewListCell 和自定义单元格附件
- javascript - JavaScript:打开列表中的第一个链接,等待然后打开下一个链接
- php - 更新数据库 laravel 中的价格列