Нужна помощь в поиске местоположения поблизости

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


person slonkar    schedule 17.08.2011    source источник


Ответы (3)


Не могли бы вы сначала сузить набор данных, создав максимальную и минимальную длину и широту (скажем, в пределах 10 миль от текущего местоположения). Затем вы можете запросить набор данных с помощью lat> minLat и lat ‹ maxLax и т. д. Затем вы можете отсортировать их, как вы предлагаете, вычислив фактические расстояния в сокращенном подмножестве, если вам это нужно.

person Magic Bullet Dave    schedule 17.08.2011
comment
Похоже, Дмитрий меня тоже обыграл. - person Magic Bullet Dave; 17.08.2011

Чтобы избежать расчета расстояния в каждом месте, вы можете создать прямоугольник по широте (скажем, для 10 миль), используя максимальную верхнюю левую широту (10 миль вверх и 10 миль влево) и максимальную правую нижнюю широту (10 миль вниз и 10 миль). миль вправо). Затем ваш запрос найдет широту и длину в этом поле, используя >= и ‹=, а затем рассчитает расстояние для каждого из них, чтобы отфильтровать местоположения в углах, которые превышают 10 миль.

Еще один вариант — изучить пространственное индексирование для SQLite.

person Joe    schedule 17.08.2011
comment
Spatialite iOS stackoverflow.com/questions/4793970/ - person Joe; 17.08.2011

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

SELECT * FROM table t WHERE t.lat‹(lat+buff) AND t.long‹(long+buff) AND t.lat>(lat-buff) AND t.long>(long-buff)

lat, long — ваше местоположение, buff — некоторое значение, которое вы можете настроить в соответствии с потребностями вашего приложения (например, 100 футов, 1 миля и т. д.)

Затем вы можете выполнить расчет расстояния по возвращенным записям.

person Dmitry Kachaev    schedule 17.08.2011