如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?

Posted

技术标签:

【中文标题】如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?【英文标题】:How to sort a list of lat/long by distance (in miles) from a given lat/long in C#? 【发布时间】:2019-12-14 06:01:21 【问题描述】:

我需要根据与用户当前纬度/经度的距离对经度/经度值列表进行排序。我还需要以英里为单位显示每个条目的距离。

我发现 this answer 很接近,但返回最近的纬度/经度条目而不是列表。另外,我不明白过去可以转换为英里的距离单位。

简而言之,我需要一个方法...

    您提供当前的经纬度对和经纬度对列表 返回以英里为单位的经纬度对的排序列表
class Location

   double Lat  get; set; 
   double Long  get; set; 
   double Distance  get; set; 


public List<Location> SortLocations(Location current, List<Location> locations)

   // ???

【问题讨论】:

你能说说 lat , long 对,你想得到两个 lat long 之间的距离还是一个 lat 和 long 之间的距离? 【参考方案1】:

您也许可以使用GeoCoordinate,如此处所述:Calculating the distance between 2 points in c#

一旦你可以计算出距离,那么你就可以这样做:

public List<Location> SortLocations(Location current, List<Location> locations)

    foreach (var location in locations)
    
        location.Distance = CalculateDistance(current, location);
    
    // Return the list sorted by distance
    return locations.OrderBy(loc => loc.Distance);

如果您不想在locations 集合上设置Distance 属性,可以使用Select

return locationsWithDistance = locations.Select(
    location => new Location
    
        Lat = location.Lat,
        Long = location.Long,
        Distance = CalculateDistance(current, location)
    ).OrderBy(location => location.Distance);

【讨论】:

非常感谢!我从未听说过 GeoCoordinate,它很棒,因为它简化了代码并以米为单位返回距离(易于转换为英里)。然后按距离排序列表是完美的,我忽略了现在明显的方法(首先是距离,然后是距离排序)。我在我的代码中实现了这一切,效果很好。

以上是关于如何按距离(以英里为单位)从 C# 中的给定纬度/经度对纬度/经度列表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中如何根据经纬度优化这个距离查询

在地理定位排序中显示距离(以英里为单位)

快速方法按距离搜索数百万个坐标

C# 在 Linq 查询 WHERE 语句中返回两个纬度/经度坐标之间的计算距离

LineString 的长度(以英里为单位)

Google Maps API - 最近点 - 更改排序顺序