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

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

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

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

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

Ответов (5)

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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