我的数据库中有一个记录列表,每条记录都与一个邮政编码相关联。
查询我的数据库中的所有记录以找到距离另一个邮政编码n英里内的所有条目的“最佳做法”是什么?
每个邮政编码在数据库中都有一个与之关联的纬度/经度,所以我知道我必须使用它。但是,我无法想象在每对邮政编码上运行任何类型的距离公式,转换为里程并拒绝不在我的范围内的那些。
对于这样的常见查询来说,这看起来非常昂贵。
我还考虑过进行全对预计算,但它似乎也太大而无法考虑。美国大约有大约40,000个邮政编码。因此,每个邮政编码的所有对数据库将是(40,000)^ 2,或16亿条目。
我知道这是网站上的一个常见问题,所以希望有人可以指出我正确的方向以获得最佳方式。我正在使用 SQL Server 2008 ,如果有预先构建的解决方案,那么很棒,因为我真的不想在这个实例中重新发明轮子
相关问题:Getting all zip codes within radius(这对我没有帮助)
此外,我知道这个SourceForge项目,但它已经废弃,不再使用。
答案 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查询您要查找的内容,也可以查询数据库。