【问题标题】:Best way to get user nearest city? Python/Django让用户最近的城市的最佳方式?蟒蛇/Django
【发布时间】:2011-05-29 13:54:46
【问题描述】:

我有一个网站,其数据库中的城市数量有限,需要向用户显示离他当前位置最近的城市。

我可以通过 MaxMind API 获取位置,但我想获取数据库中离用户城市最近的城市。

例如,如果我在数据库中有这些城市:Los AngelesSan FranciscoNew York City,并且我正在从其他城市(如 Miami)访问,我应该会看到 NYC 被选中,因为它是地理位置上最近的.

什么是快速和性能感知的最佳方法?

【问题讨论】:

标签: python django geolocation geoip


【解决方案1】:

您应该存储每个城市的大致纬度和经度,以度数为用户计算纬度和经度,然后使用Haversine formula 查找距离。它在 Javascript here 中实现。 MaxMind API 应该为您提供纬度和经度。

【讨论】:

  • 很好,谢谢,但是如果我的城市表增加到 1000 个城市怎么办?我应该浏览所有比较它们的记录吗?
  • @Leandro 您可能可以实施一些启发式方法以使比较更容易,例如如果你知道你在美国,只检查美国,或者如果你知道你在加利福尼亚,只检查 CA。
  • 啊,这是个好主意!我将使用州和国家/地区存储城市,然后过滤它们会更容易。谢谢!
  • 小心。如果用户住在边境附近,而另一个州的城市比他当前州的城市更近,该怎么办?
  • @Alex Bliskovsky 无论您如何组织它(国家、地区、州,甚至县),这都可能是一个问题。最终,如果您使用相对较小的单位(例如状态),除非您追求最大准确性,否则问题会相对较小。
【解决方案2】:

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

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

现在这将非常快,因为您已经离线预先计算了最近的城市,并且可以在每次实时请求时立即返回结果。

但是您打算多久添加一次城市?可能不会那么频繁。因此,即使需要一些时间,离线预计算也很少见。但是实时请求的响应速度非常快。 (其他人已经推荐了用于计算距离的公式,所以我将跳过这部分!)

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2015-09-24
    • 2013-01-27
    • 2014-07-11
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多