Быстрый / простой / индексируемый способ извлечения точек на картах в радиусе или диапазоне от базы данных - PullRequest
0 голосов
/ 06 мая 2018

Извините за неоднозначное название. Это не дубликат MySQL - Найти точки в радиусе от базы данных , Вот подробная проблема:

У меня есть база данных местоположения с индексированными значениями широты и долготы. Я могу свободно добавлять индекс и индексированный вычисляемый столбец при необходимости.

Мне дадут координаты и расстояние (например, 5 км), мне нужно:

  • Возвращает все точки в пределах 5 км от точки.

  • ИЛИ если это проще, все точки в пределах 5-километрового квадрата на карте.

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

База данных, которую я использую, - это SQL Server, если это имеет значение.

РЕДАКТИРОВАТЬ: Извините, я забыл еще одну проблему при публикации 1-го сообщения. У меня есть еще один похожий вопрос:

Применялось то же правило, круглой или квадратной формы, теперь у каждой целевой точки тоже есть свой радиус. Скажем, точка A имеет свойства Lat, Lng и Radius и так далее для B и C. Теперь мне нужно извлечь точки, которые имеют свою форму сталкивается с исходной формой.

1 Ответ

0 голосов
/ 06 мая 2018

SQL Server имеет функцию под названием пространственные индексы .

Географические методы, поддерживаемые пространственными индексами

При определенных условиях пространственные индексы поддерживают следующее ориентированные на наборы методы географии: STIntersects (), STEquals () и STDistance (). Для поддержки пространственного индекса эти методы должны использоваться в предложении WHERE запроса, и они должны встречаться в предикат следующего общего вида:

geography1.method_name(geography2) comparison_operator valid_number

Чтобы вернуть ненулевой результат, geography1 и geography2 должны иметь тот же идентификатор пространственной привязки (SRID). В противном случае метод возвращает NULL.

Пространственные индексы поддерживают следующие формы предикатов:

geography1.STIntersects(geography2) = 1
geography1.STEquals(geography2) = 1
geography1.STDistance(geography2) < number
geography1.STDistance(geography2) <= number

Ваши geography объекты могут быть простыми точками, и этого может быть достаточно, поскольку вы сказали, что вам не нужна высокая точность, особенно если радиус точки намного меньше расстояния 5 км.

Вы также можете аппроксимировать свои круги несколькими точками, например, восьмиугольники могут быть достаточно хорошим приближением.

Посмотрите на доступные пространственные типы и методы, попробуйте несколько подходов и проверьте их производительность.

Вы также можете найти методы STBuffer и / или BufferWithTolerance , полезные для построения кругов вокруг ваших точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...