2015-08-05 5 views
0

В приложении winform C# у меня есть список широты/долготы. Я могу вычислить в sql server (2005) запрос, но я не знаю, могу ли я сделать это в C#.Как рассчитать расстояние между lat/long в C#

SELECT LAT, LONG, (3959 * acos(cos(radians(37)) * cos(radians(LAT)) * cos(radians(LONG) - radians(-122)) + sin(radians(37)) * sin(radians(LAT)))) AS distance 
FROM Table ORDER BY distance 

Используя этот запрос в SQL-сервере, я могу заказать список широты и долготы. Но, в C# Я лат/долго в этом списке:

var latLon = new List<LatLonClass>(); 

Используя этот список, Как я могу сделать такой же запрос в моем списке? Спасибо!

+0

Вы можете, глядя в класс Math, чтобы получить то, что вам нужно, я думать. –

+0

Использование LINQ поможет вам здесь. Пожалуйста, добавьте определение «LatLonClass» в свой пост. –

ответ

0

Это зависит от того, насколько точны результаты. Наша земля не является сферой, это эллипсоид (можно сказать, что радиус между 6378137 и 6356752 м). Вот почему для точного результата вам нужно знать математику на очень высоком уровне. Если вам нужна более высокая точность, чем 0,3%, я предлагаю вам использовать GeographicLib Charles Karney - http://geographiclib.sourceforge.net/html/NET/

Если точность на уровне 0,3% достаточна для использования кода @Mark.

2

Ниже приведен фрагмент формулы Haversine, найденной (https://www.stormconsultancy.co.uk/blog/development/code-snippets/the-haversine-formula-in-c-and-sql/). Похоже, у него есть то, что вам нужно.

public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit) 
{ 
    double R = (unit == DistanceUnit.Miles) ? 3960 : 6371; 
    var lat = (pos2.Latitude - pos1.Latitude).ToRadians(); 
    var lng = (pos2.Longitude - pos1.Longitude).ToRadians(); 
    var h1 = Math.Sin(lat/2) * Math.Sin(lat/2) + 
        Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) * 
        Math.Sin(lng/2) * Math.Sin(lng/2); 
    var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1))); 
    return R * h2; 
} 
3

Просто просмотрите пространство имен System.Device.Location.

var coord1 = new GeoCoordinate(lat1, lon1); 
var coord2 = new GeoCoordinate(lat2, lon2); 

var dist = coord1.GetDistanceTo(coord2); 

Для получения дополнительной информации: https://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate(v=vs.110).aspx

Теперь, чтобы вычислить расстояние списка cordinates к одной точке

List<GeoCoordinate> coordinates = ......; 
GeoCoordinate point = ......; 

var distances = coordinates.Select(c => c.GetDistanceTo(point)) 
          .OrderBy() 
          .ToList(); 
Смежные вопросы