Поиск пользователей рядом с вами, в то время как координаты вас и других свободны для изменения - PullRequest
0 голосов
/ 30 октября 2010

У меня есть база данных с текущими координатами каждого онлайн-пользователя. Нажатием кнопки пользователь может обновить свои координаты, чтобы обновить свое текущее местоположение (которые затем отправляются на сервер). Приложение позволит вам установить радиус круга (где пользователь находится в центре), в котором вы можете видеть других пользователей на карте. Пользователи вне круга отбрасываются.

Какой оптимальный способ найти пользователей вокруг вас?

1) Самое простое решение - найти расстояние между вами и каждым пользователем, а затем посмотреть, меньше ли оно радиуса. Это может привести к чрезмерной нагрузке на сервер, так как необходимо проводить сравнение с каждым пользователем в мире. Кроме того, как можно справиться с изменениями в локациях?

2) Улучшенный способ - вычислять и сравнивать только расстояние с другими пользователями, имеющими одинаковую широту и долготу. Опять же, чтобы быть эффективным, если радиус уменьшается, приложение должно ориентироваться только на пользователей с еще более близкими координатами. Это не так просто, как кажется. Если бы человек шел вокруг Северного полюса, скажем, с радиусом 10 метров, то каждый шаг по окружности равнялся бы изменению долготы на 9 градусов. Каждый шаг по экватору будет маргинальным. Тем не менее, даже будучи очень грубым и предполагая, что пользователей, посещающих поляков, не так много, я могу в некоторой степени сузить его.

Будем весьма благодарны за любые идеи, касающиеся нахождения пользователей поблизости и того, как их поддерживать в курсе событий! :)

Andres

Ответы [ 3 ]

0 голосов
/ 30 октября 2010

Очень хорошая практика - использовать концепцию GeoHash (http://geohash.org/) или GeoModel http://code.google.com/p/geomodel/ (лучше для баз данных, подобных BigTable). Это эффективные способы геопространственного поиска. Я рекомендую вам прочитать некоторые из них по ссылкам.предоставили, но в двух словах:

  • GeoHash переводит lon и lat в уникальную хеш-строку, чем вы можете запросить базу данных через эти хеш-коды. Если точки расположены ближе друг к другу, аналогичный префикс будетдлиннее

  • GeoModel похож на GegoHash с той разницей, что хэшируются квадраты с заданной точностью. Если квадрат меньше, хэш длиннее.

Надеюсь, я вам помог. Но решение, которое вы выберете, остается за вами :).Лукаш

0 голосов
/ 02 ноября 2010

На мой взгляд, лучшим решением на данный момент является завернуть всю землю в матрицу. Каждая ячейка будет занимать небольшую область и иметь уникальный идентификатор. Эта информация будет храниться для каждой координаты в базе данных, и это позволяет мне быстро отфильтровывать нерелевантных пользователей (которые очень далеко). Затем используйте Pythagoras, чтобы вычислить расстояние между всеми другими пользователями и клиентом.

0 голосов
/ 30 октября 2010

1) вам, вероятно, понадобится двухэтапный процесс здесь.

a) Предполагая, что все местоположения попадают в базу данных, вы можете сделать сравнение на уровне sql (очень грубо) на основе широты и долготы, т.е. если вы ищете расстояния в 100 м, вы можете безопасно игнорировать местоположения, которые отличаются более чем на 0,01 градуса в обоих направлениях. Я не думаю, что ваши пользователи Северного полюса будут возражать;) Кроме того, не считайте это ненужным - лучше сделайте это на сервере, чем на iPhone.

b) затем вы можете использовать для остальных записей формулу сравнения, как показано ниже.

2) Вы можете найти способ вычисления расстояния между двумя координатами здесь http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/

...