MySQL的Haversine公式的反向计算?

9
在我的数据库中,我存储了一个中心点和半径(以米为单位)。
我想传入一个纬度/经度,然后使用我存储的mysql值创建一个圆来告诉我我传入的点是否在该圆内。是否有类似于haversine公式的东西可以让我这样做(它将假定我的点已经在数据库中)。
Haversine公式: (3959 * acos(cos(radians(40))* cos(radians(lat))* cos(radians(long))-radians(-110))+sin(radians(40))* sin(radians(long)))
数据库: circleLatCenter,circleLngCenter,Radius
传入> 选择foo表中纬度、经度的id,其中(make circle function: circleLat、circleLng、radius)
3个回答

4

1
比自己编写要容易得多,+1 - colithium

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 * degrees-lat-per-mile)或degrees-lon-per-mile。在赤道和极点之间的差异并不重要,因为我已经在SQL查询之后计算了实际距离。

顺便说一下-每英里0.167469至0.014564度经度,每英里0.014483度纬度


我也是这样做的(先用正方形进行第一遍处理,然后再用斜边长度来圆角化)。但你自从写了这篇帖子以来有找到更好的方法吗? - Nicolas Manzini

-1

我知道这是一个很久以前的帖子,但是如果有人偶然看到它,你根本不需要创建一个“反向Haversine公式”。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`

使用 acos() 意味着这不是一个 Haversine 计算,而是“余弦定理”。 - John Machin

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