Клуб API Карт

Реализация "Места рядом"

dejurin
28 декабря 2012, 20:12

Дорогие одноклубники, подскажите как реализовать показ мест рядом.

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

Дело в том, что у меня есть небольшая база точек которые нужно правильно перелинковать исходя из их удаленности друг от друга, примера на сайте: http://placeplaceplace.ru/places/14274-tvorcheskaya-usadba-freelabs - здесь реализован вывод 3х мест рядом, прямо под комментариями.

4 комментария
Подписаться на комментарии к посту

Вообще, частично зависит от того, каким образом вы храните данные о точках.

Есть у вас есть возможность использовать геохранилища в БД, то читайте документацию по теме.

Самый простой вариант — завести пару полей (типа x,y) или одно сводное (типа x+y*w, где w ширина) и по ним делать первичный поиск. В поля складывать заранее просчитанные тайловые координаты для какого-то зума по wgs84, или, по возможности, получать координаты тайлов яндекс.карт через апи. Еще желательно сделать по ним индекс (или включить эти поля, хотя бы одно из них, в имеющийся), если точек много, и при поиске рядом пересчитывать входные координаты в тайловые, после чего искать по этим двум полям точки, входящие в указанные тайл (либо еще и в тайлы рядом, в зависимости от зума).

Еще вариант sqrt((xc-x0)*2+(yc-y0)*2), что в переводе на русский "корень суммы квадратов разностей" значений осей координат текущей и точки рядом, это если нужно ровно по кругу/овалу вокруг текущей точки искать, но предварительно лучше все же отфильтровать по тайлам, ибо операция расчета корня несколько сложнее и для десятков-сотен тысяч точек в таблице при достаточном кол-ве запросов будет уже заметна.

Ссылки по теме и баянчики:

http://msdn.microsoft.com/en-us/library/cc280766.aspx

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

http://blog.salikhovilyas.ru/2009/05/10/geo-data-and-opengis/

на самом деле, если все в пределах одного города, вообще можно не городить огород.
просчитать сколько метров в 1 градусе широты (dLat) и долготы (dLng) и делать так:
d = sqrt( ((lat1 - lat2) * dLat)^2 + ((lng1 - lng2) * dLng)^2 )

кстати, для "рядом" сначала формируй прямоугольник из координат типа:
макс расстояние  - d, точка [ lat, lng]
bounds =[ [ lat - d / dLat, lng - d / dLng] ,  [ lat + d / dLat, lng + d / dLng]
прогоняешь точки через этот прямоугольник. те, кторые туда попадают уже просчитываешь по первой формуле.

и не читай пост qfox - там ересь

2qFox : ты своими постами меня просто заставляешь писать людям правду!)
http://clubs.ya.ru/mapsapi/replies.xml?item_no=14193
вот ссылка на похожий пост

Рекомендую использовать для этих целей сфинкс или монго.

Умеют из коробки.