В настоящее время я пытаюсь наивно получить k-ближайших соседей из набора точек, учитывая значение k, координату для использования в качестве центра и радиус, служащий максимальным расстоянием для поиска точек внутри. Я использую географические точки (SRID 4326) в базе данных MSSQL 2008.
Наивно найдены соседи, упорядочивающие запрос по расстоянию до точки и ограничивающие результат.
Моя проблема начинается с ограничения точек заданным радиусом. Расстояния, возвращаемые функцией «Расстояние», намного больше ожидаемых, что, как я понимаю, вызвано SRID 4326. Это нормально, поскольку используется только для заказа, но когда мне нужно сравнить эти значения с относительным расстоянием скажем, 200 метров, эти большие числа не сделают.
Тогда у меня возникает вопрос: существует ли более разумный способ ограничения точек радиусом с помощью запросов NHibernate Spatial, или есть ли способ преобразовать этот радиус в некоторый мера, подобный тому, который используется функцией Distance?
Это мой запрос, как он выглядит сейчас:
output = NHibernateSession.GetSession().CreateQuery(@"select p from POI p
where NHSP.Distance(p.PointCoord, :coord) <= :maxDistance
order by NHSP.Distance(p.PointCoord, :coord)")
.SetParameter("coord", coord,
NHibernateUtil.Custom(typeof(Wgs84GeographyType)))
.SetParameter<double>("maxDistance", radius)
.SetMaxResults(k)
.Enumerable<POI>();
Просто в качестве примера у меня есть два момента:
ТОЧКА (7 1)
ТОЧКА (7 3)
Мое ожидаемое расстояние - 2, но в результате расстояние, рассчитанное функцией mssql STDistance, дает 221151.479533501. Я просто не могу заставить свой разум разобраться в этом.