Estou calculando a distância entre dois GeoCoordinados. Estou testando meu aplicativo contra 3-4 outros aplicativos. Ao calcular a distância, tenho uma média de 5,3 milhas em meu cálculo, enquanto outros aplicativos estão em 3,5 milhas. É uma grande diferença para o cálculo que estou tentando executar. Existem boas bibliotecas de classes disponíveis para calcular a distância? Estou calculando assim em 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;
}
O que eu poderia estar fazendo de errado? Devo calculá-lo primeiro em km e depois converter em milhas?
c#
windows-phone-7
geocoding
latitude-longitude
Jason N. Gaylord
fonte
fonte
Respostas:
A classe GeoCoordinate (.NET Framework 4 e superior) já possui
GetDistanceTo
método.A distância está em metros.
Você precisa fazer referência ao System.Device.
fonte
GetDistance é a melhor solução , mas em muitos casos não podemos usar esse método (por exemplo, Universal App)
Pseudocódigo do algoritmo para calcular a distância entre to coorindates:
Implementação de C # do mundo real , que utiliza métodos de extensão
Uso:
Implementação:
fonte
E aqui, para aqueles que ainda não estão satisfeitos, o código original da
GeoCoordinate
classe .NET-Frameworks , refatorado para um método independente:fonte
double oneDegree = Math.PI / 180.0;
?Aqui está a versão JavaScript rapazes e moças
fonte
Para aqueles que usam o Xamarin e não têm acesso à classe GeoCoordinate, você pode usar a classe Local do Android:
fonte
Você pode usar esta função:
Fonte: https://www.geodatasource.com/developers/c-sharp
fonte
Existe esta biblioteca GeoCoordinate para estas plataformas:
A instalação é feita via NuGet:
Uso
A distância entre as duas coordenadas, em metros .
fonte
Baseado na função de Elliot Wood, e se alguém estiver interessado em uma função C, este está funcionando ...
Você pode alterá-lo para dobrar . Retorna o valor em km.
fonte
Calcular distância entre pontos de latitude e longitude ...
fonte
Esta é uma pergunta antiga, no entanto, as respostas não me satisfaziam em relação ao desempenho e otimização.
Aqui está minha variante C # otimizada (distância em km, sem variáveis e cálculos redundantes, muito próxima da expressão matemática do Haversine Formular https://en.wikipedia.org/wiki/Haversine_formula ).
Inspirado em: https://rosettacode.org/wiki/Haversine_formula#C.23
fonte
Tente o seguinte:
fonte
Você pode usar
System.device.Location
:boa sorte
fonte
Quando o poder da computação da CPU / matemática é limitado:
Há momentos (como no meu trabalho) em que a capacidade de computação é escassa (por exemplo, nenhum processador de ponto flutuante, trabalhando com pequenos microcontroladores) em que algumas funções trigonométricas podem levar uma quantidade exorbitante de tempo de CPU (por exemplo, mais de 3000 ciclos de clock), então quando eu só precisa de uma aproximação, especialmente se se a CPU não deve ser amarrada por um longo tempo, eu uso isso para minimizar a sobrecarga da CPU:
O crédito vai para https://github.com/kristianmandrup/geo_vectors/blob/master/Distance%20calc%20notes.txt .
fonte