public async override Task <OtimizacaoRota> obterOtimizacaoRota(Local[] locais) { List <String> enderecos = new List <string>(); foreach (var local in locais) { enderecos.Add(prepararEndereco(local)); } using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://www.mapquestapi.com/directions/v2/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.PostAsJsonAsync("optimizedroute?key=" + key, new { locations = enderecos }); if (response.IsSuccessStatusCode) { dynamic resultado = await response.Content.ReadAsAsync <dynamic>(); float distanciaTotal = ((float)resultado.route.distance) * coeficienteConversãoKm; JArray sequencia = resultado.route.locationSequence; int[] sequenciaReordenada = new int[sequencia.Count]; int i = 0; foreach (var indice in sequencia) { sequenciaReordenada[i] = (int)indice; i++; } JArray trechos = resultado.route.legs; float[] distanciasTrechos = new float[trechos.Count]; for (int t = 0; t < trechos.Count; t++) { float distanciaTrecho; dynamic trecho = trechos.ElementAt(t); distanciaTrecho = ((float)trecho.distance) * coeficienteConversãoKm; distanciasTrechos[t] = distanciaTrecho; } OtimizacaoRota o = new OtimizacaoRota() { DistanciasTrechos = distanciasTrechos, DistanciaTotal = distanciaTotal, SequenciaLocais = sequenciaReordenada }; return(o); } } return(null); }
public static RoteiroColetaDTO gerarRoteiroAutomatico(ParadaRoteiroColetaDTO[] paradas, CentroDistribuicao centroDistribuicao) { ConectorRotas conector = obterConectorRotas(); RoteiroColetaDTO roteiro = null; Local[] locais = derivarLocais(paradas, centroDistribuicao); OtimizacaoRota o = conector.obterOtimizacaoRota(locais).Result; float distanciaTotal = o.DistanciaTotal; int[] indicesReordenados = o.SequenciaLocais; float[] distanciasTrechos = o.DistanciasTrechos; List <ParadaRoteiroColetaDTO> paradasReordenadas = new List <ParadaRoteiroColetaDTO>(); foreach (var indice in indicesReordenados) { int i = indice; if ((i != 0) && (i != (indicesReordenados.Count() - 1))) { paradasReordenadas.Add(paradas[i - 1]); } } for (int p = 0; p < paradasReordenadas.Count; p++) { float distanciaTrecho = distanciasTrechos[p]; paradasReordenadas[p].Distancia = distanciaTrecho; } roteiro = new RoteiroColetaDTO(); roteiro.Distancia = distanciaTotal; roteiro.Paradas = paradasReordenadas.ToArray(); return(roteiro); }