我一直在寻找答案,但也许我只是没有使用正确的术语。我正在创建一个应用程序,它将访问数据库以返回位于用户位置一定距离内的其他用户的列表。我从来没有使用过这种类型的数据,我也不知道这些数值意味着什么。我想用MySQL或PHP在后端进行所有计算。目前,我将纬度和经度存储为数据库中的双精度数。我可以访问它们并存储它们,但我不知道如何根据距离对它们进行排序。也许我应该使用这个领域常见的不同类型或技术。 TIA。
答案 0 :(得分: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;
答案 1 :(得分:0)
我建议使用Vicenty的逆公式(http://en.wikipedia.org/wiki/Vincenty's_formulae)而不是Haversine Great Circle距离,因为Vincenty被证明更准确(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)