从给定点出发,基于距离确定最近的GPS坐标。

4

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

我不介意距离计算是基于“鸟瞰”还是其他任何东西。它应该足够快,可以搜索数千个GPS位置。

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

4个回答

6

有一个问题涉及到MySQL经纬度距离搜索,详见Need help optimizing a lat/Lon geo search for mysql

对于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选择“接近”纬度/经度点,例如,在目标范围内的纬度和经度之间相差不超过1.0
  • 然后使用C#计算更准确的距离并选择“最佳”。

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


4
你正在尝试进行的操作叫做“最近邻搜索”,有许多良好的数据结构可以加快这类搜索的速度。例如,你可以研究kd树,因为它们可以为数据集中距离任意测试点最近的点查询提供预期的次线性时间(在二维中为O(√ n))。如果你习惯于编写修改后的二叉搜索树,则它们也非常容易实现。

0

0
如果您在数据库中存储了坐标数据,特别是当数据量很大时,您可能希望直接查询数据库。但是,这需要特定的数据库支持(普通索引无法帮助)。我知道MSSQL支持地理数据,我没有测试过MySQL,但在线文档似乎表明也有类似的支持。一旦您建立了一个具有空间感知能力的数据库,您就可以通过简单的查询获得结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接