Фильтр по почтовому индексу или другим стратегиям поиска данных на основе местоположения
Мой маленький сайт должен объединять список элементов из таблицы, используя местоположение активного пользователя в качестве фильтра. Подумайте, Craigslist, где вы ищете "dvd", но результаты получены не во всех БД, они отфильтрованы по выбранному вами местоположению. Мой вопрос имеет 2 уровня:
- я должен пойти a-la-craigslist и попросить пользователей использовать местоположение на уровне города? Моя проблема с этим заключается в том, что вам нужно составить то, что мне кажется жестко закодированным, вручную составленным списком мест.
- я должен пойти а-ля-zipCode. Идея состоит в том, чтобы просто попросить пользователя ввести свой почтовый индекс, а затем объединить все элементы, которые находятся на том же или на определенном расстоянии от его почтового индекса.
Кажется, я предпочитаю способ с почтовым индексом, так как это кажется более элегантным решением, но как на самом деле можно создать БД всех почтовых индексов и реализовать функцию, которая с учетом почтового индекса 12345, получает все почтовые индексы на расстоянии 1 мили?
это должно быть довольно распространенной "задачей", так как многие сайты имеют потребность, аналогичную моей, поэтому я надеюсь не изобретать колесо здесь.
5 ответов
Получение базы данных почтового индекса не проблема. Вы можете попробовать это бесплатно: http://zips.sourceforge.net/
Хотя я не знаю, насколько это актуально, или вы можете использовать один из многих провайдеров. У нас есть годовая подписка на http://www.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 Но для поиска по этой теме есть МНОГИЕ ресурсы.
Вы можете использовать PostGIS. Кроме того, я использовал библиотеки отображения deCarta. У них есть технология, которая позволяет вам геокейить любой произвольный тип данных. Затем вы можете запросить их в пространстве.
Отказ от ответственности: я работаю на deCarta
Разве не было бы более эффективно просто определить, какие города находятся в радиусе 1 мили, и сохранить эту информацию в таблице? Тогда вам не нужно все время выполнять вычисления в базе данных.
Просто чтобы быть техническим... PostGIS - это не проект сообщества Postgres... это отдельный проект, который построен поверх Postgres. Если вам нужна помощь или поддержка PostGIS, вам нужно перейти в сообщество вместо Postgres.
как же можно [...] реализовать функцию, которая, учитывая почтовый индекс 12345, получает все почтовые индексы на расстоянии 1 мили?
Вот пример того, как это сделать: