2016-11-16 68 views
-1

給定一個地理座標和另一個地理座標的數組,我想找到最近的座標。找到最近的座標到其他座標

例如,給定陣列:

  LAT                            長
52.525782   13.316927
52.526409   13.319083
52.525678   13.320317

而點:52.525730, 13.314556,那麼將返回第一個點52.525782, 13.316927,因爲它是最接近的一個。


實現它的唯一方法是遍歷所有數組並找到點之間的距離?如果數組包含太多座標,會發生什麼情況?

+0

什麼是陣列結構完全相同,是LAT一個陣列和另一個長或者是像'陣列雙[,]' –

+0

@AlfieGoodacre它是一個陣列,就像'雙[,]' –

+0

我寧願看到一個BSP樹 - 二進制空間分區。他們需要很長時間才能從這樣的一個集合中生成,但它會有'O(log n)'搜索。基本上給出了兩個點,它們之間有一條等距線,即使最接近你的查詢點不是這兩個點之一,發現該線的哪一邊有查詢點可以排除其他點的一半,並且我們可以跳過比較它們。 – sqykly

回答

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(); 

我知道它不使用數組,但我發現使用列表更容易。

我認爲應該工作,讓我知道如果它!

+0

'OrderyBy'不會對列表進行排序。它創建一個'IEnumerable',當迭代時將按照期望的順序從列表中提取項目。 – juharr

+0

@juharr你是對的,改變了我的答案 – RandomStranger

0
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)); 


    }