2016-11-16 2 views
-1

Étant donné un tableau de coordonnées géographiques et une autre coordonnée géographique, j'aimerais trouver la (les) coordonnée (s) la plus proche.Recherche de la coordonnée la plus proche d'une autre coordonnée

Par exemple, étant donné le tableau:

lat                               longue
52,525782   13,316927
52,526409   13,319083
52,525678Et le point: 52.525730, 13.314556, puis le premier point 52.525782, 13.316927 sera retourné, car il est le plus proche. Est-ce que la seule façon de l'obtenir est de boucler tout le tableau et de trouver la distance entre les points? Que se passe-t-il si le tableau contient trop de coordonnées?

+0

Quelle est la structure de tableau exactement, est lat un tableau et à long une autre ou est-ce un tableau comme 'deux [,]' –

+0

@AlfieGoodacre Il est un tableau, comme 'deux [,]' –

+0

I préfère voir une arborescence BSP - partition d'espace binaire. Ils prennent beaucoup de temps à générer à partir d'un ensemble comme celui-ci, mais il aura une recherche 'O (log n)'. Fondamentalement donné deux points il ya une ligne le long de laquelle ils sont équidistants, et même si le point le plus proche de votre requête n'est pas l'un de ces deux, trouver quel côté de cette ligne a le point de recherche peut exclure la moitié des autres points nous pouvons les ignorer en les comparant. – sqykly

Répondre

1

Vous pouvez l'essayer en utilisant LINQ, mais le fonctionnement interne de LINQ circulerait toujours sur votre collection. Par exemple:

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

Je sais qu'il n'utilise pas un tableau, mais je trouve que l'utilisation de listes est plus facile.

Je pense que cela devrait fonctionner, laissez-moi savoir si c'est le cas!

+0

'OrderyBy' ne trie pas la liste. Il crée un 'IEnumerable' qui, une fois itéré, donnera les éléments de la liste dans l'ordre désiré. – juharr

+0

@juharr vous avez raison, modifié ma réponse – 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)); 


    }