【问题标题】:EF Core Spatial Data DistanceEF Core 空间数据距离
【发布时间】:2019-02-18 17:15:40
【问题描述】:

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

【问题讨论】:

  • 嘿,您是如何设置您的项目以使其与 NetTopologySuit 一起工作的?我实际上遇到了 SQLite 的问题,因为它无法找到 sqlite3.dll 依赖项

标签: spatialite ef-core-2.2


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2020-11-27
    • 2021-12-05
    • 2020-07-03
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多