Я работаю на локальном сайте бизнес-каталога, который будет использовать пользовательские типы записей для бизнес-записей. Одним из полей будет «Почтовый индекс». Как настроить поиск по местоположению?
Я бы хотел, чтобы посетители могли ввести свой почтовый индекс, выбрать категорию и показать все предприятия с определенным радиусом или все предприятия, упорядоченные по расстоянию. Я видел пару плагинов, которые утверждают, что делают это, но они не поддерживают WordPress 3.0. Какие-либо предложения?
search
geo-data
location-search
матовый
источник
источник
Ответы:
Я бы изменил ответ от gabrielk и связанного поста в блоге , используя индексы базы данных и сводя к минимуму количество вычислений фактического расстояния .
Если вы знаете координаты пользователя и знаете максимальное расстояние (скажем, 10 км), вы можете нарисовать ограничивающую рамку размером 20 на 20 км с текущим местоположением посередине. Получить эти ограничивающие координаты и запрашивать только магазины между этими широтами и долготами . Пока не используйте тригонометрические функции в запросе к базе данных, так как это предотвратит использование индексов. (Таким образом, вы можете получить магазин, который находится в 12 км от вас, если он находится в северо-восточном углу ограничительной рамки, но мы выбросим его на следующем шаге.)
Рассчитайте расстояние (по мере того, как птица летит или с фактическими направлениями движения, как вы предпочитаете) только для нескольких магазинов, которые были возвращены. Это значительно улучшит время обработки, если у вас есть большое количество магазинов.
Для соответствующего поиска ( «дайте десять ближайших магазинов» ) вы можете выполнить аналогичный поиск, но с начальным предположением о расстоянии (поэтому вы начинаете с площади 10 км на 10 км, и если у вас недостаточно магазинов, вы расширяете ее до 20км на 20км и тд). Для этой начальной дистанции вы рассчитываете количество магазинов по всей площади и используете его. Или зарегистрируйте количество необходимых запросов и адаптируйте их с течением времени.
Я добавил полный пример кода к связанному вопросу Майка , и вот расширение, которое дает вам самые близкие местоположения X (быстрые и едва проверенные):
источник
Сначала вам нужна таблица, которая выглядит примерно так:
... заполняется для каждого почтового индекса. Вы можете расширить это, добавив поля города и штата, если хотите посмотреть таким образом.
Тогда каждому магазину может быть присвоен почтовый индекс, и когда вам нужно рассчитать расстояние, вы можете присоединить таблицу широты / длины к данным магазина.
Затем вы запросите эту таблицу, чтобы узнать широту и долготу магазина и почтовые индексы пользователя. Получив его, вы можете заполнить свой массив и передать его в функцию «получить расстояние»:
Это подразумевается как подтверждение концепции, а не как код, который я бы порекомендовал реализовать. Например, если у вас есть 10 000 магазинов, было бы довольно дорогой операцией запросить их все, просмотреть и отсортировать их при каждом запросе.
источник
Документация MySQL также включает информацию о пространственных расширениях. Как ни странно, стандартная функция distance () недоступна, но проверьте эту страницу: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html, чтобы узнать, как «конвертировать» два значения POINT для LINESTRING, а затем вычислить длину этого. "
Обратите внимание, что каждый поставщик может предложить разные широты и долготы, представляющие «центроид» почтового индекса. Также стоит знать, что не существует реально определенных «граничных» файлов почтового индекса. Каждый поставщик будет иметь свой собственный набор границ, которые примерно соответствуют конкретным спискам адресов, которые составляют почтовый индекс USPS. (Например, в некоторых «границах» вам нужно будет включить обе стороны улицы, в других - только одну.) Области табуляции почтовых индексов (ZCTA), широко используемые поставщиками, «не точно отображают области доставки почтовых индексов, и не включать все почтовые индексы, используемые для доставки почты " http://www.census.gov/geo/www/cob/zt_metadata.html
Многие предприятия в центре города будут иметь свой собственный почтовый индекс. Вам понадобится как можно более полный набор данных, поэтому убедитесь, что вы найдете список почтовых индексов, который включает как «точечные» почтовые индексы (обычно предприятия), так и «граничные» почтовые индексы.
У меня есть опыт работы с данными почтового индекса с http://www.semaphorecorp.com/ . Даже это не было на 100% точно. Например, когда мой кампус взял новый почтовый адрес и новый почтовый индекс, почтовый индекс был не на своем месте. Тем не менее, это был единственный источник данных, который я обнаружил, что даже имел новый почтовый индекс, так что вскоре после его создания.
В моей книге был рецепт того, как именно удовлетворить вашу просьбу ... в Друпале. Он опирался на модуль Google Maps Tools ( http://drupal.org/project/gmaps , не путать с http://drupal.org/project/gmap , также достойным модулем.) Вы можете найти несколько полезных примеров код в этих модулях, хотя, конечно, они не будут работать из коробки в WordPress.
источник