Obliczam odległość między dwoma GeoCoordinates. Testuję moją aplikację pod kątem 3-4 innych aplikacji. Kiedy obliczam odległość, zwykle otrzymuję średnio 3,3 mili do moich obliczeń, podczas gdy inne aplikacje otrzymują 3,5 mili. To duża różnica w obliczeniach, które próbuję wykonać. Czy są jakieś dobre biblioteki klas do obliczania odległości? Obliczam to tak w C #:
public static double Calculate(double sLatitude,double sLongitude, double eLatitude,
double eLongitude)
{
var radiansOverDegrees = (Math.PI / 180.0);
var sLatitudeRadians = sLatitude * radiansOverDegrees;
var sLongitudeRadians = sLongitude * radiansOverDegrees;
var eLatitudeRadians = eLatitude * radiansOverDegrees;
var eLongitudeRadians = eLongitude * radiansOverDegrees;
var dLongitude = eLongitudeRadians - sLongitudeRadians;
var dLatitude = eLatitudeRadians - sLatitudeRadians;
var result1 = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Cos(sLatitudeRadians) * Math.Cos(eLatitudeRadians) *
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);
// Using 3956 as the number of miles around the earth
var result2 = 3956.0 * 2.0 *
Math.Atan2(Math.Sqrt(result1), Math.Sqrt(1.0 - result1));
return result2;
}
Co mogłem zrobić źle? Czy powinienem najpierw obliczyć to w km, a następnie przeliczyć na mile?
c#
windows-phone-7
geocoding
latitude-longitude
Jason N. Gaylord
źródło
źródło
Odpowiedzi:
GeoCoordinate klasa (.NET Framework 4 i wyższe) ma już
GetDistanceTo
metody.Odległość jest podana w metrach.
Musisz odwołać się do System.Device.
źródło
GetDistance to najlepsze rozwiązanie , ale w wielu przypadkach nie możemy skorzystać z tej metody (np. Universal App)
Pseudokod Algorytmu do obliczania odległości między współrzędnymi:
Implementacja języka C # w świecie rzeczywistym , która korzysta z metod rozszerzających
Stosowanie:
Realizacja:
źródło
A tutaj, dla tych, którzy nadal nie są zadowoleni, oryginalny kod z
GeoCoordinate
klasy .NET-Frameworks , refaktoryzowany na samodzielną metodę:źródło
double oneDegree = Math.PI / 180.0;
?Oto wersja JavaScript, chłopaki i dziewczęta
źródło
Dla tych, którzy używają platformy Xamarin i nie mają dostępu do klasy GeoCoordinate, można zamiast tego użyć klasy Android Location:
źródło
Możesz użyć tej funkcji:
Źródło: https://www.geodatasource.com/developers/c-sharp
źródło
Istnieje biblioteka GeoCoordinate dla tych platform:
Instalacja odbywa się za pośrednictwem NuGet:
Stosowanie
Odległość między dwoma współrzędnymi w metrach .
źródło
Oparty na funkcji Elliota Wooda i jeśli ktoś jest zainteresowany funkcją C, ta działa ...
Możesz to zmienić na podwojenie . Zwraca wartość w km.
źródło
Obliczanie odległości między punktami szerokości i długości geograficznej ...
źródło
To stare pytanie, niemniej odpowiedzi nie zadowalały mnie pod względem wydajności i optymalizacji.
Tutaj mój zoptymalizowany wariant C # (odległość w km, bez zmiennych i zbędnych obliczeń, bardzo zbliżony do matematycznego wyrażenia Haversine Formular https://en.wikipedia.org/wiki/Haversine_formula ).
Zainspirowany: https://rosettacode.org/wiki/Haversine_formula#C.23
źródło
Spróbuj tego:
źródło
Możesz użyć
System.device.Location
:powodzenia
źródło
Gdy moc obliczeniowa procesora / matematyki jest ograniczona:
Są chwile (takie jak w mojej pracy), kiedy moc obliczeniowa jest ograniczona (np. Brak procesora zmiennoprzecinkowego, praca z małymi mikrokontrolerami), w których niektóre funkcje trygonometryczne mogą zająć wygórowaną ilość czasu procesora (np. 3000+ cykli zegara), więc kiedy ja potrzebuję tylko przybliżenia, zwłaszcza jeśli procesor nie może być związany przez długi czas, używam tego, aby zminimalizować obciążenie procesora:
Kredyt trafia do https://github.com/kristianmandrup/geo_vectors/blob/master/Distance%20calc%20notes.txt .
źródło