基于与给定点的距离的最近 GPS 坐标

Posted

技术标签:

【中文标题】基于与给定点的距离的最近 GPS 坐标【英文标题】:Nearest GPS coordinate based on distance from a given point 【发布时间】:2011-03-20 11:03:44 【问题描述】:

我在 mysql 服务器数据库中有一个 GPS 位置列表。用户将在应用程序中输入 GPS 坐标,他应该获得最近的 GPS 坐标。

我不介意距离计算是基于“乌鸦的飞行”或其他任何东西。它的速度应该足以搜索数千个 GPS 位置。

我更喜欢 C# 中的解决方案,否则我将尝试获取逻辑并自行应用。

【问题讨论】:

【参考方案1】:

Need help optimizing a lat/Lon geo search for mysql有一个关于MySQL lat/long distance search的问题

对于 C# 距离计算,大多数网站使用 Haversine 公式 - 这是一个 C# 实现 - http://www.storm-consultancy.com/blog/development/code-snippets/the-haversine-formula-in-c-and-sql/ - 这也有一个 SQL (MS SQL) 实现。

/// <summary>
/// Returns the distance in miles or kilometers of any two
/// latitude / longitude points.
/// </summary>
/// <param name="pos1">Location 1</param>
/// <param name="pos2">Location 2</param>
/// <param name="unit">Miles or Kilometers</param>
/// <returns>Distance in the requested unit</returns>
public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit)

    double R = (unit == DistanceUnit.Miles) ? 3960 : 6371;
    var lat = (pos2.Latitude - pos1.Latitude).ToRadians();
    var lng = (pos2.Longitude - pos1.Longitude).ToRadians();
    var h1 = Math.Sin(lat / 2) * Math.Sin(lat / 2) +
                  Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) *
                  Math.Sin(lng / 2) * Math.Sin(lng / 2);
    var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));
    return R * h2;


public enum DistanceUnit  Miles, Kilometers ;

对于大多数查询...您可能可以在 C# 和 SQL 之间拆分工作

使用 MySQL 选择“关闭”纬度/经度点,例如说出 lat 和 lng 与您的目标相差 1.0 以内的位置 然后使用 C# 计算更准确的距离并选择“最佳”。

如果您使用的是 MS SQL 2008,那么我建议您使用 MS SQL 地理类型,因为它们具有内置的优化索引和计算功能 - 我看到 MySQL 也有一些扩展 - http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html - 但我已经没有这些经验。

【讨论】:

【参考方案2】:

您正在尝试执行的操作称为最近邻搜索,并且有许多很好的数据结构可以加速此类搜索。例如,您可能想要查看 kd 树,因为它们可以为数据集中最接近某个任意测试点的点提供预期的次线性时间(二维中的 O(√n))查询。如果您愿意编写修改后的二叉搜索树,它们的实现也非常容易。

【讨论】:

【参考方案3】:

请注意,在处理球面几何时,我们的欧几里得几何不是很精确 (a^2+b^2=c^2),但对于地球的小部分来说,它可能已经足够近似了。

否则:http://en.wikipedia.org/wiki/Great-circle_distance

【讨论】:

【参考方案4】:

如果您将坐标数据存储在数据库中,您可能希望直接查询数据库,尤其是在数据量很大的情况下。但是,您需要为此提供特定的数据库支持(普通索引无济于事)。我知道 MSSQL 支持geography data,我没有测试 MySQL,但online documentation 似乎暗示也有类似的支持。一旦您构建了空间感知数据库,您就可以通过简单的查询获得结果。

【讨论】:

以上是关于基于与给定点的距离的最近 GPS 坐标的主要内容,如果未能解决你的问题,请参考以下文章

在给定坐标和最大距离的情况下查找到某个点的最近点 - 使用 Mongoose 和 MEAN 堆栈查询结果未定义

在给定坐标和最大距离的情况下查找到某个点的最近点 - 使用 Mongoose 和 MEAN 堆栈查询结果未定义

luogu P6247 [SDOI2012]最近最远点对 |随机化

luogu P6247 [SDOI2012]最近最远点对 |随机化

计算两个GPS坐标的距离

在给定点、方位角和距离的情况下计算 gps 坐标