0

A user signs up for my site and enters in their zip code. I want to query for other users, and sort by distance.

I have a database full of zip codes with lat/lon points for each zip code.

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

I have a method which will calculate the distance between two sets of lat/lons, but to run this on every other zip code in my db is expensive. I'd need to run this on every zip code combination. I suppose I can do it once and store it somewhere, but where would I store it? Seems strange to have a table for every zip code which would contain the distance to every other zip code. Is there a clean way to do this?

4

2 回答 2

0

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

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

  1. 将您的邮政编码位置存储为点几何类型,而不是两列用于纬度和经度。
  2. 针对点几何列创建空间索引。每次添加新邮政编码时,其位置都会自动添加到空间索引中。
  3. 假设您不想显示数千英里外的“最近”邻居,请使用 Within 函数( PostGIS 中的ST_DWithin)过滤掉那些太远的邮政编码。这将显着减少近邻的搜索空间。
  4. 最后使用距离函数( PostGIS 中的ST_Distance)来计算您感兴趣的邮政编码与其更近的邻居之间的距离,并使用数据库返回按距离排序的结果。

通过使用具有空间索引的数据库和使用该索引的过滤功能,您可以显着加快搜索速度。当需要进行更多空间分析或显示地图时,您将拥有一个支持该新功能的框架。

于 2013-07-08T17:28:01.823 回答
0

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

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

有关更多算法视图,请参阅上一个问题:计算邮政编码和用户之间的距离

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

于 2013-07-01T15:06:00.313 回答