【问题标题】:Finding nearest coordinate to other coordinate寻找离其他坐标最近的坐标
【发布时间】:2016-11-16 15:13:34
【问题描述】:

给定一个地理坐标数组和另一个地理坐标,我想找到离它最近的坐标。

例如,给定数组:

纬度               长
52.525782 13.316927
52.526409 13.319083
52.525678 13.320317

点:52.525730, 13.314556,则返回第一个点52.525782, 13.316927,因为它是最接近的点。


实现它的唯一方法是遍历所有数组并找到点之间的距离吗?如果数组包含太多坐标会怎样?

【问题讨论】:

  • 数组结构到底是什么,一个数组是lat,另一个数组是long,还是像double[,]这样的数组
  • @AlfieGoodacre 是一个数组,就像double[,]
  • 我宁愿看到 BSP 树 - 二进制空间分区。他们需要很长时间才能从这样的集合中生成,但它会有O (log n) 搜索。基本上给定两个点,它们沿着一条线等距,即使离您的查询最近的点不是这两个点之一,找到该线的哪一侧有查询点可以排除其他点的一半,并且我们可以跳过比较它们。

标签: c# arrays optimization location coordinates


【解决方案1】:

您可以使用 LINQ 进行尝试,但 LINQ 的内部工作仍然会循环访问您的集合。例如:

//Your list with coordinates
List<GeoCoordinate> coords = new List<GeoCoordinate>();

//The coord you want to compare
GeoCoordinate crd = new GeoCoordinate();

//Sorts the list based on the proximity of the coords to crd
var sortedCoords = coords.OrderBy(x => x.GetDistanceTo(crd)).ToList();

我知道它不使用数组,但我发现使用列表更容易。

我认为应该可行,如果可行,请告诉我!

【讨论】:

  • OrderyBy 不对列表进行排序。它创建一个IEnumerable,在迭代时会按所需顺序给出列表中的项目。
【解决方案2】:
    struct coord
    {
        public  double lat;
        public double lon;
    }

    public void Main(coord coord)
    {

        var coords = new[]{ new coord(){lat=1, lon=1} };
        var closest = coords.Min(p => Math.Abs(p.lat - coord.lat) +    Math.Abs(p.lon - coord.lon));


    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2014-09-07
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2012-03-09
    相关资源
    最近更新 更多