Фильтр по почтовому индексу или другим стратегиям поиска данных на основе местоположения

Мой маленький сайт должен объединять список элементов из таблицы, используя местоположение активного пользователя в качестве фильтра. Подумайте, Craigslist , где вы ищете «dvd», но результаты получены не во всех БД, они отфильтрованы по выбранному вами местоположению. Мой вопрос имеет 2 уровня:

  1. я должен пойти a-la-craigslist и попросить пользователей использовать местоположение на уровне города? Моя проблема с этим заключается в том, что вам нужно сгенерировать то, что мне кажется жестко закодированным, вручную составленным списком мест.
  2. я должен пойти а-ля-zipCode. Идея состоит в том, чтобы просто попросить пользователя ввести свой почтовый индекс, а затем объединить все элементы, которые находятся на том же или на определенном расстоянии от его почтового индекса.

Кажется, я предпочитаю способ с почтовым индексом, так как это кажется более элегантным решением, но как на самом деле можно создать БД всех почтовых индексов и реализовать функцию, которая с учетом почтового индекса 12345, получает все почтовые индексы на расстоянии 1 мили?

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

15.08.2008 22:09:05
5 ОТВЕТОВ
РЕШЕНИЕ

Получение базы данных почтового индекса не проблема. Вы можете попробовать это бесплатно: http://zips.sourceforge.net/

Хотя я не знаю, насколько это актуально, или вы можете использовать один из многих провайдеров. У нас есть годовая подписка на ZipCodeDownload.com , и примерно за 100 долларов мы получаем ежемесячные обновления с последними данными почтового индекса в комплекте с широтой / долготой центроида почтового индекса.

Что касается запросов ко всем почтовым индексам в пределах определенного радиуса, вам понадобится пространственная библиотека некоторого вида. Если у вас есть таблица zip с латами / лонгами, вам понадобится механизм, ориентированный на базу данных. SQL Server 2008 имеет встроенную возможность, и есть библиотеки с открытым исходным кодом и коммерческие библиотеки , которые добавят такие возможности в SQL Server 2005. База данных с открытым исходным кодом PostgreSQL имеет проект PostGIS, который добавляет эту возможность в эту базу данных. Это здесь: http://postgis.refractions.net/

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

Если вы хотите пойти другим путем, вы можете использовать пространственные инструменты с библиотекой отображения. Здесь также есть опции с открытым исходным кодом, такие как SharpMap и многие другие ( Google может помочь ), которые могут использовать бесплатные карты Тигра для США в качестве источника данных. Однако этот маршрут несколько сложнее и, возможно, менее эффективен, если все, что вам нужно, это поиск по радиусу.

Наконец, вы можете заглянуть в веб-сервис. Это, как вы говорите, является общей потребностью, и я предполагаю, что существует любое количество веб-сервисов, на которые вы можете подписаться и которые могут предоставить все почтовые индексы в заданном радиусе из предоставленного почтового индекса. Быстрый поиск в Google обнаружил это: http://www.zip-codes.com/free-zip-code-tools.asp#radius Но для поиска по этой теме есть МНОГИЕ ресурсы .

5
15.08.2008 23:12:26

как же можно [...] реализовать функцию, которая, учитывая почтовый индекс 12345, получает все почтовые индексы на расстоянии 1 мили?

Вот пример того, как это сделать:

http://www.codeproject.com/KB/cs/zipcodeutil.aspx

0
16.08.2008 00:22:39

Просто чтобы быть техническим ... PostGIS - это не проект сообщества Postgres ... это отдельный проект, который построен поверх Postgres. Если вам нужна помощь или поддержка PostGIS, вам нужно перейти в сообщество вместо Postgres.

0
16.09.2008 05:50:34

Вы можете использовать PostGIS. Кроме того, я использовал картографические библиотеки deCarta. У них есть технология, которая позволяет геокейбить любой произвольный тип данных. Затем вы можете запросить их в пространстве.

Отказ от ответственности: я работаю на deCarta

0
22.09.2008 07:54:57

Разве не было бы более эффективно просто определить, какие города находятся в радиусе 1 мили, и сохранить эту информацию в таблице? Тогда вам не нужно делать вычисления в базе данных все время.

0
18.11.2008 22:42:52