EF Core Пространственное расстояние данных - PullRequest
0 голосов
/ 18 февраля 2019

Использование ef core 2.2 пространственных данных с Sqlite.При попытке сделать запрос, который возвращает все известные местоположения в радиусе {x}, ввод требует градусов, а не метров.

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

Я думал, что если запрос будет на стороне сервера, он вернется в метрах?Я предполагаю, что Sqlite просто не считается сервером.Я могу подтвердить те же результаты в запросе, используя пространственный_гуй

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

Так это ограничение?Если так, что будет лучшим способом найти местоположение в метрах?

EDIT

Мне удалось выполнить то, что я хотел, с помощью запроса 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 голосов
/ 17 мая 2019

Я изучаю этот материал сам, но я думаю, что Distance, возвращаемый EF Core с NetTopologySuite (пространственным провайдером для EF Core), просто делает декартово расстояние (т.е. возвращает те же единицы, что и координаты. Это потому, чтобазовый тип - это геометрия, а не география. Похоже, это отличается от встроенной функции ST_Distance сервера sql, которая возвращает метры. Однако это верно только в том случае, если вы используете тип данных географии ...

...