【问题标题】:Best way to fetch nearby locations?获取附近位置的最佳方法?
【发布时间】:2012-02-28 06:40:07
【问题描述】:

在我的应用程序中,我们要求用户输入邮政编码来查询附近的位置。我们使用邮政编码的 LatLng 对象作为原点,然后绘制一个假想的“边界框”来查询数据库中该范围内的所有位置。这些位置将在地图上显示为用户能够看到的标记。我们希望将结果限制在 10-15 左右。

数据库示例:

我正在考虑使用 MySQL 的 BETWEEN 运算符在垂直和水平±2 度范围内进行查询,然后 LIMIT n 这些结果,或者我可以将整个数据库拉入 PHP,然后使用 range() 抽象它。

我不太确定解决这个问题的最佳方法是什么,所以如果你们中的任何人以前处理过这种情况并能就如何解决它提供一些见解,我将不胜感激。

【问题讨论】:

  • 我强烈建议不要将整个表拉入 PHP。随着表格变大,它将影响未来的性能。我建议在将数据集拉到前端之前尽可能地限制它。

标签: php mysql google-maps google-maps-api-3 google-maps-markers


【解决方案1】:

在sql里做

SELECT 
    id, 
    ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM 
    markers 
HAVING 
    distance < 25 
ORDER BY 
    distance 
LIMIT 
    0 , 20;

http://code.google.com/apis/maps/articles/phpsqlsearch.html

【讨论】:

  • 不幸的是,这会对每一行进行计算,因此可能会严重影响您的数据库。请参阅此问题:stackoverflow.com/questions/5236921/…
  • 如果您的索引正确完成,则不会。我们运行了一个带有商店定位器的网站,就是这样运行的。从来没有遇到过问题。
  • 我相信您可以对位置进行一些估计,这样您就可以使用WHERE 子句消除一些记录?
  • 这实际上工作得很好,唯一的问题是大多数 LatLng 对象都是浮点数。我必须四舍五入我的位置才能执行搜索。除此之外,这是一个很好的开始。
  • @thenetimp 你能解释一下这个说法吗(3959 * acos(cos(弧度(37))* cos(弧度(lat))* cos(弧度(lng)-弧度(-122) ) + sin( 弧度(37) ) * sin( 弧度( lat ) ) ) AS 距离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多