//Metodo certo para o calculo de distancias via latitude e longitude do tipo 25.551252,-14.255645 public double Calcula_distancia(float lati2, float long2, char unit, Posicao_padrao posicao) { //var posicao = Get_posicao(id_usuario); double deg2radMultiplier = 3.14159265358979323846 / 180; double lat1 = -25.954161 * deg2radMultiplier; double lat2 = (lati2) * deg2radMultiplier; double lon1 = 32.580377 * deg2radMultiplier; double lon2 = (long2) * deg2radMultiplier; double radius = 6378.137; // earth mean radius defined by WGS84 double dlon = lon2 - lon1; double distance = Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(dlon)) * radius; if (unit == 'K') { return(distance); } else if (unit == 'M') { return(distance * 0.621371192); } else if (unit == 'N') { return(distance * 0.539956803); } else { return(0); } }
//METODO QUE DISPONIBILIZA A POSICAO DO INDIVIDUO public Posicao_padrao Get_posicao(long?id_usuario) { Posicao_padrao posicao = new Posicao_padrao(); try { if (id_usuario != null) { posicao = db.Posicao_padrao.Where(e => e.estado == 1 && e.situacao == 1 && e.id_usuario == id_usuario).FirstOrDefault(); } else { posicao = db.Posicao_padrao.Where(e => e.estado == 1 && e.situacao == 1 && e.id_usuario == null).FirstOrDefault(); } } catch { } return(posicao); }
public List <Pesquisas> Procura_farmacias(string local, string data, long id_usuario, float?raio) { if (raio == null) { raio = 5; } //TempData["pesquisa"] = (List<Medicamento_farmacia>)lista; //Inicializacao da magia de pesquisa; List <Sucursal_farmacia> farmacias = new List <Sucursal_farmacia>(); List <Receita> receitas = new List <Receita>(); List <Medicamento_farmacia> resultado = new List <Medicamento_farmacia>(); List <Medicamento_farmacia> resultado2 = new List <Medicamento_farmacia>(); List <Pesquisas> resumo = new List <Pesquisas>(); Pesquisas consulta = new Pesquisas(); Medicamento_farmacia med_farm = new Medicamento_farmacia(); Receita_real real = new Receita_real(); List <Reserva> reserva = new List <Reserva>(); Reserva reserva_melhor = new Reserva(); List <Medicamento_receita> lista2 = new List <Medicamento_receita>(); Medicamento_receita rm = new Medicamento_receita(); long contador = 1; decimal distancia2 = 0; //Fim da magia de pesquisa //Magia de pesquisa if (data != null) { Posicao_padrao posicao = Get_posicao(id_usuario); resultado = Farmacias_proximas((int)raio, id_usuario); if (resultado != null) { receitas = Minha_receita(id_usuario); foreach (var item in resultado) { int encontrado = 0; if (farmacias.Where(e => e.id_sucursal == item.id_farmacia).Count() == 0 && receitas.Where(a => a.id_medicamento == item.id_medicamento).Count() > 0) { Receita ras = receitas.Where(a => a.id_medicamento == item.id_medicamento).FirstOrDefault(); //total = (decimal)(ras.quantidade * item.preco); encontrado++; distancia2 = (decimal)(Math.Round(Calcula_distancia((float)item.Sucursal_farmacia.latitude, (float)item.Sucursal_farmacia.longitude, 'K', posicao), 1)); consulta = new Pesquisas { id = contador, id_fabricante = item.id_fabricante, referencia = item.referencia, id_farmacia = item.id_farmacia, raio = raio, ditancia_farmacia = distancia2, total_encontrado = encontrado, id_medicamento = ras.id_medicamento, data = ras.data, dosagem = ras.composicao, forma = ras.forma, id_registo = ras.id_registo, id_usuario = ras.id_usuario, preco_unitario = item.preco, quantidade = ras.quantidade, total_receita = receitas.Count(), total_valor = (decimal)(ras.quantidade * item.preco) }; contador++; resumo.Add(consulta); //farmacias.Add(item.Sucursal_farmacia); encontrado = 0; } } //Historico de pesquisas sobre os medicamentos da receita /* * foreach (var item in receitas) * { * try * { * reserva_melhor = reserva.Where(e => e.dosagem.Contains(item.composicao) && e.desc_quantidade.Contains(item.forma) && e.id_medicamento == item.id_medicamento).OrderBy(e => e.valor_actual).First(); * if (reserva_melhor != null) * { * // var distancia2 = Math.Round(Calcula_distancia((float)reserva_melhor.Medicamento_farmacia.Sucursal_farmacia.latitude, (float)reserva_melhor.Medicamento_farmacia.Sucursal_farmacia.longitude, 'K', posicao), 1); * med_farm = resultado2.Where(e => e.id_medicamento == item.id_medicamento && e.apresentacao.Equals(item.forma) && e.dosagem.Equals(item.composicao) && e.id_farmacia == reserva_melhor.id_farmacia && e.id_fabricante == reserva_melhor.id_fabricante && e.preco == reserva_melhor.valor_actual).FirstOrDefault(); * rm = new Medicamento_receita * { * consulta = med_farm, * distancia = (float)distancia2 * }; * lista2.Add(rm); * * } * * } * catch { } * } */ //Envio do resultado para a pagina de disponibilização do resultado } } //Fim da magia de pesquisa return(resumo); }