我如何按照单个纬度/经度的距离对一组纬度/经度进行排序?

时间:2013-07-01 14:03:14

标签: python geocoding geospatial geo

用户注册我的网站并输入他们的邮政编码。我想查询其他用户,并按距离排序。

我有一个包含邮政编码的数据库,每个邮政编码都有纬度/经度值。

zip_code (char)
lat (float)
lon (float)

我有一个方法可以计算两组纬度/经度之间的距离,但是在我的数据库中的每个其他邮政编码上运行此方法都很昂贵。我需要在每个邮政编码组合上运行它。我想我可以做一次并将它存放在某个地方,但我会在哪里存储它?看起来很奇怪,每个邮政编码都有一个表格,其中包含与其他邮政编码的距离。有干净的方法吗?

2 个答案:

答案 0 :(得分:0)

做一次并将其存放在某个地方对我来说听起来不错。以下是一些可能在不牺牲准确性的情况下考虑存储空间而提供良好性能的想法:

有类似于43,491邮政编码的东西,所以全部是1,865,462,481。但距离当然是对称的,而自我对象则无用,立即将其减少到932,709,645个条目。我们也可能通过意识到一堆邮政编码彼此相同或者一个包含另一个(例如10178似乎在10016内,并且它们在地理上都很小)来缩小空间。许多邮政编码根本没有用户,因此我们可能会避免在需要之前填充这些邮件(即延迟加载缓存)。最后,您可能会丢弃大距离结果,其中大的定义为距离大于对用户有用的距离。

有关更多算法视图,请参阅上一个问题:Calculate distance between zip codes and users

额外提示:不要忘记非美国用户。可怜的非美国用户。

答案 1 :(得分:0)

这是一个具有相当大开销的解决方案,但随着您的数据集大小,用户群和/或交易数量的增长,这将得到回报:

如果您还没有,请使用支持空间类型和空间索引的数据库。我推荐PostGres的PostGIS扩展名,但其中大多数步骤适用于其他启用空间的数据库:

  1. 将您的邮政编码位置存储为点几何类型,而不是将两列用于lat和long。
  2. 针对“点几何体”列创建空间索引。每次添加新的邮政编码时,其位置都会自动添加到空间索引中。
  3. 假设你不想表现出最近的"在千里之外的邻居,使用内部函数(PostGIS中的ST_DWithin)过滤掉那些距离太远的邮政编码。这将大大减少近邻的搜索空间。
  4. 最后使用距离函数(PostGIS中的ST_Distance)来计算您感兴趣的邮政编码与其较近邻居之间的距离,并使用数据库返回按距离排序的结果。
  5. 通过使用具有空间索引的数据库和使用该索引的过滤功能,您可以显着加快搜索速度。当需要进行更多空间分析或展示地图时,您已经有了一个框架来支持这一新功能。