【问题标题】:A reverse of Haversine formula for MySQL?MySQL的Haversine公式的反转?
【发布时间】:2010-11-05 22:44:20
【问题描述】:

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

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

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

分贝:

circleLatCenter, circleLngCenter, 半径

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

【问题讨论】:

    标签: mysql geometry geolocation geospatial


    【解决方案1】:

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

    因此,给定一个点数据库、一个搜索点 (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. 对返回的点列表进行后处理,计算实际的大圆距离,以删除不在距离圆内的正方形角点。

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

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

    【讨论】:

    • 我也是这样做的,(先是正方形,然后是斜边长度的圆角)但是自从你写了这篇文章后,你有没有找到更好的方法?
    【解决方案2】:

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

    Spatial Extensions to MySQL

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

    Relationships Between Geometries

    【讨论】:

    • 比自己滚动要容易得多,+1
    【解决方案3】:

    我知道这是一篇早已失效的帖子,但是,万一有人遇到这个问题,您根本不需要创建“反向半正弦公式”。 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() 的使用意味着它不是反余弦计算,而是“余弦的球面定律”。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2013-01-22
    • 2011-09-12
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多