private RouteCost RequestRouteCost(RouteType routeType)
        {
            _routeDetails = new RouteDetails();
            _routeDetails.descriptionType = Config.DesciptionType;
            _routeDetails.optimizeRoute   = true;
            _routeDetails.routeType       = Convert.ToInt32(routeType);

            _routeOptions.routeDetails = _routeDetails;

            using (var routeSoapClient = new RouteSoapClient())
            {
                _routeInfo = routeSoapClient.getRoute(GenerateRouteStop(), _routeOptions, _token);
            }

            return(new RouteCost
            {
                TotalDistance = _routeInfo.routeTotals.totalDistance,
                TotalFuelCost = _routeInfo.routeTotals.totalfuelCost,
                TotalCostWithToll = _routeInfo.routeTotals.totalCost,
                TotalTimeRote = _routeInfo.routeTotals.totalTime
            });
        }
        /// <summary>
        /// Método para retorno de informações e valores sobre a rota
        /// </summary>
        /// <param name="token">Chave para autenticação</param>
        /// <param name="enderecoPartida">Endereco com número de partida, ex: Av Paulista, 1000</param>
        /// <param name="cidadeUfPartida">Cidade e estado de partida, ex: São Paulo,SP</param>
        /// <param name="enderecoDestino">Endereco com número de destino, ex: Av Paulista, 1000</param>
        /// <param name="cidadeUfDestino">Cidade e estado de destino, ex: São Paulo,SP</param>
        /// <param name="veiculo">Infomar: CapacidadeTanque,ConsumoMedio,ValorCombustivel,VelocidadeMedia,CategoriaVeiculo(1-Moto,2-Carro,5-Onibus,7-Caminhao)</param>
        /// <param name="tipoRota">0 = Rota padrão mais rápida, 1 = Rota evitando o trânsito. (Somente utilizando base urbana)</param>
        /// <returns>Tempo total da rota;Distância total;Custo de combustível;Custo total considerando pedágio</returns>
        public ResponseInformacoesRota GetInformacoesRota(string token, string enderecoPartida, string cidadeUfPartida, string enderecoDestino, string cidadeUfDestino, Veiculo veiculo, int tipoRota = 0)
        {
            try
            {
                if (string.IsNullOrEmpty(enderecoPartida) || enderecoPartida.Split(',').Length != 2)
                {
                    return new ResponseInformacoesRota {
                               Exception = "O endereço de partida deve ser preenchido corretamente: ex: Av Paulista, 1000"
                    }
                }
                ;
                if (string.IsNullOrEmpty(cidadeUfPartida) || cidadeUfPartida.Split(',').Length != 2)
                {
                    return new ResponseInformacoesRota {
                               Exception = "A cidade e UF de partida deve ser preenchida corretamente, ex: São Paulo, SP"
                    }
                }
                ;
                if (string.IsNullOrEmpty(enderecoDestino) || enderecoDestino.Split(',').Length != 2)
                {
                    return new ResponseInformacoesRota {
                               Exception = "O endereço de destino deve ser preenchido corretamente: ex: Av Paulista, 2000"
                    }
                }
                ;
                if (string.IsNullOrEmpty(cidadeUfDestino) || cidadeUfDestino.Split(',').Length != 2)
                {
                    return new ResponseInformacoesRota {
                               Exception = "A cidade de destino deve ser preenchida corretamente, ex: São Paulo, SP"
                    }
                }
                ;
                if (veiculo == null)
                {
                    return new ResponseInformacoesRota {
                               Exception = "As informações do veículo devem ser preenchidas"
                    }
                }
                ;
                if (veiculo.CapacidadeTanque <= 0)
                {
                    return new ResponseInformacoesRota {
                               Exception = "A capacidade do tanque deve ser informada"
                    }
                }
                ;
                if (veiculo.CategoriaVeiculo <= 0)
                {
                    return new ResponseInformacoesRota {
                               Exception = "A categoria do veículo deve ser informada"
                    }
                }
                ;
                if (veiculo.ConsumoMedio <= 0)
                {
                    return new ResponseInformacoesRota {
                               Exception = "O consumo médio do veículo deve ser informado"
                    }
                }
                ;
                if (veiculo.ValorCombustivel <= 0)
                {
                    return new ResponseInformacoesRota {
                               Exception = "O valor do combustível deve ser informado"
                    }
                }
                ;
                //ToDo: Verificar se existe método no webservice que calcula velocidade média da viagem
                if (veiculo.VelocidadeMedia <= 0)
                {
                    return new ResponseInformacoesRota {
                               Exception = "A velocidade média a ser empregada na viagem deve ser informada"
                    }
                }
                ;

                var addressStart = new Address
                {
                    street      = enderecoPartida.Split(',')[0].Trim(),
                    houseNumber = enderecoPartida.Split(',')[1].Trim(),
                    city        = new ServiceAddress.City {
                        name = cidadeUfPartida.Split(',')[0].Trim(), state = cidadeUfPartida.Split(',')[1].Trim()
                    }
                };

                var addressEnd = new Address
                {
                    street      = enderecoDestino.Split(',')[0].Trim(),
                    houseNumber = enderecoDestino.Split(',')[1].Trim(),
                    city        = new ServiceAddress.City {
                        name = cidadeUfDestino.Split(',')[0].Trim(), state = cidadeUfDestino.Split(',')[1].Trim()
                    }
                };

                var addressOptions = new AddressOptions
                {
                    usePhonetic = true,
                    searchType  = 2,
                    resultRange = new ResultRange {
                        pageIndex = 1, recordsPerPage = 1
                    }
                };

                double xPartida = 0;
                double yPartida = 0;
                using (var addressFinderSoapClient = new AddressFinderSoapClient())
                {
                    var findAddressResponse = addressFinderSoapClient.findAddress(addressStart, addressOptions, token);

                    if (findAddressResponse.addressLocation.Count() == 0)
                    {
                        return new ResponseInformacoesRota {
                                   Exception = "O endereço de partida não foi localizado, verifique"
                        }
                    }
                    ;

                    xPartida = findAddressResponse.addressLocation.First().point.x;
                    yPartida = findAddressResponse.addressLocation.First().point.y;
                }

                double xDestino = 0;
                double yDestino = 0;
                using (var addressFinderSoapClient = new AddressFinderSoapClient())
                {
                    var findAddressResponse = addressFinderSoapClient.findAddress(addressEnd, addressOptions, token);
                    if (findAddressResponse.addressLocation.Count() == 0)
                    {
                        return new ResponseInformacoesRota {
                                   Exception = "O endereço de chegada não foi localizado, verifique"
                        }
                    }
                    ;

                    xDestino = findAddressResponse.addressLocation.First().point.x;
                    yDestino = findAddressResponse.addressLocation.First().point.y;
                }

                var originRoute = new ServiceRouteMapLink.RouteStop
                {
                    description = addressStart.street,
                    point       = new ServiceRouteMapLink.Point {
                        x = xPartida, y = yPartida
                    }
                };

                var destinationRoute = new ServiceRouteMapLink.RouteStop
                {
                    description = addressEnd.street,
                    point       = new ServiceRouteMapLink.Point {
                        x = xDestino, y = yDestino
                    }
                };

                var routes = new[] { originRoute, destinationRoute };

                var opcaoRota = DescriptionType.RotaUrbana;
                tipoRota = (int)RouteType.PadraoRapida;
                //Se a cidade for diferente troca o descriptionType para rota rodoviária
                if (!cidadeUfPartida.Trim().Equals(cidadeUfDestino.Trim()))
                {
                    opcaoRota = DescriptionType.RotaRodoviaria;
                }

                var routeOptions = new RouteOptions
                {
                    language     = "portugues",
                    routeDetails = new RouteDetails {
                        descriptionType = (int)opcaoRota, routeType = tipoRota, optimizeRoute = true
                    },
                    vehicle = new Vehicle
                    {
                        tankCapacity       = veiculo.CapacidadeTanque,
                        averageConsumption = veiculo.ConsumoMedio,
                        fuelPrice          = veiculo.ValorCombustivel,
                        averageSpeed       = veiculo.VelocidadeMedia,
                        tollFeeCat         = veiculo.CategoriaVeiculo
                    }
                };

                using (var routeSoapClient = new RouteSoapClient())
                {
                    var getRouteResponse = routeSoapClient.getRoute(routes, routeOptions, token);

                    var result = new ResponseInformacoesRota
                    {
                        TempoTotal              = getRouteResponse.routeTotals.totalTime,
                        DistanciaTotal          = getRouteResponse.routeTotals.totalDistance,
                        CustoCombustivel        = getRouteResponse.routeTotals.totalfuelCost,
                        CustoPedagioCombustivel = getRouteResponse.routeTotals.totalCost
                    };
                    return(result);
                }
            }
            catch (Exception)
            {
                return(new ResponseInformacoesRota {
                    Exception = "Não foi possível processar sua solicitação"
                });
            }
        }
        private RouteCost RequestRouteCost(RouteType routeType)
        {
            _routeDetails = new RouteDetails();
            _routeDetails.descriptionType = Config.DesciptionType;
            _routeDetails.optimizeRoute = true;
            _routeDetails.routeType = Convert.ToInt32(routeType);

            _routeOptions.routeDetails = _routeDetails;

            using (var routeSoapClient = new RouteSoapClient())
            {
                _routeInfo = routeSoapClient.getRoute(GenerateRouteStop(), _routeOptions, _token);
            }

            return new RouteCost
            {
                TotalDistance = _routeInfo.routeTotals.totalDistance,
                TotalFuelCost = _routeInfo.routeTotals.totalfuelCost,
                TotalCostWithToll = _routeInfo.routeTotals.totalCost,
                TotalTimeRote = _routeInfo.routeTotals.totalTime
            };
        }
Exemplo n.º 4
0
        private Rota CalculaRota(Endereco end1, Endereco end2, EnumTipoRota tipoRota)
        {
            var address1 = new Address
            {
                street = end1.NomeRuaAvenida,
                houseNumber = end1.Numero.ToString(),
                city = new ServiceAddressFinder.City { name = end1.Cidade, state = end1.Estado }
            };

            var address2 = new Address
            {
                street = end2.NomeRuaAvenida,
                houseNumber = end2.Numero.ToString(),
                city = new ServiceAddressFinder.City { name = end2.Cidade, state = end2.Estado }
            };

            var afSoa = new AddressFinderSoapClient();
            afSoa.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://services.maplink.com.br/webservices/v3/AddressFinder/AddressFinder.asmx");
            var addressXY1 = afSoa.getXY(address1, token);
            var addressXY2 = afSoa.getXY(address2, token);

            var rSoa = new RouteSoapClient();
            var routes = new[] {
                new RouteStop
                {
                    description = address1.street+ ", "+address1.houseNumber,
                    point = new ServiceRoute.Point { x = addressXY1.x, y = addressXY1.y }
                },
                new RouteStop
                {
                    description = address2.street+ ", "+address2.houseNumber,
                    point = new ServiceRoute.Point { x = addressXY2.x, y = addressXY2.y }
                }
            };
            var routeOptions = new RouteOptions
            {
                language = "portugues",
                routeDetails = new RouteDetails { descriptionType = 0, routeType = (int)tipoRota, optimizeRoute = true },
                vehicle = new Vehicle
                {
                    tankCapacity = 20,
                    averageConsumption = 9,
                    fuelPrice = 3,
                    averageSpeed = 60,
                    tollFeeCat = 2
                }
            };
            var getRouteResponse = rSoa.getRoute(routes, routeOptions, token);
            var rt = getRouteResponse.routeTotals;

            this.CustoCombustivel = rt.totalfuelCost;
            this.CustoComPedagio = this.CustoCombustivel + rt.totaltollFeeCost;
            this.DistanciaTotal = rt.totalDistance;
            this.TotalTempo = rt.totalTime;

            return this;
        }