Haversine公式的MySQL的反向?

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

我期待通过lat / lng,然后让我存储的mysql值创建一个圆圈来告诉我,如果我传入的点是在该圆圈内。 有没有什么能够让我做到这一点,类似于沙滩论坛(它会假设我的观点已经在数据库中)。

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

D b:

circleLatCenter,circleLngCenter,Radius

传入>从foo中选择id,lat,lng in(使圆函数:circleLat,circleLng,radius)


MySQL拥有大量的空间数据功能:

MySQL的空间扩展

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

几何之间的关系


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

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

  • 计算deltaX,如果沿Y轴移动距离D,则为点X。
  • 计算deltaY,如果沿X轴移动距离D,则为点。
  • 计算你的边界框:(X-deltaX,Y-deltaY),(X + deltaX,Y + deltaY)
  • 查询点的数据库使用SQL BETWEEN运算符:SELECT * FROM TABLE其中X X-deltaX和X + deltaX之间的X和Y-deltaY和Y + deltaY之间的Y
  • 后处理返回的点列表,计算实际的大圆距离,以去除不在距离圆内的正方形角落上的点。
  • 作为一个捷径,我通常计算纬度和经度(在赤道,因为每英里的度数在两极处不同)的每英里度数,并且导出deltaX和deltaY为(D *度-lat-per-mile)或度 - lon-per-mile。 赤道与极点的差别并不重要,因为我已经计算出SQL查询后的实际距离。

    FYI - 0.167469至0.014564度 - 每英里,以及0.014483度 - 每英里


    我知道这是一个长期死去的帖子,但是,如果有人遇到过这个问题,你根本不需要创建一个“逆向半正规公式”。 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`
    
    链接地址: http://www.djcxy.com/p/42731.html

    上一篇: A reverse of Haversine formula for MySQL?

    下一篇: Extract RGB values from a AVFrame (FFMPEG) in C++