获取用户最近的城市的最佳方法是什么?Python/Django

4
我有一个网站,数据库里只有有限数量的城市信息,我需要展示用户当前位置最近的城市。
我可以通过MaxMind API获取到用户的位置信息,但是我需要得到离用户最近的城市信息。
例如,如果我的数据库里有这些城市:洛杉矶、旧金山和纽约市,而我正在从迈阿密这个城市访问该网站,那么我应该看到被选中的是纽约市,因为它在地理上是最近的。
如何快速且高效地实现这一功能呢?

2
大约纬度和经度(仅度数,不是分钟或秒)+距离公式。请参见http://www.movable-type.co.uk/scripts/latlong.html - Rafe Kettler
2个回答

7

每个城市都需要存储大致的纬度和经度,为用户计算以度为单位的纬度和经度,然后使用Haversine公式来计算距离。该公式已经在这里使用Javascript实现。MaxMind API应该会给出纬度和经度。


1
好的,谢谢。但是如果城市表增长到像1000个城市这样的规模呢?我需要遍历所有记录并进行比较吗? - Leandro Ardissone
@Leandro 你可以实现一些启发式算法来使比较更容易,例如如果你知道你在美国,只检查美国,或者如果你知道你在加利福尼亚州,只检查加州。 - Rafe Kettler
啊,这是个好主意!我会将城市与州和国家一起存储,这样过滤它们就更容易了。谢谢! - Leandro Ardissone
小心。如果用户住在边境附近,而另一个州的城市比他所在州的城市更近,那该怎么办? - Alex Bliskovsky
1
@Alex Bliskovsky,无论你如何组织它(国家、地区、省份,甚至县级行政区),这都可能是一个问题。最终,如果你选择相对较小的单位(例如省份),除非你追求最大精度,否则问题相对较小。 - Rafe Kettler
是的,无论如何我不需要那种精度水平。这只是在用户注册之前的预览,真正的城市将存储到用户配置文件中。 - Leandro Ardissone

0

让每当您向数据库添加城市时,都会运行一段代码(离线),计算您拥有的每个城市最近的城市。您可以使用外键将每个城市指向另一个城市作为其最近的城市。

现在,您已经预先计算了所有内容,每当有实时请求时,只需使用城市名称命中数据库,您就可以通过指定的外键到达最近的城市。(城市---外键--->城市)

现在,由于您已经离线预先计算了最近的城市,并且可以在每个实时请求上立即返回结果,因此速度非常快。

但是,您计划多久添加一个城市?可能不那么频繁。因此,即使需要花费一些时间进行离线预计算,它也会很少发生。但是实时请求的响应非常快。(其他人已经推荐了用于计算距离的公式,因此我将跳过该部分!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接