在邮政编码的n英里内查询数据库的最佳方法是什么?

时间:2009-02-09 09:21:29

标签: linq sql-server-2008 zipcode spatial-query

我的数据库中有一个记录列表,每条记录都与一个邮政编码相关联。

查询我的数据库中的所有记录以找到距离另一个邮政编码n英里内的所有条目的“最佳做法”是什么?

每个邮政编码在数据库中都有一个与之关联的纬度/经度,所以我知道我必须使用它。但是,我无法想象在每对邮政编码上运行任何类型的距离公式,转换为里程并拒绝不在我的范围内的那些。

对于这样的常见查询来说,这看起来非常昂贵。

我还考虑过进行全对预计算,但它似乎也太大而无法考虑。美国大约有大约40,000个邮政编码。因此,每个邮政编码的所有对数据库将是(40,000)^ 2,或16亿条目。

我知道这是网站上的一个常见问题,所以希望有人可以指出我正确的方向以获得最佳方式。我正在使用 SQL Server 2008 ,如果有预先构建的解决方案,那么很棒,因为我真的不想在这个实例中重新发明轮子


相关问题:Getting all zip codes within radius(这对我没有帮助)
此外,我知道这个SourceForge项目,但它已经废弃,不再使用。

4 个答案:

答案 0 :(得分:7)

我会运行一个查询,返回包含径向搜索圈(minlat< lat< maxlat和minlong< long< maxlong)的方括号中括号内的所有记录,然后对此进行后处理以仅返回半径圆内的点。 (确保索引纬度和长字段。)

如果您想获得幻想,SQL Server支持spatial indexes

答案 1 :(得分:3)

我跑a site that needs to run this query about once per second per user,这就是我所学到的:

首先,请确保您的位置表在Lat和Lon上有索引。如果你有数百万条记录,这就是20ms和15s响应时间之间的差异。

从边界框查询开始,以获取一组要使用的位置。然后计算那些距离,排序,如果你对准确性挑剔,过滤一些。

坦率地说,我不担心预先计算任何东西。就像我说的,我对具有6,000,000个条目的位置表运行这种类型的查询,并且它通常返回<50ms的结果。根据您的需要,这真的要足够快。

祝你好运!

答案 2 :(得分:0)

这实际上是一个非常难以解决的问题。我建议你通过预先创建一个数据库做一些作弊。创建一个你需要找到的任何亲密度的网格,例如,每个方向每10英里,为该网格点和距离的每个zip添加一个条目到数据库,然后当一个查询进来时,你首先将查询点转换为您的一个网格点。现在你可以很容易地查看距离。

此解决方案基本上意味着交易空间的时间,因此您可以快速获得一个非常大的数据库。好消息是:索引数据非常容易。

答案 3 :(得分:0)

你应该看看GeoNames.org。您可以在webservice查询您要查找的内容,也可以查询数据库。