9

在我的数据库中,我存储了一个中心点以及一个半径(以米为单位)。

我希望传入一个 lat/lng,然后让我存储的 mysql 值创建一个圆圈来告诉我我传入的点是否在那个圆圈内。有什么东西可以让我这样做,类似于haversine forumla(假设我的观点已经在数据库中)。

半正弦公式: ( 3959 * acos( cos( 弧度(40) ) * cos( 弧度( lat ) ) * cos( 弧度( long) - 弧度(-110) ) + sin( 弧度(40) ) * sin( 弧度( long) ) )

D b:

circleLatCenter, circleLngCenter, 半径

传入> select id from foo where lat,lng in (make circle function: circleLat, circleLng, radius)

4

3 回答 3

4

MySQL 有一整套空间数据函数:

MySQL 的空间扩展

我认为关于测量几何之间关系的部分是你所追求的:

几何之间的关系

于 2009-06-25T20:10:31.253 回答
3

我通过大圆距离计算边界框并查询数据库,完成了类似的地理搜索。您仍然需要在您的应用程序中再通过一次从边界框到圆形“圆角”。

因此,给定一个点数据库、一个搜索点 (X,Y) 和距离 D,找到 (X,Y) 的 D 内的所有点:

  1. 计算 deltaX,它是沿 Y 轴移动距离 D 的点。
  2. 计算 deltaY,它是沿 X 轴移动距离 D 时的点。
  3. 计算你的边界框:(X-deltaX,Y-deltaY),(X+deltaX,Y+deltaY)
  4. 查询点数据库使用 SQL BETWEEN 运算符: SELECT * FROM TABLE WHERE X BETWEEN X-deltaX AND X+deltaX AND Y BETWEEN Y-deltaY AND Y+deltaY
  5. 对返回的点列表进行后处理,计算实际的大圆距离,以删除不在距离圆内的正方形角上的点。

作为捷径,我通常计算纬度和经度的每英里度数(在赤道,因为经度极地的每英里度数不同),并将 deltaX 和 deltaY 推导出为 (D * 度-lat-per-mile) 或 degree-lon-per-mile。赤道与极点的差异并不重要,因为我已经在 SQL 查询之后计算实际距离。

仅供参考 - 0.167469 至 0.014564 度经度每英里和 0.014483 度纬度每英里

于 2009-06-25T19:34:11.000 回答
-1

我知道这是一个早已死去的帖子,但是,如果有人遇到过这个,你根本不需要创建一个“反向半正弦公式”。Haversine 公式给出了点 a 和点 b 之间的距离。您需要计算点 b 和点 a 之间的距离。这些是相同的值。

SELECT *, 
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius`
于 2014-01-23T04:15:06.423 回答