2016-11-16 21 views
-1

ジオ座標と別のジオ座標の配列がある場合、その座標に最も近い座標を探したいと思います。他の座標への最も近い座標の検索

                           長い
52.525782 13.316927  
52.526409 13.319083  
52.525678 LAT:配列所与例えば

、13.320317

ポイント:52.525730, 13.314556の場合、最初のポイント52.525782, 13.316927が最も近いものとして返されます。


すべての配列をループしてポイント間の距離を調べる唯一の方法はありますか?配列に多すぎる座標が含まれているとどうなりますか?

+0

何配列構造は、正確に1列LATであり、他の長いまたはそれは 'のような配列である二重[、]' –

+0

は、それはちょうど 'ダブル[、]' –

+0

Iのように、1列である@AlfieGoodacreむしろBSPツリー - バイナリ空間パーティションを見るでしょう。このような集合から生成するには時間がかかりますが、 'O(log n)'検索が行われます。基本的には2つの点があり、それに沿って等距離の線があります。クエリの最も近い点がその2つではなくても、その線のどちら側にクエリ点があるのか​​を知ることができます。それらを比較することはできません。 – 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'はリストをソートしません。 iteratedがリストから項目を望む順序で与える '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)); 


    } 
関連する問題