【问题标题】:How to get places with a certain radius如何获得具有一定半径的地方
【发布时间】:2011-10-25 20:35:31
【问题描述】:

我有一个活动数据库,每个活动可以举办3天,每天都有一个邮政编码。

所以数据库看起来像那样(+ 很多其他字段)

在另一个数据库中,我有一个地理位置信息(邮政编码、纬度、经度)

现在用户可以在那里输入邮政编码,然后会出现一个半径和该半径内的活动。

问题:

1 - 实现这一目标的最佳方法是什么?

考虑解决方案

查看活动中所有可能的邮政编码,并将其加入地理表以获取其纬度/经度

然后当用户搜索邮政编码时,获取 Lat/Lng 并做数学方程式以获取该点附近的所有邮政编码。

但我认为就性能而言这不是一个好方法,因为我必须将查询应用于 3000 多个活动

找到的距离代码

  • 使用 MySQL(Haversine 公式)查找附近的位置

    SELECT id, ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin( 弧度(37) ) * sin ( 弧度( lat ) ) ) ) AS 距离 FROM 标记 距离

你们觉得呢?

【问题讨论】:

标签: php mysql performance geocoding distance


【解决方案1】:

你需要一个 GIS 来做到这一点(并使用空间索引),但 mysql 没有能力 - mysql GIS 功能只能处理矩形。 PostreSQL 支持 GIS。

最简单的就是数学表达式。如果您可以使用一些投影坐标(纬度和经度是球体坐标),那将是最好的。在这个投影坐标系中转换整个数据库,而不仅仅是使用简单的表达式(无需使用三角函数):

(activity_x - postal_code_x)^2 + (activity_y - postal_code_y)^2

请注意,地球是一个球体,这意味着这仅适用于较小的距离(例如

【讨论】:

    【解决方案2】:

    我在性能方面错了,查询用了不到 0.5 秒的时间来计算 3000 多个活动的距离。

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2017-08-29
      • 2012-09-27
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多