Как работает «Найти ближайшие места»? - PullRequest
8 голосов
/ 01 декабря 2008

В настоящее время большинство ресторанов и других предприятий имеют на своих веб-сайтах функцию " Поиск местоположений ", которая перечисляет ближайшие местоположения для данного адреса / почтового индекса. Как это реализовано? Сопоставление почтового индекса с базой данных является простым и легким способом, но может не всегда работать, например, может быть ветвь ближе к указанному месту, но может быть другой почтовый индекс. Один подход, который приходит мне в голову, - преобразовать данный почтовый индекс / адрес в координаты карты и перечислить все ветви, попадающие в заранее определенный радиус. Я приветствую ваши мысли о том, как это было бы реализовано. Если возможно, предоставьте более подробную информацию о реализации, например, о любых используемых веб-сервисах и т. Д.,

Ответы [ 8 ]

6 голосов
/ 01 декабря 2008

В этом вам поможет множество геопространственных структур. В геопространственном мире почтовый индекс - это просто «многоугольник», который представляет собой просто область на карте, которая определяет четкие границы (а не многоугольник в математическом смысле). Например, в пространственной версии SQL 2008 вы можете создать новый многоугольник на основе своего исходного многоугольника. Таким образом, вы можете динамически создавать многоугольник, который является вашим почтовым индексом, расширенным на определенное расстояние в каждой точке. Принимает во внимание причудливую форму почтового индекса. С адресом это легко, потому что вы просто создаете многоугольник, который представляет собой круг вокруг одной точки. Затем вы можете выполнять запросы, чтобы получить все точки в новом многоугольнике, который вы создали любым из методов.

Многие из этих сайтов в основном просто делают это. Они дают вам все очки в пределах 5-мильного расширенного многоугольника, а затем, возможно, 10-мильного расширенного многоугольника, и так далее, и так далее. Они на самом деле не рассчитывают расстояние. Большинство ма материалов в Интернете совсем не сложны.

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

4 голосов
/ 01 декабря 2008

Доступна стандартная база данных zipode / location. Вот одна версия в формате Access , которая включает в себя широту / длину почтового индекса, а также другую информацию. Затем вы можете использовать расширения ГИС PostgreSQL для поиска местоположений, например.

(при условии, конечно, что вы извлекаете базу данных доступа и вставляете ее в более дружественную базу данных, такую ​​как PostgreSQL)

1 голос
/ 01 декабря 2008

Сначала вы геокодируете адрес, переводя его (обычно) в широту и долготу. Затем вы делаете запрос к ближайшему соседу в вашей базе данных для точек интереса.

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

0 голосов
/ 02 февраля 2009

У меня была таблица, в которой я собирал бы таблицу базы данных каждые 6 месяцев, она содержала 3 столбца, я использовал ее для нескольких клиентов в Австралии, она содержала около 40 тыс. Строк, очень легкий для выполнения запроса. это довольно быстро, если вы просто ищете что-то для клиента

  1. Почтовый индекс от
  2. Почтовый индекс
  3. Расстояние

    ВЫБЕРИТЕ Store_ID, Store_AccountName, Store_PostalCode, Store_Address, Store_Suburb, Store_Phone, Store_State, Code_Distance FROM Store, (ВЫБЕРИТЕ Code_To как Code_To, Code_Distance ИЗ КОДА WHERE Code_From = @PostalCode UNION_E_E_T_E_D_F_T_F_INDOW_EOD_E_D_F_T_E_DOW_E_E_DER_T_F_F_F_F_F_L_T_F_ROOT_F_F_F_WR_T_F_RU_NOW_DEL_F_F_E_DER_O_G_T_F_F_F_R_F_RU_DEL_ROOT_F_RUS_NOW_DEL_TOW_DEL_F_F_F_RUS_NER_O_DEL_T_E_DER_O_DER_FID_F_D_F_RID UNION ALL SELECT Код Почтовый код UNION ALL SELECT @PostalCode как Code_To, 0 как Code_Distance) Как код WHERE Store_PostalCode = Code_To AND Code_Distance <= @Distance ORDER BY Code_Distance </p>

Возможно, вы могли бы оптимизировать этот запрос, чтобы ускорить этот запрос!

0 голосов
/ 12 января 2009

Существуют фактические геометрические алгоритмы и / или структуры данных, которые поддерживают более низкие O (...) запросов ближайшего местоположения для данных точек, линий и / или областей.

См. эту книгу в качестве примера информации о некоторых из них, таких как: диаграммы Вороного, дерева квадрантов и т. Д.

Однако я думаю, что другие ответы здесь правильны в большинстве случаев, которые вы найдете в программном обеспечении сегодня:

  1. геокод (единственная точка в) области поиска
  2. запрос ограничивающего прямоугольника для получения начального шага
  3. в памяти сортировка / выбор
0 голосов
/ 01 декабря 2008

Ваши мысли о том, как это сделать, таковы, как я, вероятно, сделал бы это. Вы можете геокодировать координаты для почтового индекса, а затем делать расчеты на основе этого. Я знаю, что SQL Server 2008 имеет некоторые новые специальные функции, которые помогают выполнять запросы на основе этих геокодированных координат lon / lat.

0 голосов
/ 01 декабря 2008

Я думаю, что это довольно универсально. Они берут адрес или почтовый индекс и превращают его в «координату карты» (различается в зависимости от реализации, вероятно, широта / долгота), а затем, используя «координаты карты» вещей в базе данных, легко вычислить расстояние.

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

0 голосов
/ 01 декабря 2008

Так же, как вы сказали. Преобразуйте адрес / ZIP в двухмерную мировую координату и сравните ее с другими известными местоположениями. Выберите ближайший. :) Я думаю, что некоторые БД (Oracle, MSSQL 2008) даже предлагают некоторые функции, которые могут помочь, но я никогда не использовал их.

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