【问题标题】:What is the best way to query a database for records within n miles of a zip code?在数据库中查询邮政编码 n 英里内的记录的最佳方法是什么?
【发布时间】:2009-02-09 09:21:29
【问题描述】:

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

查询我的数据库中的所有记录以查找另一个邮政编码 n 英里范围内的所有条目的“最佳实践”是什么?

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

对于这样一个常见的查询,这似乎在计算上非常昂贵。

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

我知道这是网站上的一个常见问题,因此希望有人可以为我指出正确的方向,以找到最佳方法。我正在使用 SQL Server 2008,如果有预构建的解决方案,那就太好了,因为在这种情况下,我真的 不想重新发明轮子 .


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

【问题讨论】:

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


    【解决方案1】:

    我将运行一个查询,返回所有记录在包围径向搜索圈的方形信封中(minlat

    如果你想花哨,SQL server 支持spatial indexes

    【讨论】:

      【解决方案2】:

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

      首先,确保您的位置表具有纬度和经度索引。如果您有数百万条记录,这就是 20 毫秒和 15 秒的响应时间之间的差异。

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

      坦率地说,我不会担心预先计算任何东西。就像我说的,我对一个有 6,000,000 个条目的位置表运行这种类型的查询,它通常会在

      祝你好运!

      【讨论】:

      • 感谢您提供有关此问题的个人信息。我很感激。
      【解决方案3】:

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

      这个解决方案基本上是用空间换时间,所以你可以很快得到一个相当大的数据库。好消息是:索引数据非常容易。

      【讨论】:

      • 所有对的预计算会有点大。大约。 40,000 us 邮政编码,因此每个范围的 (40,000)^2 将是很多数据库条目。
      • 每个范围大约有 16 亿个条目...我不知道这是否是一个选项。
      • 其实 Ola Bini 的建议是,如果可以限制邮政编码之间的最大距离(在他的示例中为 10 英里),则可以大大缩短条目数量
      【解决方案4】:

      您应该查看GeoNames.org。您可以查询他们的webservice 以获取您要查找的内容,或者您​​可以访问他们的数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多