按邮政编码或者其他基于位置的数据检索策略过滤
我的小网站应该使用活动用户的位置作为过滤器来汇总表中的项目列表。想想Craigslist,我们在其中搜索" dvd",但结果并非来自所有数据库,而是按我们选择的位置进行过滤。我的问题分为2个级别:
- 我应该去la-craigslist,并要求用户使用城市级别的位置吗?我的问题是,我们需要生成对我来说似乎是硬编码的手工位置列表。
- 我应该去a-la-zipCode。只是要求用户键入邮政编码,然后合并与邮政编码相同或者相距一定距离的所有项目的想法。
我似乎更喜欢邮政编码方式,因为它似乎是更优雅的解决方案,但是究竟如何创建一个包含所有邮政编码的DB并实现给定邮政编码12345的功能,从而在1英里距离内获取所有邮政编码?
这应该是相当常见的"任务",因为许多站点都需要与我的站点类似的驱动程序,因此我希望不要在这里重新发明轮子。
解决方案
回答
获取邮政编码数据库没有问题。我们可以尝试这个免费的:
http://zips.sourceforge.net/
尽管我不知道它是最新的,还是可以使用许多提供程序之一。我们每年都订阅ZipCodeDownload.com,并且可能每月支付100美元,即可获得每月一次的更新,其中包含最新邮政编码数据以及邮政编码质心的纬度/经度。
至于查询特定半径内的所有拉链,我们将需要某种空间库。如果只有一张带经纬度的邮政编码表,则将需要一种面向数据库的机制。 SQL Server 2008具有内置的功能,并且有开源库和商业库将这些功能添加到SQL Server 2005中。开源数据库PostgreSQL有一个项目PostGIS,它将此功能添加到该数据库中。它在这里:http://postgis.refractions.net/
其他数据库平台可能也有类似的项目,但是我知道这些。使用这些基于数据库的库之一,我们应该能够直接查询给定半径内的任何邮政编码(或者具有纬度/经度列的任何类型的行)。
如果要走另一条路线,可以将空间工具与地图库一起使用。这里也有开源选项,例如SharpMap和许多其他选项(Google可以),它们可以将美国的免费Tiger地图用作数据源。但是,如果我们仅需要半径搜索,则此路线会稍微复杂一些,并且性能可能会降低。
最后,我们可能需要研究Web服务。正如我们所说的,这是一个普遍的需求,我想我们可以订阅许多网络服务,这些服务可以从提供的邮政编码提供给定半径内的所有邮政编码。快速的Google搜索显示了以下内容:
http://www.zip-codes.com/free-zip-code-tools.asp#radius
但是,有很多资源可用于搜索此主题。
回答
how on earth do one [...] implement the function that given zip code 12345, gets all zipcodes in 1 mile distance?
这是有关如何执行此操作的示例:
http://www.codeproject.com/KB/cs/zipcodeutil.aspx
回答
只是出于技术方面的考虑……PostGIS不是Postgres社区的项目……它是基于Postgres构建的独立项目。如果我们希望获得有关PostGIS的帮助或者支持,我们将需要访问它的社区而不是Postgres。
回答
我们可以使用PostGIS。另外,我使用了deCarta的映射库。他们拥有可以让我们对任意数据类型进行地理编码的技术。然后,我们可以在空间上查询这些内容。
免责声明:我为deCarta工作
回答
仅找出半径1英里内的哪些城市并将该信息存储在表格中会更有效吗?然后,我们不必一直在数据库中进行计算。