Расчет расстояния по почтовому индексу - PullRequest
0 голосов
/ 07 сентября 2010

Я только что разработал калькулятор расстояний для почтовых индексов для моей компании Dads, где все наши клиенты хранятся в архиве, и каждый раз, когда новый потенциальный клиент делает запрос, система проверяет его по почтовым индексам всех других клиентов. Проблема в том, что он еще не делает расчет расстояния. Ввод почтового индекса DT1 с расстоянием, установленным в 5 миль, говорит о том, что DT1, 2 и 3 находятся рядом. DT2 говорит DT1 и 2, DT3 говорит DT1, 3 и 4. Это не имеет никакого смысла. И все же, если я пройду BH2 с расстояния в 50 миль, он вернет Борнмут, Дорчестер, Портсмут, Бат, Саутгемптон и еще пару городов. Все это правильно, однако я не знаю, что происходит с почтовыми индексами DT. DT11 не возвращает (меньше 5 миль), а также DT10 (кроме себя).

Прежде всего, я использовал корень (x * x + y * y) - я считаю, что это называется теоремой Пифагора ... не уверен, поскольку прошло много лет с тех пор, как я использовал этот термин !!

Я также пробовал следующее:

  $sinstuff = sin(deg2rad($latitude))*sin(deg2rad($latitude2));
  $cosstuff = cos(deg2rad($latitude))*cos(deg2rad($latitude2))*cos(deg2rad($longitude-$longitude2));
  $sumstuff = $sinstuff + $cosstuff;
  $acosstuff = rad2deg(acos($sumstuff));
  $distance = $acosstuff*60*1.1515; //dunno what the 60 and 1.1515 is all about - I got this formula off a website.

Это формула, которая, кажется, приносит странные результаты. Я также заметил, что точное расстояние между DT11 и DT11 примерно равно +/- 0,00000989 {и много других чисел}. Это также кажется немного странным, поскольку, конечно, расстояние между DT11 и самим собой составляет 0 ...

Кто-нибудь когда-нибудь делал что-нибудь подобное успешно?

У меня есть огромная партия файлов - всего около 158 МБ - содержащих полный почтовый индекс Великобритании с соответствующей широтой и долготой. Моя цель состоит не в том, чтобы сравнивать указанный полный почтовый индекс с любым другим полным почтовым индексом, чтобы определить, какие коды городов находятся на расстоянии менее определенного расстояния, а затем сравнить указанный почтовый индекс со всеми полными почтовыми индексами, которые находятся в этих областях. Это эффективно? Есть ли более эффективный способ?

Любая помощь с этим будет принята с благодарностью.

С уважением,

Richard

PS Я знаю, что есть некоторые сайты, которые рассказывают вам, как работать на расстоянии, но я, кажется, не могу заставить работать любой из них корректно (как вы можете заметить сверху).

PPS Я знаю, что могу использовать Google API для этого - но это не вариант, так как это будет автономное приложение, работающее на локальной установке wamp-сервера. Он предназначен для использования на выставках, где мы не можем гарантировать подключение к Интернету.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

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

1 голос
/ 07 сентября 2010

Вы используете формулу haversine:

$ l1 ==> latitude1$ o1 ==> долгота1$ l2 ==> широта2$ o2 ==> долгота2

(взято из http://www.go4expert.com/forums/showthread.php?t=339)

function haversine ($l1, $o1, $l2, $o2)<br/>
{<br/>
    $l1 = deg2rad ($l1);<br/>
    $sinl1 = sin ($l1);<br/>
    $l2 = deg2rad ($l2);<br/>
    $o1 = deg2rad ($o1);<br/>
    $o2 = deg2rad ($o2);<br/>
    return (7926 - 26 * $sinl1) * asin (min (1, 0.707106781186548 * sqrt ((1 - (sin ($l2) * $sinl1) - cos ($l1) * cos ($l2) * cos ($o2 - $o1)))));<br/>
}  <br/>

Это должно дать вам расстояние между двумя точками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...