public static double Distance(Posicao pos1, Posicao pos2, DistanceUnit distanceUnit) { double R = (distanceUnit == DistanceUnit.Milhas) ? 3960 : 6371; double dLat = toRadian(pos2.Latitude - pos1.Latitude); double dLon = toRadian(pos2.Longitude - pos1.Longitude); double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(toRadian(pos1.Latitude)) *Math.Cos(toRadian(pos2.Latitude)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2); double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a))); double d = R * c; return d; }
public List<DTOPromocaoMobile> ObterPromocaoPorLocalizacao(Posicao posicaoMobile) { var distanciaMax = Convert.ToDouble(ConfigurationManager.AppSettings["Distancia"]); var liClienteLocalizacao = _repositorioClienteLocalizacao.ObterTodos().Where(clienteLocalizacao => Haversine.Distance(posicaoMobile, clienteLocalizacao.Posicao, DistanceUnit.Kilometros) <= distanciaMax).ToList(); return liClienteLocalizacao.SelectMany(ObterPromocaoPorClientePromocao).ToList(); }