Мы делаем это примерно для 1200 мест. Я бы просто использовал формулу Хаверсина «на лету», хотя в зависимости от вашего приложения лучше было бы хранить его в PHP вместо SQL. (Наша реализация в .net, поэтому ваше перемещение может меняться).
Действительно, наш самый большой недостаток в том, как мы его реализовали, заключается в том, что каждый расчет (до недавнего времени) должен был быть рассчитан на уровне данных, который был болезненно медленным (когда я говорю медленно, я действительно имею в виду немедленное принятие второй или около того), но это было связано с тем, что ему приходилось вычислять расстояние для всех 1200 мест на основе поставленного почтового индекса.
В зависимости от выбранного маршрута существуют способы ускорить расчет расстояний между номерами, взглянуть на долготу и широту и удалить их за пределами предопределенного диапазона (например, если вы просматриваете весь адрес в течение 20 миль есть диапазон долготы, вы можете рассчитать, что все адреса должны упасть, чтобы быть в 20 милях.) Это может ускорить ваш запрос, если это необходимо.
Мы действительно посмотрели на хранение всех возможных комбинаций в нашей базе данных. На самом деле это звучит так, будто это может быть большой магазин данных, но это действительно не в большом объеме вещей. С индексами это может быть довольно быстро, и вам не нужно беспокоиться об оптимизации алгоритмов и т. Д. Мы решили против этого, потому что у нас было уравнение в C#, и это позволило нам кэшировать информацию, необходимую для выполнения всех вычислений в бизнес-уровня. Либо все будет работать отлично, это всего лишь вопрос ваших предпочтений.
См. Также мелкий http://www.movable-type.co.uk/scripts/latlong.html#cosine-law – Arjan 2010-05-29 17:11:32