【问题标题】:How to use GPS data like the double value returned by getLatitude()?如何使用 getLatitude() 返回的双精度值等 GPS 数据?
【发布时间】:2012-09-10 12:35:26
【问题描述】:

我一直在寻找答案,但也许我只是没有使用正确的术语。我正在创建一个应用程序,它将访问数据库以返回在用户位置一定距离内的其他用户列表。我从来没有使用过这种类型的数据,我真的不知道这些值的含义。我想使用 MySQL 或 PHP 在后端进行所有计算。目前,我将经度和纬度作为双精度存储在数据库中。我可以访问它们并存储它们,但我不知道如何根据距离对它们进行排序。也许我应该使用该领域常见的不同类型或某种技术。 TIA。

【问题讨论】:

    标签: php android mysql gps location


    【解决方案1】:

    听起来您需要使用haversine formula 来获取两组长/纬度坐标之间的距离(根据地球曲率进行调整)。

    如果您使用它作为输出运行查询,您可以轻松地根据与用户的最小距离对它们进行排序。

    这里是实现 haversine in 9 commonly 使用的语言和 here is a SO question 的链接,它在 SQL 查询中实现它。

    这是您可以适应的查询(获取 25 英里内的任何东西,从最近到最远排序):

    SELECT 
        id, 
        ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
    FROM 
        markers 
    HAVING 
        distance < 25 
    ORDER BY 
        distance 
    LIMIT 
        0 , 20;
    

    【讨论】:

    • 这正是我所需要的。谢谢。
    【解决方案2】:

    我建议使用 Vicenty 的逆公式 (http://en.wikipedia.org/wiki/Vincenty's_formulae) 而不是 Haversine Great Circle 距离,因为 Vincenty 已被证明更准确(Vincenty 假设地球是一个扁球体而不是一个完美的球体,即更准确)。

    这是公式的原始文森蒂论文: http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf - 第 4 节

    这是来自 Android 平台的实际代码,用于计算 distanceTo(Location) 的距离,它使用 Vincenty 的逆公式:https://github.com/android/platform_frameworks_base/blob/master/location/java/android/location/Location.java#L272

    关于基于数据库查询的排序距离,为了获得最佳性能,您需要使用允许空间查询的空间数据库。 MySQL 有一个空间数据库插件: http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

    查看这篇文章,它应该为您提供从那里开始的详细信息,包括使用 Vicenty 进行精度的说明: Geo-Search (Distance) in PHP/MySQL (Performance)

    【讨论】:

    • 我将不得不调查这个。感谢您的信息。
    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2019-08-27
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多