NetTopologySuite Distance возвращает странные результаты в .net Core 3 - PullRequest
1 голос
/ 13 октября 2019

В моем .Net Core 3 API я определяю местоположение пользователя следующим образом:

userDetails.Location = new Point(userDetails.latitude, userDetails.longitude)
{
   SRID = 4326
};

и когда я пытаюсь получить пользователей в данном радиусе

double radiusMeters = userSettings.Radius;
var usersWithinRadius = Context.UserDetails.Where(ud => ud.Location.Distance(userDetails.Location) <= radiusMeters).ToList();

Когда я устанавливаюнапример, радиус до 75000 метров, когда пользователь Location (32.600248, 35.1225), возвращает точку с расстоянием более 90 км (31.78562, 35.115335)

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

возвращает точку, расстояние которой превышает 90 км.

Обратите внимание, что аргументы, которые вы передаете: широта и долгота , чьи единицы измерения - градусы. В результате возвращаемое значение не является длиной в Метров . Как вы можете найти, расстояние между (35.1225, 32.600248) и (35.115335,31.78562), возвращаемым методом Distance(), равно 0.81465950900299355. По сути, это равно:

Math.sqrt((35.1225 -35.115335)*(35.1225 -35.115335) + (32.600248 - 31.78562)*(32.600248 - 31.78562))

Если две точки достаточно близки , вы можете рассматривать его единицу как Степень дуги примерно:

enter image description here

Предположим, что Земля представляет собой совершенную сферу , а Окружность Земли равна 40,075.017 km.

Согласнодо Как далеко одна градус :

arc length

мы можем примерно рассчитать расстояние следующим образом:

distance = Circumference * d /360 
    = 40,075.017 km * 0.81465950900299355 / 360 
    = 90.69km

Поскольку условие Where() 0.81465950900299355 < 75000 равно true, вы получите точку на расстоянии более 90 км.

Обратите внимание, мы предполагаем, что две точки здесь достаточно близкиЧтобы рассчитать точное расстояние, нам нужно преобразовать (lon,lat) Coordinate в проекционные системы координат, прежде чем мы вызовем метод Distance().

Цитируется из Пространственные данные -EF Core

Это означает, что если вы задаете координаты в терминах долготы и широты, некоторые значения, оцениваемые клиентом, такие как расстояние,Длина и площадь будут в градусах, а не в метрах. Для получения более значимых значений сначала необходимо спроецировать координаты в другую систему координат, используя библиотеку, подобную ProjNet4GeoAPI, прежде чем вычислять эти значения.

0 голосов
/ 15 октября 2019

Спасибо. До сих пор не вижу, как я могу запросить БД по расстоянию, потому что, если я проецирую все точки в БД, мне, в основном, приходится проходить через каждого пользователя, менять координаты. В этом случае я не вижу смысла в этом методе.

...