SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.08.2011 09:44:21

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

всё те же массивы

Вопрос такой. Есть таблица [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. У зипа номер слабо зависит от положения.

Неактивен

 

#2 09.08.2011 14:45:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: всё те же массивы

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

Неактивен

 

#3 09.08.2011 14:56:18

Tsvetkov
Участник
Зарегистрирован: 08.01.2011
Сообщений: 14

Re: всё те же массивы

Сделайте Multiple-Column индекс для колонок - широта, долгота.

Если захотите проверять по радиусу, то сделайте процедуру которая
по квадрату выбирает во временную таблицу . А в этой  таблице проверяется по радиусу.

Неактивен

 

#4 09.08.2011 15:07:06

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

Re: всё те же массивы

)))Гыыы. тут мне вдруг стукнуло, что мои zip-ы - это центры масс регионов, а регионы могут иметь произвольную форму, так что поиск в квадрате по точности не уступит поиску в окружности.
Гугломап потряс, там нет возможности делать запросы within given zip. Люди говорят, что делают перебором массива zip-ов, но по скорости ужасно, да и результаты какие-то хреновые. Ну и на нашёл пару платных сервисов, их, конечно, в топку.

Неактивен

 

#5 09.08.2011 15:16:47

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: всё те же массивы

Необходимо проводить поиск типа "найти все zip коды, которые лежат в радиусе N километров от указанного".

А какое количество этого указанного ?
Если этих указанных точек не много, то конечно было бы оптимально сделать таблицу zip | point | distance

Неактивен

 

#6 09.08.2011 21:49:50

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

Re: всё те же массивы

А какое количество этого указанного ?

сейчас 70.000 с небольшим zip-ов. Что-то типа http://www.geopostcodes.com/, несколько стран. Поэтому декартово произведение не катит.
Ну двупроходной (квадрат, временная, радиус) мне кажется сильно долгим. Multiple-column index уже сделан.
Кстати, насчёт сайта... интересно, он подгружает рисунок... может, finereader справится... а то жаба душит 39 баксов... потом в открытый доступ кинуть... фирма разорится...

Неактивен

 

#7 10.08.2011 17:20:39

Tsvetkov
Участник
Зарегистрирован: 08.01.2011
Сообщений: 14

Re: всё те же массивы

попробуйте расширение  Spatial Extensions
http://dev.mysql.com/doc/refman/5.0/en/ … sions.html

Неактивен

 

#8 11.08.2011 08:38:43

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

Re: всё те же массивы

Большое спасибо, видимо, плохо гуглил. Сегодня оттестирую, если всё работает как в документации и с лучшей скоростью, отпишусь.

Неактивен

 

#9 11.08.2011 10:29:58

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

Re: всё те же массивы

не всё так гладко пока. Так как координаты в широте и долготе, то высчитать расстояние становится слишком дорого, ибо длина градуса широты зависит от долготы, придётся переводить в плоскую систему координат. А насчёт скорости работы - действительно, работает очень быстро по сравнению с другими способами.

Неактивен

 

#10 13.08.2011 18:49:08

megamanx
Участник
Зарегистрирован: 09.08.2011
Сообщений: 20

Re: всё те же массивы

Кароче, рылся я тут с этой системой координат, отечественные геодезисты вместо помощи сказали, что я ничего не понимаю в программировании. Если кому поможет - вычисление расстояния между двумя точками по формуле Евклида возможно при переводе широты/долготы в с.к. UTM в границах одной зоны. Для вычисления на поверхности шара по широте/долготе
http://www.meridianworlddata.com/Distan … lation.asp   , там же кстати и формула для нахождения по примитивной неточной формуле, но она работает)))

Отредактированно megamanx (13.08.2011 18:50:24)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson