Задавайте вопросы, мы ответим
Вы не зашли.
Вопрос такой. Есть таблица [zip-код, широта, долгота]. Необходимо проводить поиск типа "найти все zip коды, которые лежат в радиусе N километров от указанного". Формула тяжёлая, записей много. Для упрощения делаю не радиус, а квадрат, и после этого сравниваю на больше-меньше широту и долготу. Всё равно медленно, потому что гладиолус.
Пришла мысля - сделать таб.перекрёстных ссылок. Ну например поля типа zip, 10, 20, 50, 100, 200, 500 и хранить в них массивы zip кодов, лежащих в кольцах радиуса от 0-10, 10-20, 20-50 и т.д., либо 0-10, 0-20, 0-50 и т.д. Количество zip от местности очень сильно варьируется. (То есть, у одного zip в радиусе 10 км. может быть 50 соседей, а у другого в радиусе 500 всего 10).
Кто-то решал что-то подобное (в смысле геолокации)? И может что посоветовать.
P.S. Советы о третьей нормальной форме не надо давать.
P.P.S. Есть вариант обращения к сторонним сервисам, типа гугломапа, но пока его откинул, он тоже не сильно быстрее выходит, зато сервер меньше напрягает.
P.P.P.S. У зипа номер слабо зависит от положения.
Неактивен
Подобные задачи не решал, но, на мой взгляд, если сделать предложенную таблицу перекрестных ссылок с полнотекстовым индексом, то работать должно быстро.
Неактивен
Сделайте Multiple-Column индекс для колонок - широта, долгота.
Если захотите проверять по радиусу, то сделайте процедуру которая
по квадрату выбирает во временную таблицу . А в этой таблице проверяется по радиусу.
Неактивен
)))Гыыы. тут мне вдруг стукнуло, что мои zip-ы - это центры масс регионов, а регионы могут иметь произвольную форму, так что поиск в квадрате по точности не уступит поиску в окружности.
Гугломап потряс, там нет возможности делать запросы within given zip. Люди говорят, что делают перебором массива zip-ов, но по скорости ужасно, да и результаты какие-то хреновые. Ну и на нашёл пару платных сервисов, их, конечно, в топку.
Неактивен
Необходимо проводить поиск типа "найти все zip коды, которые лежат в радиусе N километров от указанного".
А какое количество этого указанного ?
Если этих указанных точек не много, то конечно было бы оптимально сделать таблицу zip | point | distance
Неактивен
А какое количество этого указанного ?
сейчас 70.000 с небольшим zip-ов. Что-то типа http://www.geopostcodes.com/, несколько стран. Поэтому декартово произведение не катит.
Ну двупроходной (квадрат, временная, радиус) мне кажется сильно долгим. Multiple-column index уже сделан.
Кстати, насчёт сайта... интересно, он подгружает рисунок... может, finereader справится... а то жаба душит 39 баксов... потом в открытый доступ кинуть... фирма разорится...
Неактивен
попробуйте расширение Spatial Extensions
http://dev.mysql.com/doc/refman/5.0/en/ … sions.html
Неактивен
Большое спасибо, видимо, плохо гуглил. Сегодня оттестирую, если всё работает как в документации и с лучшей скоростью, отпишусь.
Неактивен
не всё так гладко пока. Так как координаты в широте и долготе, то высчитать расстояние становится слишком дорого, ибо длина градуса широты зависит от долготы, придётся переводить в плоскую систему координат. А насчёт скорости работы - действительно, работает очень быстро по сравнению с другими способами.
Неактивен
Кароче, рылся я тут с этой системой координат, отечественные геодезисты вместо помощи сказали, что я ничего не понимаю в программировании. Если кому поможет - вычисление расстояния между двумя точками по формуле Евклида возможно при переводе широты/долготы в с.к. UTM в границах одной зоны. Для вычисления на поверхности шара по широте/долготе
http://www.meridianworlddata.com/Distan … lation.asp , там же кстати и формула для нахождения по примитивной неточной формуле, но она работает)))
Отредактированно megamanx (13.08.2011 18:50:24)
Неактивен