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

mas*_*asq 4 c# sorting algorithm gps

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

我不介意距离计算是基于"乌鸦的飞行"或其他任何东西.它应该足够快,可以搜索数千个GPS位置.

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

Stu*_*art 6

关于MySQL纬度/长距离搜索的一个问题需要帮助优化lat/Lon geo搜索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 };
Run Code Online (Sandbox Code Playgroud)

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

  • 使用MySQL选择"关闭"lat/lng点,例如说lat和lng在你的目标的1.0之内
  • 然后使用C#计算更准确的距离并选择"最佳".

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